当前位置:   article > 正文

Unity中协程(IEnumerator)使用方法+停止方法+协程start前需要判断其是否开启了,否则协程会不断地叠加

ienumerator

目录

1、目的

1.1 想知道:Unity中协程(IEnumerator)的使用方法介绍

2、参考

2.1 Unity中协程(IEnumerator)的使用方法介绍

2.2 Unity3D协程介绍 以及 使用

2.3 Unity 协程之三种分析解决StopCorotine终止不了

3.注意:

3.1 物体隐藏时候,协程关闭了,所以物体隐藏时候需要注意协程的开关

3.2 如操作3:协程start前需要判断其是否开启了,否则协程会不断地叠加(即:开启协程前,将之前已经开启的给关闭)

3.3 如操作4:发现StopCoroutine(ie_StopRecorder)不如 StopCoroutine("IE_StopRecorder"),所以还是使用StopCoroutine("IE_StopRecorder")比较好

3.4 使用此方法可以开启、关闭线程(比输入字符串函数比较好,因为可以搜到那些地方调用了此协程)

四.操作:1:开启、关闭协程+有传递参数的:成功

四.操作:2:完成:简单的完成延迟启动

四.操作:3:协程start前需要判断其是否开启了,否则协程会不断地叠加

1.错误的演示一遍:当我按下多次R按键,会发现Cube运行的越来越快

1.1 运行结果:当我不断按下R按键,cube会移动的越来越快,

 1.正确的演示:弄一个bool变量控制协程是否已经开启了(因为查阅API,发现协程没有提供是否正在运行的变量,所以只好自己创建一个变量)

1.1 不断地按下R按键,也只会开启一次协程

四.操作:4:StopCoroutine(ie_StopRecorder)不如 StopCoroutine("IE_StopRecorder")

1.StopCoroutine(ie_StopRecorder)发现没有执行协程

1.StopCoroutine("IE_StopRecorder")发现可以执行协程


1、目的

1.1 想知道:Unity中协程(IEnumerator)的使用方法介绍

2、参考

2.1 Unity中协程(IEnumerator)的使用方法介绍

Unity中协程(IEnumerator)的使用方法介绍_悲欢离合的博客-CSDN博客

  • 总结:good:适合多看

2.2 Unity3D协程介绍 以及 使用

Unity3D协程介绍 以及 使用_huang9012的专栏-CSDN博客_unity 协程

  • 总结:good:适合多看

2.3 Unity 协程之三种分析解决StopCorotine终止不了

https://jingyan.baidu.com/article/7c6fb428c8478480642c9029.html

  1. 亲测:StartCoroutine(Func()),StopCoroutine(Func())的方法无法关闭协程
  2. 亲测:StartCoroutine(“FuncName”),StopCoroutine("FuncName") 能够关闭协程
  3. 亲测:IEnumerator wrapFunc,包装一下协程函数,StartCoroutine(wrapFunc),StopCoroutine(wrapFunc)  能够关闭协程(项目有此发现无法关闭,所有不推荐使用)
  4. 亲测:使用此方法可以开启、关闭线程(比输入字符串函数比较好,因为可以搜到那些地方调用了此协程)
    1. private Coroutine coroutine_setReConnect;
    2. if (coroutine_setReConnect != null)
    3. {
    4. StopCoroutine(coroutine_setReConnect);
    5. coroutine_setReConnect = null;
    6. }
    7. coroutine_setReConnect = StartCoroutine(IE_SetReConnect());

 

3.注意:

3.1 物体隐藏时候,协程关闭了,所以物体隐藏时候需要注意协程的开关

3.2 如操作3:协程start前需要判断其是否开启了,否则协程会不断地叠加(即:开启协程前,将之前已经开启的给关闭)

3.3 如操作4:发现StopCoroutine(ie_StopRecorder)不如 StopCoroutine("IE_StopRecorder"),所以还是使用StopCoroutine("IE_StopRecorder")比较好

3.4 使用此方法可以开启、关闭线程(比输入字符串函数比较好,因为可以搜到那些地方调用了此协程)

  1.  亲测:使用此方法可以开启、关闭线程(比输入字符串函数比较好,因为可以搜到那些地方调用了此协程)
    1. private Coroutine coroutine_setReConnect;
    2. if (coroutine_setReConnect != null)
    3. {
    4. StopCoroutine(coroutine_setReConnect);
    5. coroutine_setReConnect = null;
    6. }
    7. coroutine_setReConnect = StartCoroutine(IE_SetReConnect());

