奥东here......Unity中的协程
参考文章地址:
http://dsqiu.iteye.com/blog/2029701
定义:
A coroutine is a function that is executed partially and, presuming suitable conditions are met, will be resumed at some point in the future until its work is done.
即协程是一个分部执行,遇到条件(yield return 语句)会挂起,直到条件满足才会被唤醒继续执行后面的代码。
协程的作用一共有两点:
1 延时(等待)一段时间执行代码
2 等某个操作完成之后再执行后面的代码
总结起来就是一句话:控制代码在特定的时机执行
执行的时机:
Unity在每一帧(Frame)都会去处理对象上的协程。Unity主要是在Update后去处理协程(检查协程的条件是否满足),但也有写特例


注意点:
1 协程不是线程,也不是异步执行的,协程和 MonoBehaviour 中的 Update函数一样也是在MainThread中执行的。所以使用协程你不用考虑同步和锁的问题
示例代码:
public class TestCoroutine : MonoBehaviour
{
//Makesure Update() and LateUpdate() Log only once
private bool isUpdateCall = false;
private bool isLateUpdateCall = false;
private int num = 1;//展示各个log打印的顺序
// Use this for initialization
void Start()
{
Debug.Log("Start Call Begin "+num++);// 1
StartCoroutine(StartCoutine());
Debug.Log("Start Call End " + num++);//3
}
IEnumerator StartCoutine()
{
Debug.Log("This is Start Coroutine Call Before " + num++);//2
yield return new WaitForSeconds(1f);
//在执行上面语句的同时,num从2变成了11 这个时间断内有Update()方法和LateUpdate()方法在执行
Debug.Log("This is Start Coroutine Call After " + num++);//11
}
// Update is called once per frame
void Update()
{
if (!isUpdateCall)
{
Debug.Log("Update Call Begin " + num++);//4
StartCoroutine(UpdateCoutine());
Debug.Log("Update Call End " + num++);//6
isUpdateCall = true;
}
}
IEnumerator UpdateCoutine()
{
Debug.Log("This is Update Coroutine Call Before " + num++);//5
//yield return new WaitForSeconds(1f);
yield return null;
Debug.Log("This is Update Coroutine Call After " + num++);//10
}
void LateUpdate()
{
if (!isLateUpdateCall)
{
Debug.Log("LateUpdate Call Begin " + num++);//7
StartCoroutine(LateCoutine());
Debug.Log("LateUpdate Call End " + num++);//9
isLateUpdateCall = true;
}
}
IEnumerator LateCoutine()
{
Debug.Log("This is Late Coroutine Call Before " + num++);//8
yield return new WaitForSeconds(1f);
Debug.Log("This is Late Coroutine Call After " + num++);//12
}
}
Pre Tip:
1 StartCoroutine()方法在执行的时候,对应绑定的物体上销毁的时候,不管StartCoroutine()方法执行到何处,都停止执行,这个时候就会出现问题
解决办法: 物体(GameObject)本身只调用本身的StartCoroutine()方法,当别的物件A调用物件B的Coroutine()方法时,当关联的物件消失的时候,就会出现问题

浙公网安备 33010602011771号