我有轮换问题; rotationtoToTarget;

时间:2020-10-24 12:36:04

标签: c# unity3d

我要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);

问题-目标位置x

1- enter image description here

2-{{​​3}}

1 个答案:

答案 0 :(得分:1)

问题是这行代码: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:

您的代码无法正常工作,因为您处于2D状态。如果要在3D模式下查看x位置小于对象位置的目标,则必须绕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);
}