无法理解 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 来显示它们(右上角,统计按钮旁边)。
我正在尝试在 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 来显示它们(右上角,统计按钮旁边)。