Unity 延迟执行的5种方式

方法一、Update每帧检测时间

写法复杂,可读性差。方法1适合需要同步显示时间的场合

private float timer= 3f;
bool flag =true;

void Update()
{
    if(!flag) return;
    
    if(timer<0)
    {
        flag =false;
        //执行逻辑
    }
    else
    {
        timer-=Time.deltaTime;
    }
    
}

public float coldTime;  
public void DelayDestroy3()  
{  
if (coldTime > 0)  
{  
coldTime -= Time.deltaTime; //如果coldTime大于零 就减去deltaTime  
//deltaTime返回一个数值 1/帧率 如当前是50帧 则返回1/50  
//如果使用FixedUpdate可以用Time.fixedDeltaTime  
}  
else  //(coldTime<0》)若时间不大于0 即计时结束 则执行代码块  
{  
//Scripts here  

}  
}

方法二、Invoke

方法2适合简单的延迟场合

1.延迟执行函数

pubic float delayTime;
void Start()
    {        
        Invoke("Explode", delayTime);        
    }


void Explode()
    {
        anim.SetTrigger("explode");
    }

2.重复延迟执行函数

InvokeRepeating("Explode",delayTime,intervalTime)

  1. 参数一:函数名

  2. // 参数二:第一次执行的延迟时间

  3. // 参数三:之后每次执行的间隔时间

3.取消延迟函数

CancelInvoke("Explode");

只要取消了指定延迟 不管之前该函数开启了多少次 延迟执行 都会统一取消

4.判断是否有延迟函数

if (IsInvoking("Explode"))

{

        print("存在延迟函数");

}

方法三、协程

使用协程,配合WaitForSeconds,可控性更高,可以直接传参。方法3适合较为复杂的延迟场合

void()
{
    StartCoroutine(DelayMethod(3));
}

IEnumerator DelayMethod(float delayTime)
{
    //受到TimeScale影响
    yield return new WaitForSeconds(delayTime);

    //不受到TimeScale影响
    yield return new WaitForSecondsRealTime(delayTime);

} 

方法四、DoTween动画插件

方法4适合UI动画场合(配合其他功能一起使用)

void Start ()
{
    var seq= DOTween. Sequence ();
    seq.AppendInterval (3f);
    seq.AppendCallback(()=>{ DelayFunc(8); });
    seq.SetAutoKill (false);
    // seq. SetUpdate (true);//不受Time.timeScale影响
}

void DelayFunc(float diff)
{
    //执行逻辑
}

方法五、UnityTimer(github上开源项目)

方法5可以自行尝试,不觉得能平替所有方法

void Start()
{
    Timer.Register (3f, () => //执行逻辑);
}

akbiggs/UnityTimer:功能强大且方便的库,用于在 Unity3D 中延迟后运行操作。 (github.com)

总结

  • 方法1适合需要同步显示时间的场合
  • 方法2适合简单的延迟场合
  • 方法3适合较为复杂的延迟场合
  • 方法4适合UI动画场合(配合其他功能一起使用)
  • 方法5可以自行尝试,不觉得能平替所有方法

你可能感兴趣的:(Unity,unity,游戏引擎)