我如何找到具有 Y 轴偏移的对象的中心以找到顶面上的中心?

How would i find the center of an object with a Y axis offset to find the center on the top face?

我正在尝试制作一个攀爬系统(玩家爬到立方体的顶部)。我正在使用 collider.bounds.center 来获取对象的中心,但是我需要做什么才能使中心位于对象的顶面上?

感谢您的帮助!

定义顶面;)

对于默认的立方体,它将是例如

theCube.transform.position + theCube.transform.up * theCube.transform.lossyScale.y / 2f

在立方体旋转的情况下,它总是采用“顶”面:

public class Example : MonoBehaviour
{
    public Transform target;

    private void Update()
    {
        transform.position = target.position + target.up * target.lossyScale.y / 2f;
    }
}

如您所见,球体始终位于立方体顶面的中心(球体附有此脚本,立方体在 target 中引用)


编辑

如果您想根据命中的边找到顶面边缘的中心。

这有点复杂。这里的思路是:

  • 获取顶面的四个角位置
  • 得到离你的光线投射命中点距离最近的两个角
  • 获取这条“边”的中心

类似

public class Example : MonoBehaviour
{
    [SerializeField] private Transform target;
    [SerializeField] private Renderer _renderer;
    [SerializeField] private Camera _camera;

    private void Start()
    {
        if (!_camera)
        {
            _camera = Camera.main;
        }

        if (!_renderer)
        {
            _renderer = GetComponent<Renderer>();
        }
    }

    private void Update()
    {
        if (!target)
        {
            return;
        }

        if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out var hit))
        {
            if (hit.collider is BoxCollider boxCollider)
            {
                var verts = GetCubeVertices(boxCollider);

                // Find the two verts with smalles distance from the hit point
                var sortedVerts = verts.OrderBy(v => Vector3.Distance(v, hit.point)).Take(2).ToArray();
                // Find the center between these two verts
                var targetPosition = (sortedVerts[0] + sortedVerts[1]) / 2f;

                transform.position = targetPosition;
                _renderer.enabled = true;
            }
            else
            {
                _renderer.enabled = false;
            }
        }
        else
        {
            _renderer.enabled = false;
        }
    }

    // Get the 4 vertices of the top cube face
    private Vector3[] GetCubeVertices(BoxCollider col)
    {
        var trans = col.transform;
        var min = col.center - col.size * 0.5f;
        var max = col.center + col.size * 0.5f;

        return new[]
        {
            trans.TransformPoint(new Vector3(min.x, max.y, min.z)),
            trans.TransformPoint(new Vector3(min.x, max.y, max.z)),
            trans.TransformPoint(new Vector3(max.x, max.y, min.z)),
            trans.TransformPoint(new Vector3(max.x, max.y, max.z))
        };
    }
}