我正在用Unity开发一个简单的2D游戏 Unity
(球打砖头),所以我有一个球,我想发射球来打砖头,现在要发射球,我必须设置为 Velocity
在...上 RigidBody
组件连接到球的GameObject上。
有两种方法可以做到这一点。
方法一:
在Start()方法中设置速度。
private void Start()
{
rb.velocity = direction * speed;
}
方法2.写一个FixedUpdate()方法。
写一个FixedUpdate()的方法,然后在里面放上语句。 因为。
当使用Rigidbody时使用FixedUpdate(Unity)。文件)
private void Start()
{
_setVelocity = true;
}
private void FixedUpdate()
{
if (!_setVelocity) return;
rb.velocity = direction * speed;
rb.angularVelocity = 0;
rb.gravityScale = 0;
_setVelocity = false;
}
但问题是, 我不需要 FixedUpdate()
方法,因为我只在脚本的生命周期内发射一次球,所以在我发射球后,unity会继续运行 FixedUpdate()
方法,并检查 _setVelocity
的价值和 return
因为每次都会是 false
在我第一次射球后。
这将发生在每一个固定的帧率帧,我想这是昂贵的,只设置一次速度。
所以。
FixedUpdate()
方法,检查是否有 false
值,并且每帧都返回?如果有一个FixedUpdate()方法来检查是否有假值,并在每一帧中返回,成本是否很高?
像你这样简单的布尔条件并不贪婪,所以不用担心这个问题。然而,任何一行代码的运行都会降低你的性能。Update()方法本身就比你的 "琐碎 "条件在性能上更贪婪。禁用你的组件脚本或删除对象本身比让它白白运行更优化。只要记住这一点:)
在这种情况下,这两种方法哪种性能更好?
第一个方法更有效,因为你的速度是固定的,所以没有必要使用更新方法(Update()或FixedUpdate())。 你应该在Start()方法中直接初始化刚体的速度,就像你在帖子中做的那样,这样你就可以摆脱布尔值和它的条件。
Unity的文档对刚体和FixedUpdate()非常清楚,但我觉得你误解了某些方面。他们告诉你,如果你想在运行时修改刚体的任何数据,最好使用FixedUpdate()而不是Update()来避免奇怪的行为。
但是为什么要使用FixedUpdate()而不是Update()呢?
因为Update()在每一帧都会被调用,所以如果你的电脑以100帧的速度运行,Update()会被调用100次。如果你的电脑以200帧的速度运行,它将被调用200次。这在某些情况下是有点问题的,特别是当你与物理组件交互时。为了理解这个问题,让我们承认我们想给刚体施加一个力(rb.AddForce(100))。如果你在Update()方法中调用它,而你的pc以100fps的速度运行,你将在一秒钟内施加10000个力。然而,如果你的电脑以50 fps的速度运行,那么你将在一秒钟内施加5000力。这将会导致一些奇怪的行为,而这些行为是可以避免的,这要感谢FixedUpdate(),它以每秒固定的次数被调用 (团结证). 然而,如果你不想修改你的刚体组件,使用FixedUpdate()是没有意义的。他们告诉你 如果您想更新您的刚体组件你应该在FixedUpdate方法中进行,而不是在Update()中进行。
所以对于你的问题,你可以简单的做以下操作。
Awake() {
// getting your components
rb = GetComponent<Rigidbody2D>();
}
Start() {
// initiliaze your components
rb.velocity = direction * speed;
rb.angularVelocity = 0;
rb.gravityScale = 0;
}
希望我帮到你,祝你项目顺利!