当前位置:   article > 正文

unity协程 Start/StopCoroutine() 结束协程和再次启动协程存在的问题和解决方案_unity stopcoroutine

unity stopcoroutine

仅用于记录遇到的问题和解决方案。

快速阅览:

一、结束协程无效:协程方法需要单独存一份private IEnumerator myTest,再开始和结束不直接传入方法名,而是使用这份保存的myTest进行开始和结束。

二、再次开启协程时少跑了几行代码:再次开始同一个方法名的协程时,不是从第一句代码开始执行,而是从上次结束的位置执行,所以如果需要初始化状态,应该单独调用该方法。

详细说明:

启动协程使用StartCoroutine();传入需要使用携程的方法名

具体代码段如下,假设使用协程时需要先初始化部分游戏状态。

  1. public class Controller: MonoBehaviour
  2. {
  3. private void start()
  4. {
  5. StartCoroutine(Test());
  6. }
  7. IEnumerator Test()
  8. {
  9. InitState();
  10. while(true)
  11. {
  12. DoSomething;
  13. yield return new WaitForSeconds(1);
  14. }
  15. }
  16. private void InitState()
  17. {
  18. DoSomething;
  19. }
  20. }

结束携程StopCoroutine(); 直接传入方法名是不可以结束协程的,需要按如下操作记录协程地址,然后再传入Stop方法中。

  1. private IEnumerator myTest;
  2. myTest = Test();
  3. StartCoroutine(myTest);
  4. StopCoroutine(myTest);

最后如果还需要再启动协程,会发现这次代码段没有执行初始化游戏状态的代码,他会接着上次被停止的地方执行,所以初始化状态不应该写在协程内部,而是写在协程外。

完整代码如下

  1. public class Controller: MonoBehaviour
  2. {
  3. private IEnumerator myTest;
  4. private void start()
  5. {
  6. myTest = Test();
  7. InitState(); // 手动初始化状态
  8. StartCoroutine(myTest);
  9. }
  10. private void Update()
  11. {
  12. if (Input.GetKeyDown(KeyCode.A))
  13. {
  14. StopCoroutine(myTest);
  15. }
  16. if (Input.GetKeyDown(KeyCode.B))
  17. {
  18. InitState(); // 初始化状态写在协程开始之前
  19. StartCoroutine(myTest);
  20. }
  21. }
  22. IEnumerator Test()
  23. {
  24. while(true)
  25. {
  26. DoSomething;
  27. yield return new WaitForSeconds(1);
  28. }
  29. }
  30. private void InitState()
  31. {
  32. DoSomething;
  33. }
  34. }

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

闽ICP备14008679号