该Unity脚本使gameObject围绕对象旋转。怎么样?

时间:2019-12-14 20:48:33

标签: c# unity3d

下面的代码来自Unity's tutorial on Quaternions。如果您复制/粘贴代码,它将使您的对象围绕目标飞行。我的问题是:为什么?为什么会导致此结果?当我只使用transform.RotateAround()时,为什么要这样做呢?请注意,如果您稍微更改代码,其行为将完全不同。例如,如果我将3更改为-3,则该对象就会消失。

    public Transform target;

    void Update()
    {
        Vector3 relativePos = target.position - transform.position;
        Quaternion rotation = Quaternion.LookRotation(relativePos);

        Quaternion current = transform.localRotation;

        transform.localRotation = Quaternion.Slerp(current, rotation, Time.deltaTime);
        transform.Translate(0, 0, 3 * Time.deltaTime);
    } 

1 个答案:

答案 0 :(得分:1)

首先是给定的。

relativePos是从目标到目标的向量方向。 LookRotation是一个函数,该函数从您希望对象面对的向量中得出QuaternionSlerp在两个旋转之间进行球面内插旋转,这意味着它从给定旋转平滑地旋转到另一个旋转。

现在开始解释。

由于transform.Translate绕着目标旋转,如果没有它,您的对象将旋转以面向目标(由于LookRotation)在其自身轴上不动。在tranform.Translate中,第三个参数(3 * Time.deltaTime)表示将对象沿其z轴向前移动3个单位/秒,因此它会消失,因为它一直试图在z轴上移动3个单位/秒,但是{ {1}}不断将其拉动,使其向目标旋转,因此Slerp将其移动,而tranform.Translate则将其旋转回到目标,从而导致绕行轨道。

您不能仅使用Slerp,因为

  1. 您将无法配置对象面对对象时将围绕目标旋转的方式。您可以将其与transform.RotateAround()结合使用,但是在transform.LookAt()以上的代码上会产生一些抖动效果,而球面插值旋转实际上意味着旋转更平滑且抖动更少。
  2. 您将无法使用Slerp指定旋转半径

该对象逃逸,因为在transform.Translate中,第三个参数(3 * Time.deltaTime)表示将对象沿其z轴向前移动3个单位/秒,而-3则向后移动该对象,因此它逃跑了,但是如果您靠近它仍然面对目标。借助tranform.TranslateLookRotation功能,它沿面向目标的方向向后移动,而不是在Z轴上移动。

如果您还有其他问题/需要更多诉状,我希望这能很好地解释您的问题,我会尽快回复您。