当前位置:   article > 正文

Unity 协程解读_yield return new waitforsecond

yield return new waitforsecond
  1. StartCoroutine开启一个协程,yield return 是迭代器块返回调用迭代的地方。
  2. Unity对StartCoroutine的解释是:一个协程的执行可以在任何地方用yield语句来暂停,yield return的值决定了什么时候协程恢复执行。协程在协调在几帧中执行的操作时有极大的用处.协程几乎没有任何性能开销。StartCoroutine一般都会立即返回,然而你也可以获得返回结果的值。但是这一步会等到协程结束执行才能生效。
  3. 使用yield语句暂停(pause)协同程序的执行,yield的返回值指定在什么时候继续(resume)协同程序。
  4. yield retun ...
    1. yield return null 暂停协程,等待下一帧继续往下执行。
    2. yield return WaitForFixedUpdate(); 暂停协程,等到下一次调用FixedUpdate方法时再继续往下执行。
    3. yield return new WaitForSeconds(1.0f),暂停协程,等待1秒继续往下执行。
    4. yield return StartCoroutine("SomeCortoutineMethod"); //暂停此协同程序,开启SomeCortoutineMethod协同程序,直到SomeCortoutineMethod执行完再继续往下执行
  5. yield return 的使用。
    1. 一、yeild return null
    2. void Start(){
    3. Debug.Log("start1");
    4. StartCoroutine(Test());
    5. Debug.Log("start2");
    6. }
    7. IEnumerator Test(){
    8. Debug.Log("test1");
    9. yeild return null;
    10. Debug.Log("test1");
    11. }
    12. 运行结果是:strat1 test1 start2 test2
    13. 当被调用函数执行到yield return null(暂停协程,等待下一帧继续执行)时,根据Unity解释协同程序就会被暂停,其实我个人认为他这个解释不够精确,先返回开始协程的地方,然后再暂停协程。也就是先通知调用处,“你先走吧,不用管我”,然后再暂停协程。
    14. 二、yeild return new WaitForSecondes(1.0f)
    15. void Start(){
    16. Debug.Log("start1");
    17. StartCoroutine(Test());
    18. Debug.Log("start2");
    19. }
    20. IEnumerator Test(){
    21. Debug.Log("test1");
    22. yeild return new WaitForSecondes(1.0f);
    23. Debug.Log("test1");
    24. }
    25. 运行结果是:strat1 test1 start2 test2(test2等待三秒后打印出来)
  6.  yield turn 示例
    1. IEnumerator Init()
    2. {
    3. yield return StartCoroutine(init1());
    4. Debug.Log("init1 finish");
    5. yield return StartCoroutine(init2());
    6. Debug.Log("init2 finish");
    7. yield return StartCoroutine(init3());
    8. Debug.Log("init3 finish");
    9. }
    10. IEnumerator init1()
    11. {
    12. // 模拟初始化
    13. yield return new WaitForSeconds(2);
    14. }
    15. IEnumerator init2()
    16. {
    17. // do somthing..
    18. yield return new WaitForSeconds(2);
    19. }
    20. IEnumerator init2()
    21. {
    22. // do somthing..
    23. yield return new WaitForSeconds(2);
    24. }
    25. 这样调用能保证,init1,init2,init3一个一个的执行,不至于出现后面执行的代码引用一个前面未初始化的变量
    26. void Start () {
    27. Debug.Log("start1");
    28. StartCoroutine(Test());
    29. Debug.Log("start2");
    30. }
    31. IEnumerator Test()
    32. {
    33. Debug.Log("test1");
    34. yield return StartCoroutine(DoSomething());
    35. Debug.Log("test2");
    36. }
    37. IEnumerator DoSomething()
    38. {
    39. Debug.Log("load 1");
    40. yield return null;
    41. Debug.Log("load 2");
    42. }
    43. 执行结果:start1 test1 load1 start2 load2 test2
    44. 这种StartCoroutine中嵌套一个yield return StartCoroutine,第一个StartCoroutine会等到第二个StartCoroutine中所有代码结束后再继续执行,而第二个StartCoroutine中的yield语句会先返回第一个,然后立即返回他的调用处,也就是调用处会继续执行,而第一个StartCoroutine会等待第二个执行完再继续执行。

     

 7、yield return 注意的地方

  1. IEnumerator Queue()
  2. {
  3. for (int i = 0; i < activity.Count; i++)
  4. {
  5. PlayerControl pc = activity[i];
  6. yield return CoroutineManger.GetInstance().StartCoroutine(pc.Target1());
  7. //当AtkTarget1的协程耗时较大时,没有执行完AtkTarget1中的协程就可能就执行AtkTarget2
  8. yield return CoroutineManger.GetInstance().StartCoroutine(pc.Target2());
  9. //直到AtkTarget2中的协程才执行执行AtkTarget3
  10. yield return CoroutineManger.GetInstance().StartCoroutine(pc.Target3());
  11. }
  12. }
  13. public IEnumerator Target1()
  14. {
  15. CoroutineManger.GetInstance().StartCoroutine(A1());
  16. CoroutineManger.GetInstance().StartCoroutine(A2());
  17. }
  18. public IEnumerator Target2()
  19. {
  20. yield return CoroutineManger.GetInstance().StartCoroutine(A1());
  21. yield return CoroutineManger.GetInstance().StartCoroutine(A2());
  22. _temp.Clear();
  23. }
  24. public IEnumerator Target3()
  25. {
  26. yield break;
  27. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/95614
推荐阅读
相关标签
  

闽ICP备14008679号