查看: 11356|回复: 7
打印 上一主题 下一主题

[其他] 对协同程序的yield return的理解

[复制链接]

711

主题

10

听众

5805

积分

高级设计师

Rank: 6Rank: 6

纳金币
2954
精华
3

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2014-4-30 02:33:28 |只看该作者 |倒序浏览
最近学习跑酷游戏,遇到协同程序的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的运行结果没看出来区别,望大神解答。


分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

无效楼层,该帖已经被删除
hyui    

1

主题

2

听众

6671

积分

高级设计师

Rank: 6Rank: 6

纳金币
2715
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

板凳
发表于 2014-4-30 03:49:04 |只看该作者
good share!
回复

使用道具 举报

0

主题

1

听众

939

积分

初级设计师

Rank: 3Rank: 3

纳金币
330
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

地板
发表于 2014-7-17 21:12:16 |只看该作者
yield return 0是立即执行,2是等2帧执行
回复

使用道具 举报

1

主题

1

听众

491

积分

设计实习生

Rank: 2

纳金币
258
精华
0

最佳新人

5#
发表于 2014-7-17 23:21:19 |只看该作者
楼上说的不对哦,yield return null都可以,只是为了通知协程管理器,我到这个点要中断一下,下一帧从这个地方运行而已
回复

使用道具 举报

0

主题

1

听众

1082

积分

助理设计师

Rank: 4

纳金币
93
精华
0
6#
发表于 2014-8-15 17:23:24 |只看该作者
挺厉害的。。
回复

使用道具 举报

1

主题

1

听众

837

积分

初级设计师

Rank: 3Rank: 3

纳金币
7
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

7#
发表于 2017-2-15 11:53:47 |只看该作者

yield return null
yield return 0 或者
yield return 1或者10000都是一样的,只是为了返回,等一帧后继续。
回复

使用道具 举报

0

主题

9

听众

3504

积分

中级设计师

Rank: 5Rank: 5

纳金币
269
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

8#
发表于 2017-2-17 16:08:39 |只看该作者
Unity 用迭代器做的携程,可以理解为主线程等待,当满足某个条件的时候,返回一个yield return,并执行后面的代码,直到下一个 yield return或者代码结束。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-11-15 13:44 , Processed in 0.229479 second(s), 31 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部