撰写了文章 发布于 2019-11-04 20:52:19
【Unity-day1】StartCoroutine-day1
在学习Unity的过程中,每天都碰到了不少的困难,也学到了很多。作为一个游戏策划,写代码这个事情平时都是看别人做的,现在要自己上手了,难免有点慌。现开帖子记录一下自己每天学到的内容。
下面是今天的正文:
StartCoroutine对我来说是一个全新的概念,中文译为协程。我在大学中接触过Java,对线程的概念是有一定了解的,但协程的概念与线程是不同的,因为C# Script是单线程的,目前我所知道的携程的作用是减少系统开销,其他细节请指正或者给出链接,谢谢。
下面给出一个最简单的协程函数:
- IEnumerator Test()
- {
- yield return new WaitForSecond(1);
- Debug.Log("end");
- }//在其他地方调用StartCoroutine(Test())
一秒之后打印出end。根据查资料所得,Test函数每帧都会调用一次,但是因为WaitForSecond(1)的关系,导致直到每帧的末尾时,Test函数才会成功调用,即给unity注册了一个一帧就调用一次的函数但是要等待一秒才调用的函数。
yield return new WaitForSecond与yield return www的设计:
如果(网络请求、时间没有达到要求){
返回:没结束;
}
返回:结束了,继续
yield用以生成列表,即对应了声明函数时的IEnumerator,yield return之后的语句描述了何时执行该函数。

运行结果是:
start1
test1
start2
test2
可以见得当执行到yield return null时,unity保存了该函数的下文,直到下一帧再执行该函数,即暂停了协程函数的执行。
见下面这个例子:
void Start () {
Debug.Log("start1");
StartCoroutine(Test());
Debug.Log("start2");
}
IEnumerator Test()
{
Debug.Log("test1");
yield return StartCoroutine(DoSomething());
Debug.Log("test2");
}
IEnumerator DoSomething()
{
Debug.Log("load 1");
yield return null;
Debug.Log("load 2");
}
执行结果:
start1
test1
load1
start2
load2
test2
start1先输出无可厚非,其次输出test1,再者跳转到Dosomething,输出load1此时dosomething执行到暂停该函数,到下一帧再执行,则返回test,而test要等dosomething执行完才能继续执行,则返回至start,输出start2.一帧之后,输出load2,紧接着test2输出。所谓协程即协同两个函数执行关系,主线程不会因其他函数的执行条件没到而卡住,会优先继续执行再每帧去询问该条件是否通过。
