协程方法的一些规则:
1、返回值是IEnumerator (注意:不是IEnumerable)
2、返回参数时使用yield return ;(任意选择要返回的参数)
3、使用StartCoroutine(method())调用协程方法
协程方法执行顺序:协程方法开启后,会继续运行下面的代码,不会等到协程方法运行结束才继续执行。
下面是一段典型的协程代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CoroutineStudy : MonoBehaviour
{
//两条协程可以一起执行,不会冲突
IEnumerator e;
Coroutine co;
IEnumerator Start()
{
e = CountCo();
co = StartCoroutine(e);
for (int i = 1; i <= 10; i++)
{
print($"Start i={i}");
yield return new WaitForSeconds(1);
}
}
IEnumerator CountCo()
{
for(int i = 1; i <= 10; i++)
{
print($"CountCo i={i}");
yield return new WaitForSeconds(1);
}
}
void Update()
{
//StopCoroutine(co);
}
}
- 让程序并行执行的功能,就叫协程。(通过脚本,可以开出来多个程序段)
- Unity是个单线程的编程语言。Unity整个引擎是有多个渲染线程,但是调用游戏脚本的时候,unity统一放在一个主线程中进行调度。所以对于我们写的脚本来说,unity是单线程的,故采用协程机制来模拟多线程。协程更像是一种函数调用。
协程调用的函数,不带返回值,IEnumerator是协程的固定用法,对应StartCoroutine来启动协程(这样配合相当于在unity当中登记了一个协程,然后unity会在游戏的每一帧当中定时调用这段协程)
启动一个协程:StartCoroutine
停止一个协程:StopCoroutine
暂停协程执行:yield
可以用协程做一个计时器
比如上图中,就可以实现每隔1秒输出一个数
停止协程的做法:
(协程脚本可以随便挂载在场景中的任意一个物体上)禁用脚本不能停止协程;移除脚本(Destory(this))可以停止协程
禁用或销毁协程挂载对象可以停止协程
- Start方法可以采用协程形式,只要把返回值改成IEnumerator形式就可以
- 协程可以等待任何一个返回值为IEnumerator的函数
- Unity可以对所有继承自YieldInstruction的类使用协程,即yield关键字对所有继承自YieldInstruction的类都可以起作用
- 协程的缺点:
依赖于MonoBehaviour(所有继承MonoBehaviour的类才能使用协程);不能有返回值;回调地狱