C#中没有Coroutine,Coroutine(协程)是Unity3D中的一种机制,可以减少Update()的负担。
- 在协程yield return之后,继续执行协程是在Update()之后,LateUpdate()之前进行的。所以,协程并不是多线程,它和Update()一样是在主线程中执行的。
- StartCoroutine必须在MonoBehaviour或继承于MonoBehaviour的类中调用。
public class MyCoroutine : MonoBehaviour
{
void Start()
{
StartCoroutine(PutInfo());
}
IEnumerator PutInfo()
{
while (true)
{
print("协程中1 " + Time.time);
yield return null;
print("协程中2 " + Time.time);
}
}
void Update()
{
print("Update " + Time.time);
}
void LateUpdate()
{
print("LateUpdate " + Time.time);
}
}

- yield return null与yield return 0、yield return 1等yield return num系列都表示等待一帧执行。
- yield return new WaitForSeconds(time);与Time.timeScale有关。参数time 与Time.time一致。当参数time为1时,在Time.time每增加1时执行yield return后的代码。Time.timeScale>1时,游戏速度加快,Time.timeScale<1时,游戏速度减慢。如:当Time.timeScale=2,参数time为1时,此时游戏速度会加快,Time.time会以原先2被的速度增长,同样还是在Time.time为1的时候执行yield return后的代码,也就是说,这种情况下,Time.time变化速度快于Scale=1时候的变化速度,所以第一次执行yield return后的代码时用的真实时间比Scale=1的时间短。
- yield return new WaitForFixedUpdate():等待所有的脚本的FixedUpdate函数执行完后在继续执行
- yield return new WWW(url):等待url下载完后再继续执行
- yield return StartCoroutine(MyFunc):等待协程MyFunc执行完后再执行
- Time.realtimeSinceStartup()与Time.timeScale无关。
public class MyCoroutine : MonoBehaviour
{
void Start()
{
StartCoroutine(PutInfo());
}
IEnumerator PutInfo()
{
while (true)
{
print("协程中1 " + Time.time+" "+Time.realtimeSinceStartup);
yield return new WaitForSeconds(1);
print("协程中2 " + Time.time + " " + Time.realtimeSinceStartup);
}
}
void Update()
{
print("Update " + Time.time + " " + Time.realtimeSinceStartup);
}
void LateUpdate()
{
print("LateUpdate " + Time.time + " " + Time.realtimeSinceStartup);
}
}
-----------Time.timeScale=1时,在游戏启动2.43s后第一次执行yield return 后的代码----------