问题是这行代码:transform.rotation = new Quaternion (0, 0, rawRoation.z, rawRoation.w);
我不知道你想要实现什么,但如果你想取消 x 和 y 旋转使用:
transform.rotation = Quaternion.Euler(0.0f, 0.0f, rawRoation.eulerAngles.z);
您的代码的作用示例:
// Start is called before the first frame update
void Start()
{
Quaternion q1 = new Quaternion(0.3f, 0.7f, 0.4f, 0.5f);
Quaternion q2 = new Quaternion(0.0f, 0.0f, 0.4f, 0.5f);
Debug.Log(q1.eulerAngles);
Debug.Log(q2.eulerAngles);
}
这里的输出:
q1: (344.8, 100.3, 59.1)
q2: (0.0, 0.0, 77.3)
请看一下四元数的数学
编辑 - 2D LookAt:
你的代码不能像你想要的那样工作,因为你是二维的。如果您想查看 x 位置小于对象在 3D 中的目标,则必须围绕 y 轴旋转 180 度,这在 2D 中不是有效旋转。你不能。您执行此 y 旋转以防止对象倒置。但在 2D 中你不能做这样的旋转。
你必须选择:
如果您的相机从侧面看并且您的对象可以颠倒使用您修改的代码,并且如果目标 x 位置较小,则还将 x 比例设置为 -1。
如果您的相机从上往下看,请使用以下代码:
倒置视图的代码:
// Update is called once per frame
void Update() {
Vector3 targetDir = target.position - transform.position;
float angle = Mathf.Atan2(targetDir.y, targetDir.x) * Mathf.Rad2Deg;
Quaternion q = Quaternion.AngleAxis(angle, Vector3.forward);
transform.rotation = Quaternion.Slerp(transform.rotation, q, Time.deltaTime * 10);
}