unity3d 在2D空间中让一个点注视另一个点

最近用unity3d在写一个小功能时遇到的问题,就是在2D空间里,怎么让一个点注视另一个在空间里的点。
效果跟unity在3D空间里提供的一个方法叫 transform.LookAt(target); 类似。

lookat 有个挺不爽的地方,比如我想让一个点以插值移动的方式朝向另一个点,这个插值的角度没法控制,lookat会直接朝向那个点,就没插值的效果了,而且也无法判断出往哪个方向旋转最快。
然后发现了这个方法,贴出来给需要的小伙伴,造福大家 (ง •̀_•́)ง

图示:
unity3d 在2D空间中让一个点注视另一个点_第1张图片

代码:

public class Test : MonoBehaviour
{
    public Transform target;

    // Use this for initialization
    void Start()
    {
        // 世界坐标系转到本地坐标系
        Vector3 relative = transform.InverseTransformPoint(target.position);
        // 归一化(并不是必须的)
        relative.Normalize();

        // 反正切求弧并转成角度
        float angle = Mathf.Atan2(relative.x, relative.y) * Mathf.Rad2Deg;
        angle = Mathf.Abs(angle);

        // 左右2侧的垂直向量
        Vector3 leftVertical = new Vector3(-1, 0, 0);
        Vector3 rightVertical = new Vector3(1, 0, 0);
        // 跟目标向量做点积
        float leftDot = Vector3.Dot(relative, leftVertical);
        float rightDot = Vector3.Dot(relative, rightVertical);

        // >= 0 说明夹角 <= 90
        if (leftDot >= 0)
        {
            transform.Rotate(0, 0, angle);
        }
        else if (rightDot >= 0)
        {
            transform.Rotate(0, 0, -angle);
        }
        else
        {
            Debug.LogError("dot有问题");
        }
    }
}

你可能感兴趣的:(Unity,unity3d,2d)