我所做过的系统,分单机版系统(2005年)、CS系统(2010年)、实时系统(2015年),各个系统均有“延时”功能:定时调度的; 本博客说的是实时系统中的延时功能(基于unity3D游戏引擎)。
 

 
在unity3d中,新建的脚本会默认继承MonoBehaviour,其中Update函数会被引擎自动调度,如在我的电脑上,Update函数被调用的周期为0.012s。

那么Unity3d中,仅有通过Update函数来实现延时功能吗?  还有无其他的实现呢?
 

怎么才能让一个界面只显示1秒之后 然后再执行其他的操作~
比如 游戏的胜利界面 只让他显示一秒 然后执行其他操作 

 

答案是有的,下面就用过的几种延时功能(定时器)一一列出来:


下面的几个例子,我们在ShowA函数中,延时5s调用ShowB函数,通过代码看看各个实现方法的异同。
为了方便,我仅截取部分关键代码,是否继承MonoBehaviour等自行添加即可。

 

  • Update函数 实现定时器
    float m_timer = 0; 
        void Update () 
        { 
            m_timer += Time.time; 
            if (m_timer >= 5) 
            { 
                ShowB();
                m_timer = 0; 
            }
        } 
        
        private void ShowB() 
        {
        }
  • Update函数实现定时器,几乎是学习Unity3D必修的功课。 但是,在实战项目中需要维护m_timer这个变量,且从设计角度看,代码写得有些不整齐。

 

  • Invoke函数 实现定时器
    GameController.Get().CancelInvoke();
    GameController.Get().Invoke("ShowB", 5f);
    private void ShowB()
    {
    game.ShowCardInTurn();
    }
  • Invoke是MonoBehaviour提供的函数,可以延时调用函数,且可以通过CancelInvoke控制调度器的停止。 但是,Invoke的调用是在运行时生效的,对于ShowB函数,很容易导致在代码审查阶段被误杀—函数删除后,编译不会报错,你可能会误认为这个函数是废弃的函数。

 

  • Coroutine 协成 实现定时器
    private IEnumerator ShowA() 
        { 
            yield return new WaitForSeconds(5);
            ShowB(); 
        } 
        
        private void ShowB() 
        {
        }
    使用协成的WaitForSeconds可以实现定时器,使用起来比较简单。