-1

我想将 2dgameobject 转向目标 2dgameobject 我有一个方法 - 旋转到目标。代码:

Quaternion rawRoation = Quaternion.Slerp(transform.rotation,
            Quaternion.LookRotation(Player.GetComponent<Transform>().position - transform.position),
            10*Time.deltaTime);
transform.rotation = new Quaternion (0, 0, rawRoation.z, rawRoation.w);

问题 - 当目标的 position.x < this.object.transform.position.x(1) - 旋转中断.. else(2) - 好的。

1 - 在此处输入图像描述

2 -在此处输入图像描述

4

1 回答 1

0

问题是这行代码: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 中你不能做这样的旋转。

你必须选择:

  1. 如果您的相机从侧面看并且您的对象可以颠倒使用您修改的代码,并且如果目标 x 位置较小,则还将 x 比例设置为 -1。

  2. 如果您的相机从上往下看,请使用以下代码:

倒置视图的代码:

// 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);
}
于 2020-10-24T13:00:36.093 回答