当前位置:   article > 正文

Unity——延时执行的几种方法_unity延迟执行下一行代码

unity延迟执行下一行代码

1.什么是延迟函数

延时执行的函数,可以自己设定延时要执行的函数和具体延时的时间,是Monobehaviour基类中实现好的方法

1.Update定时器

在Update等刷新函数内计时,timer += Time.deltaTime 当时间达到预期,执行需要延时的方法。需要注意的是,增量时间Time.deltaTime是每帧都不同的浮点数。计时器不能用 == 去判断达成条件。需要用 > 或 >= 加一个标志位。以确保函数能执行到且只执行一次 Update在 Time.timeScale = 0 时会正常执行,但这时Time.deltaTime的值为0。

  1. public class Test : MonoBehaviour
  2. {
  3. public float timer = 0f;
  4. void Update()
  5. {
  6. timer += Time.deltaTime;
  7. if (timer >= 2)
  8. {
  9. Func();
  10. timer = 0f; // 定时2秒
  11. }
  12. }
  13. void Func()
  14. {
  15. Debug.Log("每2秒执行一次");
  16. }
  17. }

2.Invoke函数

Invoke是MonoBehaviour提供的函数,可以延时调用函数,但是,Invoke的调用是在运行时生效的,对于Func函数,很容易导致在代码审查阶段被误杀—函数删除后,编译不会报错。Invoke支持重复调用: InvokeRepeating("方法名",延时时长,每次调用间隔时长)

  1. public class Test : MonoBehaviour
  2. {
  3. private float delayTime = 2;
  4. private void Start()
  5. {
  6. Invoke("Func", delayTime);
  7. //InvokeRepeating("DelayFunc",delayTime,cdTime);
  8. }
  9. private void Func()
  10. {
  11. Debug.Log("延迟2s执行该函数");
  12. }
  13. }

取消延时函数: 

  1. //取消延迟函数
  2. //取消该脚本上的所有延时函数执行
  3. CancelInvoke();
  4. //指定函数名取消
  5. //只要取消了指定延迟 不管之前该函数开启了多少次 延迟执行 都会统一取消
  6. CancelInvoke(nameof(DelayDoSomething));

3.协程 Coroutine

协程本质是迭代器

  1. public class Test : MonoBehaviour
  2. {
  3. private void Start()
  4. {
  5. StartCoroutine(Show());
  6. }
  7. private IEnumerator Show()
  8. {
  9. yield return new WaitForSeconds(2);
  10. Func();
  11. }
  12. private void Func()
  13. {
  14. Debug.Log("延时2s执行");
  15. }
  16. }

4.DoTween 方法实现

DoTween函数中提供了一个方法dotween.to函数

  1. /// <summary>
  2. /// DOTweenTo延时回调
  3. /// </summary>
  4. /// <param name="delayedTimer">延时的时间</param>
  5. /// <param name="loopTimes">循环次数,0:不循环;负数:无限循环;正数:循环多少次</param>
  6. public void DOTweenToTest(float delayedTimer, int loopTimes)
  7. {
  8. float timer = 0;
  9. //DOTwwen.To()中参数:前两个参数是固定写法,第三个是到达的最终值,第四个是渐变过程所用的时间
  10. Tween t = DOTween.To(() => timer, x => timer = x, 1, delayedTimer)
  11. .OnStepComplete(() =>
  12. {
  13. print("调用函数");
  14. })
  15. .SetLoops(loopTimes);
  16. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/89799
推荐阅读
相关标签
  

闽ICP备14008679号