C#协同知识点

启动协同方法

方法1:StartCouroutine(“Fun”);   // 只能调用对象自身的协同方法
方法2:StartCouroutine(Fun());   // 可以调用其他对象的协同方法

定义协同方法: 协同方法中必须要有yield语句

IEnumerator Fun()
   {
       yield return new WaitForFixedUpdate();    // 当前帧返回,在FixedUpdate执行之后返回。
       yield return new WaitForSecond(3);  // 等待3秒,等待的每一帧在当前帧Update执行之后返回。
       yield return null;  // 等待一帧(当前帧Update执行之后返回,下一帧继续执行后面的代码)。
       if(条件)
           yield break;    // 终止协同方法。

       yield return StartCoroutine(OtherFun());    // 在OtherFun全部执行完以后,继续执行后面的代码。
       //StartCoroutine(OtherFun());
       // yield语句之间,都是当前帧执行的代码。

       yield return new WaitForEndOfFrame();    // 在执行渲染之后返回。
   }

   IEnumerator OtherFun()
   {
       for(int i = 0; i < 10; i++)
       {
           Instance<GameObject>(GameObject.CreatePrimitive(PrimitiveType.Cube));
           yield return new WaitForSecond(0.5f);
       }
   }

终止协同 (终止对象自身调用的协同)

StopCoroutine(“Fun”);    // 只能终止以字符串开启的协同。
StopAllCoroutine();     // 终止以上两种形式开启的协同。

更多概念

  1. 协同必须在 MonoBehaviour 继承类中启动。
  2. 协同定义随便,只要在 Unity 引擎内的什么类中都可以定义。
  3. 协同一旦启动它会立即执行协同函数的第一段,所以你尽量不要把荷很大的代码写在第一段里。
  4. 协同除了第一次启动会立即执行外,其他时候都是在 Update 函之后。
  5. 协同是假的多线程,所以它可以无条件访问成员级变量和函数,无线程互斥。
  6. 协同函数中定义变量是协同函数全局的。
  7. 协同函数中的代码都是过程化的,没有面向对象的概念。
  8. 不要在循环中调用协同方法。
  9. 事件函数也可以改写成协同方法。
  10. 哪个对象开启的协同,就只能由哪个对象终止。
  11. 组件对象失活,则该对象开启的协同也会终止。
  12. 游戏物体失活,也会使组件对象失活,所以也会终止协同程序

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!