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(); // 终止以上两种形式开启的协同。
更多概念
- 协同必须在 MonoBehaviour 继承类中启动。
- 协同定义随便,只要在 Unity 引擎内的什么类中都可以定义。
- 协同一旦启动它会立即执行协同函数的第一段,所以你尽量不要把荷很大的代码写在第一段里。
- 协同除了第一次启动会立即执行外,其他时候都是在 Update 函之后。
- 协同是假的多线程,所以它可以无条件访问成员级变量和函数,无线程互斥。
- 协同函数中定义变量是协同函数全局的。
- 协同函数中的代码都是过程化的,没有面向对象的概念。
- 不要在循环中调用协同方法。
- 事件函数也可以改写成协同方法。
- 哪个对象开启的协同,就只能由哪个对象终止。
- 组件对象失活,则该对象开启的协同也会终止。
- 游戏物体失活,也会使组件对象失活,所以也会终止协同程序
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!