优化Unity代码 - InvokeRepeating / StartCoroutine

时间:2016-11-10 16:00:09

标签: c# unity3d

我有一个带倒数计时器的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
            }
    }

2 个答案:

答案 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秒”延迟。所以它真的没有   你使用的差异。