我有一个带倒数计时器的PowerUp。对于计时器我使用InvokeRepeating。但我也可以使用StartCoroutine。
那么选择哪一个?我真的没有区别......
这是我的代码:
float powerUpDuration = 5; // the duration of the buff
float slowMotionTimeScale = 0.5f; // slow down the player by 0.5
float defaultTimeScale = 1; // the normal game speed
private void OnTriggerEnter(Collider collision) // player colliding with powerUp
{
if (collision.gameObject.tag == "Player")
{
Time.timeScale = slowMotionTimeScale; // time gets slowed
Time.fixedDeltaTime = Time.fixedDeltaTime * Time.timeScale; // smooth slow down
InvokeRepeating("SpeedManager", 0, 1); // start countdown
}
}
void SpeedManager()
{
if (powerUpDuration > 0) // count to 0
{
powerUpDuration--;
}
else // stop countdown, set timespeed to default
{
CancelInvoke("SpeedManager");
Time.timeScale = defaultTimeScale;
powerUpDuration = 5; // reset timer
}
}
答案 0 :(得分:2)
InvokeRepeating()
允许您以设定的间隔调用某些内容。
StartCoroutine()
允许您fade-wait-unfade
并继续等等。
因此,使用哪一个并没有太大的区别。但是,当您需要的功能发生变化时,它可能会发生变化。
但是,如果您不需要在函数中执行某些fade-wait-unfade
内容,请考虑它通常更适合于Unity的许多Update()
函数中的一个。
InvokeRepeating()
internaly使用反射,其中99.99%的场景比使用更新版本更慢。
决定哪种更新最适合功能
Update
:输入,翻译/旋转(非物理)
FixedUpdate
:物理
LateUpdate
:相机移动,动画
答案 1 :(得分:2)
如上所述here:
InvokeRepeating更容易学习和使用,但显然只能 定期做事。任何奇怪的多步骤,淡入淡出等待 东西,你必须使用协程(不是因为规则 - 因为没有办法扭转InvokeRepeat做那些事情。)我会的 比如,任何你可以使用InvokeRepeating的东西,继续这样做。
我猜InvokeRepeating实际上只是运行StartCoroutine 为你,免费的“每X秒”延迟。所以它真的没有 你使用的差异。