在 Unity 中旋转对象时,脚本不会在 Z 轴上旋转对象,仅在 X 和 Y 轴上旋转?

When rotating an object in Unity, the script doesn't rotate the object on the Z-axis, only the X and Y?

我有一个矩形立方体,需要放置在另外两个物体之间,它会适当旋转,以便每一端都面向这两个物体。由于这发生在球形世界上,问题在于当我尝试将其对齐以正确面向“向上”时。我以前没有意识到这一点,但是这段代码(它适用于其他对象,因为它们只需要定向一次)只使用 X 轴和 Y 轴。我可以通过在编辑器中修改 Z 轴来手动正确定位它们,所以我知道这是可能的,但由于它们必须按程序创建,这显然是不可行的。从 transform.up 更改为向下或向右完全没有任何变化。

在下面的代码中,parent 是它必须朝向的对象之一(它做得很好),target 是球体的中心。

理论上对齐两侧的物体应该只需要使用X和Y轴,而对齐球体的中心则只需要使用最后一行表示的Z轴代码,但在实践中这不起作用,因为两种对齐方式都只想使用 X 轴和 Y 轴而忽略 Z 轴。

        Vector3 parentDirection = parent.transform.position - transform.position;
    Vector3 targetDirection = target.position - transform.position;

    Vector3 DirectionToParent = Vector3.RotateTowards(transform.forward, parentDirection, 100f, 0.0f);
    Vector3 CenterDiretion = Vector3.RotateTowards(transform.forward, targetDirection, 100f, 0.0f);

    Quaternion ParentRotation = Quaternion.LookRotation(DirectionToParent );
    Quaternion CenterRotation = Quaternion.LookRotation(CenterDiretion );

    transform.rotation = Quaternion.Euler(DirectionToParent.eulerAngles.x, DirectionToParent.eulerAngles.y, newRotation.eulerAngles.z);

问题中显示的代码不起作用,因为它在计算 transform.rotation 时没有考虑 to/away 行星中心的方向。

相反,我建议只使用 Quaternion.LookRotation 来分配旋转,该旋转会产生您在 parentDirection 中所拥有的正向,并且最接近地球的向上方向。

Vector3 upDirection = transform.position - target.position;
transform.rotation = Quaternion.LookRotation(parentDirection, upDirection);

如果您需要根据某个最大速度更改旋转,只需将 Quaternion.LookRotation 的结果分配给变量,将 transform.rotationQuaternion.RotateTowards 分配给 transform.rotation 根据需要:

private float turnVelocity = 100f;

// ...

Vector3 upDirection = transform.position - target.position;

Quaternion goalRot = Quaternion.LookRotation(parentDirection, upDirection);
transform.rotation = Quaternion.RotateTowards(transform.rotation, goalRot, 
            turnVelocity * Time.deltaTime);
}