无法理解Unity3d飞行脚本

时间:2015-09-07 21:23:07

标签: unity3d unityscript

我正在尝试在Unity3d中进行飞行模拟。首先我使用了rigidbody.addforce(),但是机芯在旋转方面反应不佳所以我期待Unity3d样本,并尝试使用他们的代码来控制飞机。它工作得很好但我无法理解它是如何工作的。代码是这样的:

var newVelocity = Vector3.Lerp(rig.velocity, 
                               -transform.forward * EnginePower,
                               EnginePower * Time.deltaTime);

Debug.Log("Velocity:     " + rig.velocity + 
          "Forward:      " + -transform.forward * EnginePower + 
          "Vector3.Lerp: " + Vector3.Lerp(rig.velocity, -transform.forward * EnginePower, EnginePower * Time.deltaTime));

rig.velocity = newVelocity;

此代码位于Update()函数中,我对其进行了测试,并尝试将其设置为Start(),飞机正在移动,但没有响应旋转。我试图调试,看看有什么变化,事情是没有什么变化那么多。

我无法理解它是如何运作的。

1 个答案:

答案 0 :(得分:0)

你应该在你的Update()函数中调用它,因为它应该在每一帧运行。 Vector3.Lerp()在两个3D矢量(documentation)之间执行线性插值

该函数的第一个参数,我们称之为矢量A,rig.velocity,是你飞机的当前速度。 -transform.forward * EnginePower,向量B,是您的向后方向,与您的发动机功率相比 - 可能与用户输入(燃气表)相关。

我不确定为什么transform.forward-相反,但lerp的作用是返回一个新的向量,从向量A到向量B,用因子缩放。如果因子为0,则返回向量A.如果因子为1,则返回Vector B.

在您的代码中,比例为EnginePower * Time.deltaTime,其中Time.deltaTime是自上一帧以来的秒数 - 如果您运行60 FPS,则为0.016秒。所以,你可以理解,比例变得非常小,因此Lerp返回一个非常接近你当前速度的矢量,但是对于矢量B来说却是如此轻微。下一帧,它可以扩展一点,更多一点我希望这可以提高你的理解力。

您可以使用Debug.DrawLine()绘制矢量,使用它:

 Debug.DrawLine(transform.position, rig.velocity, Color.red);
 Debug.DrawLine(transform.position, -transform.forward * EnginePower, Color.green);

这将绘制两条线,表示您传递给Lerp的矢量。这些线是小玩意,所以一定要在编辑器窗口中打开小控件以显示它们(右上角,统计按钮旁边)。