四.操作:1:开启、关闭协程+有传递参数的:成功

  1. using System.Collections;
  2. using UnityEngine;
  3. public class IEnumeratorTest: MonoBehaviour
  4. {
  5. /// <summary>定义一个全局的对象用来接收协程的返回值</summary>
  6. IEnumerator ie;
  7. void Start()
  8. {
  9. ie = Test(5, "hello");
  10. StartCoroutine(ie);
  11. //使用方法名,并且带有一个参数(最多只能传一个参数)
  12. StartCoroutine("Test1", 0);
  13. }
  14. void Update()
  15. {
  16. if(Input.GetKeyDown(KeyCode.Space))
  17. {
  18. StopCoroutine(ie);
  19. StopCoroutine("Test1");
  20. }
  21. }
  22. IEnumerator Test(int a,string str)
  23. {
  24. WaitForSeconds sec = new WaitForSeconds(1f);
  25. while(true)
  26. {
  27. Debug.Log(a);
  28. Debug.Log(str);
  29. yield return new sec;
  30. }
  31. }
  32. IEnumerator Test1(int a)
  33. {
  34. WaitForSeconds sec = new WaitForSeconds(1f);
  35. while(true)
  36. {
  37. Debug.Log(a);
  38. yield return new sec;
  39. }
  40. }
  41. }

四.操作:2:完成:简单的完成延迟启动

 StartCoroutine("StopRecorder");     
  1. IEnumerator StopRecorder()
  2. {
  3. yield return new WaitForSeconds(5f);
  4. //TODO:添加需要执行的动作
  5. }

四.操作:3:协程start前需要判断其是否开启了,否则协程会不断地叠加

1.错误的演示一遍:当我按下多次R按键,会发现Cube运行的越来越快

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. /// <summary>
  5. /// 功能:测试协程停止会不会对之前的协程造成影响
  6. /// </summary>
  7. public class MyCoroutineTest : MonoBehaviour
  8. {
  9. public GameObject obj_cube;
  10. // Start is called before the first frame update
  11. void Start()
  12. {
  13. }
  14. // Update is called once per frame
  15. void Update()
  16. {
  17. if (Input.GetKeyUp(KeyCode.Space))
  18. {
  19. StopCoroutine("Coroutine");
  20. //print("StopCoroutine");
  21. }
  22. else if (Input.GetKeyUp(KeyCode.R))
  23. {
  24. StartCoroutine("Coroutine");
  25. //print("StartCoroutine");
  26. }
  27. }
  28. //测试发现:不断的按下R,开启协程,导致cube移动越来越快
  29. IEnumerator Coroutine()
  30. {
  31. while (true)
  32. {
  33. yield return new WaitForSeconds(0.8f);
  34. Vector3 v3 = obj_cube.transform.position;
  35. obj_cube.transform.position = new Vector3(v3.x + 1, v3.y, v3.z);
  36. }
  37. }
  38. }

1.1 运行结果:当我不断按下R按键,cube会移动的越来越快,

  • 协程不断的StartCoroutine会导致物体越来越快,所以一定要StartCoroutine前StopCoroutine

 1.正确的演示:弄一个bool变量控制协程是否已经开启了(因为查阅API,发现协程没有提供是否正在运行的变量,所以只好自己创建一个变量)

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. /// <summary>
  5. /// 功能:测试协程停止会不会对之前的协程造成影响
  6. /// </summary>
  7. public class MyCoroutineTest : MonoBehaviour
  8. {
  9. /// <summary>GameObject:测试移动的cube</summary>
  10. public GameObject obj_cube;
  11. /// <summary>bool:协程是否开始运行</summary>
  12. private bool bIsStartCoroutine;
  13. // Start is called before the first frame update
  14. void Start()
  15. {
  16. bIsStartCoroutine = false;
  17. }
  18. // Update is called once per frame
  19. void Update()
  20. {
  21. if (Input.GetKeyUp(KeyCode.Space))
  22. {
  23. if (bIsStartCoroutine)
  24. {
  25. bIsStartCoroutine = false;
  26. StopCoroutine("Coroutine");
  27. print("StopCoroutine");
  28. }
  29. }
  30. else if (Input.GetKeyUp(KeyCode.R))
  31. {
  32. if (!bIsStartCoroutine)
  33. {
  34. bIsStartCoroutine = true;
  35. StartCoroutine("Coroutine");
  36. print("StartCoroutine");
  37. }
  38. }
  39. }
  40. 测试发现:不断的按下R,开启协程,导致cube移动越来越快
  41. //IEnumerator Coroutine()
  42. //{
  43. // while (true)
  44. // {
  45. // yield return new WaitForSeconds(0.8f);
  46. // Vector3 v3 = obj_cube.transform.position;
  47. // obj_cube.transform.position = new Vector3(v3.x + 1, v3.y, v3.z);
  48. // }
  49. //}
  50. //测试发现:
  51. IEnumerator Coroutine()
  52. {
  53. while (true)
  54. {
  55. yield return new WaitForSeconds(0.8f);
  56. Vector3 v3 = obj_cube.transform.position;
  57. obj_cube.transform.position = new Vector3(v3.x + 1, v3.y, v3.z);
  58. }
  59. }
  60. }

1.1 不断地按下R按键,也只会开启一次协程

四.操作:4:StopCoroutine(ie_StopRecorder)不如 StopCoroutine("IE_StopRecorder")

1.StopCoroutine(ie_StopRecorder)发现没有执行协程

1.StopCoroutine("IE_StopRecorder")发现可以执行协程

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

闽ICP备14008679号