最近用unity3d在写一个小功能时遇到的问题,就是在2D空间里,怎么让一个点注视另一个在空间里的点。
效果跟unity在3D空间里提供的一个方法叫 transform.LookAt(target); 类似。
lookat 有个挺不爽的地方,比如我想让一个点以插值移动的方式朝向另一个点,这个插值的角度没法控制,lookat会直接朝向那个点,就没插值的效果了,而且也无法判断出往哪个方向旋转最快。
然后发现了这个方法,贴出来给需要的小伙伴,造福大家 (ง •̀_•́)ง
代码:
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有问题");
}
}
}