应该在 Start、Update 或 FixedUpate 函数中对刚体添加力

Posted

技术标签:

【中文标题】应该在 Start、Update 或 FixedUpate 函数中对刚体添加力【英文标题】:Should force be added force to Rigidbody in the Start, Update or FixedUpate function 【发布时间】:2019-01-09 02:06:12 【问题描述】:

我是 Unity 新手。

我有Rigidbody2D,我想在我的播放器中添加常量velocity。 我想知道在StartUpdate(或FixedUpate)中将速度应用于Rigidbody2D 时有什么区别或优点/缺点或基本实践

当我在开始时应用速度一切正常,那么为什么我们每帧都添加速度(Update 方法)?

【问题讨论】:

【参考方案1】:

我想为我的播放器添加恒定速度。

Start 函数在这种情况下被消除,因为它仅在脚本是 GameObject 并启用脚本时被调用一次。如果您需要一遍又一遍地施加力,那么Start 函数不是您应该使用的。

Update 函数用于每帧执行任何操作。例如,每帧手动移动对象。

FixedUpdate 函数用于对Rigidbody 执行某些操作,这包括在每个固定帧向其添加力。这是您需要使用的,因为您正在对 Rigidbody 对象执行操作。

您没有提到的另一个是LateUpdate 函数。当您想让 GameObject 跟随相机时使用此选项,因为它是在调用所有 Update 函数之后调用的。


Unity 还有一个ConstantForce 实用程序,可以简化向Rigidbody 添加恒力的过程。有了它,您可以在Start 函数中向ConstantForce 添加一次力,然后它会处理其余的,直到您更改力为止。

ConstantForce2D cForce = targetObj.GetComponent<ConstantForce2D>();
cForce.force = new Vector2(0, 100);

【讨论】:

但是当我在 Start 方法上添加速度(而不是 addForce)时一切正常,我的播放器正在移动,然后我为相机跟随制作脚本。所以我猜开始方法工作得很好,因为速度不应该需要添加每一帧它的速度,而不是恒定变量。 您没有添加速度。您正在设置速度,它会在不考虑当前力的情况下设置新力。它不是恒定的力量。 它最终会停止。你这么认为的原因是你给刚体增加了很大的力。如果你向它添加一个微小的力,你会看到它会因为阻力和重力而尽快开始减速。如果您想要恒定的力,请使用我提到的ConstantForce 组件并在Start 函数中执行,或者在FixedUpdate 函数中使用AddForce 手动执行。

以上是关于应该在 Start、Update 或 FixedUpate 函数中对刚体添加力的主要内容,如果未能解决你的问题,请参考以下文章

在 django 中,我应该将执行 create_if_missing 或 update_if_exists 函数的方法放在哪里?

Tip8:Unity中诸如 Awake() Start() Update()等函数的 执行顺序

Java Web Start:自 Java 8 Update 111 以来无法通过代理隧道

如何正确继承Unity的回调函数,如Awake(),Start()和Update和FixedUpdate()?

将 POST 用作 UPDATE 或 CREATE 时是不是违反了 RESTful

我应该在 Oracle Update 语句中使用 Too Many Rows Error 作为例外子句吗?