- 最后登录
- 2016-10-1
- 注册时间
- 2013-12-28
- 阅读权限
- 90
- 积分
- 5805
- 纳金币
- 2954
- 精华
- 3
|
最近学习跑酷游戏,遇到协同程序的yield用法,不太理解,于是做了个小例子,看看它到底怎么运行的。以下是个人理解的东西,如果有错误,恳请大神们一定要指出来,别让我自以为正确的一路错下去。好了,直接入正题。
首先把我写的测试代码copy出来,把这个.cs文件挂到一游戏对象上:
private int j = 0;
private int sum = 0;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
j++;
Debug.Log ("开始-- Fps--第"+j+"帧--Start--"+Time.deltaTime);
StartCoroutine ("ifbs");
sum = j * j;
Debug.Log (sum);
}
IEnumerator ifbs() {
Debug.Log ("Start 调用迭代函数FPS--"+j+"--Start");
if(j < 4) {
for(int i = 0; i < 3; i++) {
Debug.Log("FPS--第"+j+"帧中--this is for第--"+i+"--循环");
if(i == 1) {
yield return new WaitForSeconds(0.05f);
}
}
Debug.Log ("结束-- FPS--第"+j+"帧--End");
}
Debug.Log ("#####到底在哪里停######"+j+"");
}
然后再建个.cs文件挂到另一游戏对象上,代码如下:
private int i = 0;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
i++;
Debug.Log ("立方体这是YieldR文件的Update方法--"+i);
}
然后运行,log文件是这样的,拷取了log文件部分,做了精简,大家可以自己试试:
开始-- FPS--第1帧--Start--0.02
Start 调用迭代函数FPS--1--Start
FPS--第1帧中--this is for第--0--循环
FPS--第1帧中--this is for第--1--循环
1
立方体这是YieldR文件的Update方法--1
开始-- FPS--第2帧--Start--0.02
Start 调用迭代函数FPS--2--Start
FPS--第2帧中--this is for第--0--循环
FPS--第2帧中--this is for第--1--循环
4
立方体这是YieldR文件的Update方法--2
开始-- FPS--第3帧--Start--0.1288795
Start 调用迭代函数FPS--3--Start
FPS--第3帧中--this is for第--0--循环
FPS--第3帧中--this is for第--1--循环
9
立方体这是YieldR文件的Update方法--3
FPS--第3帧中--this is for第--2--循环
结束-- FPS--第3帧--End
#####到底在哪里听######3
FPS--第3帧中--this is for第--2--循环
结束-- FPS--第3帧--End
#####到底在哪里听######3
开始-- FPS--第4帧--Start--0.05303032
因为要等0.05秒,所以第一帧和第二帧不会运行yield后面的内容,直到第三帧时,时间过去了0.05秒,就会在第三帧的时候运行yield后面的内容,到这里就有疑问了,那这个yield后面的内容是在update方法一开始就运行,还是调用StartCoroutine启动协同程序的时候调用,可是结果让我很困惑,直到看到雨凇momo的
帖子:深入理解unity脚本的执行顺序
知道了unity的运行机制,就好像明白了什么。
首先是所有update方法先都运行完才运行yield后面的内容,就像有个update总管把所有的这一帧的update方法集合起来先搞定这一帧所有update方法,然后把所有的欠下的yield后面的内容执行掉,就接着运行下一帧。
还发现了StartCoroutine ("ifbs")和StartCoroutine (ifbs())运行结果一样,不知道有什么区别,还有yield return 0和yield return 2的运行结果没看出来区别,望大神解答。
|
|