线程(Thread)和协程(Coroutine)
使用协程的作用一共有两点:1,延迟等待一定时间执行代码;2,等待某个操作完成后执行下面的代码。总结一句话:控制代码在一定的时间执行。
协程不是线程也不是异步执行的。协程和MonoBehaviour的Update函数一样也是在MainThread中执行。使用协程不用考虑同步和锁的问题。
Unity中协程的执行原理
协程是一个分部执行,遇到条件(yield return 语句)会挂起,直到条件满足才会被唤醒继续执行后面的代码。如果yield return 后面是null(yiled return null)那么会直接执行下面的程序。
Unity在每一帧(Frame)都会去处理对象上的协程。Unity主要是在Update后去处理协程(检查协程的条件是否满足)。
using UnityEngine;
using System.Collections;
/// <summary>
/// unity协程
/// </summary>
public class Tests : MonoBehaviour {
// Update is called once per frame
void Update () {
if(Input.GetKeyDown(KeyCode.J))
{
StartCoroutine(IETestNull());
}
if (Input.GetKeyDown(KeyCode.K))
{
StartCoroutine(IETestFrame());
}
if (Input.GetKeyDown(KeyCode.L))
{
StartCoroutine(IETestTime());
}
}
/// <summary>
/// 直接执行IEnumerator里面的所有代码无需等待
/// </summary>
/// <returns></returns>
IEnumerator IETestNull()
{
Debug.Log("开启一道协程,先执行这段代码");
yield return null; //无需等待直接执行下面的代码
Debug.Log("如果return后面是null,那么直接执行这段代码");
}
/// <summary>
/// 帧等待
/// </summary>
/// <returns></returns>
IEnumerator IETestFrame()
{
Debug.Log("开启一道携程时,先执行这段代码");
yield return 2; //等待2帧后执行下面的代码
Debug.Log("等待2帧后,执行这段代码");
}
/// <summary>
/// 时间等待
/// </summary>
/// <returns></returns>
IEnumerator IETestTime()
{
Debug.Log("开启一道携程时,先执行这段代码");
yield return new WaitForSeconds(2f); //等待2秒后执行下面的代码
Debug.Log("等待2秒后,执行这段代码");
}
}
查看 YieldInstruction , WaitForSeconds , WaitForFixedUpdate , Coroutine and MonoBehaviour.StartCoroutine 可以获得更多使用yield的信息.