无法理解 Unity3d 飞行脚本

Can't understand Unity3d Flight Script

我正在尝试在 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(),飞机在动,但没有响应旋转。我尝试调试并查看有什么变化,问题是没有什么变化如此之大。

我只是不明白它是如何工作的。

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

函数的第一个参数,我们称之为矢量 A,rig.velocity,是飞机的当前速度。 -transform.forward * EnginePower,向量 B,是你的向后方向缩放到你的引擎功率 - 这可能连接到用户输入(油量表)。

我不确定为什么 transform.forward- 颠倒了,但是 lerp 做的是 return 一个新的向量,从向量 A 到向量 B,用一个因子缩放.如果因子为 0,则矢量 A 为 returned。如果因子为 1,则矢量 B 为 returned。

在您的代码中,比例是 EnginePower * Time.deltaTime,其中 Time.deltaTime 是自上一帧以来的时间(以秒为单位)- 如果您 运行ning 60 FPS,则为 0.016 秒。所以,你可以理解,比例变得非常小,所以 Lerp return 是一个非常接近你当前速度的矢量,但稍微靠近矢量 B。下一帧,它缩放得更多,还有更多等等。我希望这能提高你的理解。

您可以使用 Debug.DrawLine() 来绘制您的矢量,像这样使用它:

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

这将绘制两条线,代表您传递给 Lerp 的向量。这些行是 gizmos 所以一定要在编辑器中打开 gizmos window 来显示它们(右上角,统计按钮旁边)。