在Unity中StartCoroutine/c 中yieldd return这个模式到底是怎么应用的

扫一扫,访问微社区
后使用快捷导航没有帐号?
签到成功!您今天第{todayrank}个签到,签到排名竞争激烈,记得每天都来签到哦!已连续签到:{constant}天,累计签到:{days}天
当前位置: &
查看: 3373|回复: 4
自实现StartCoroutine功能,yield return用法扩展
本帖为抢楼帖,欢迎抢楼!&
5629/1000排名<font color="#FF昨日变化3主题帖子积分
熟悉之中, 积分 629, 距离下一级还需 371 积分
熟悉之中, 积分 629, 距离下一级还需 371 积分
蛮牛币1529
在线时间126 小时
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
才可以下载或查看,没有帐号?
本帖最后由 onon2014 于
14:35 编辑
学习Unity有1个多月了,在学习中,对于Unity的StartCoroutine功能感觉好强大,所以就想闹明白它是什么样的实现原理。
1)WaitForSeconds的用法:
[C#] 纯文本查看 复制代码 void Start()
Debug.Log (&--------------------start------------------------&);
// start unity coroutine
StartCoroutine(UnityCoroutine());
Debug.Log (&---------------------end-------------------------&);
IEnumerator UnityCoroutine()
Debug.Log(&Unity coroutine begin at time : & + Time.time);
yield return new WaitForSeconds(5);
Debug.Log(&Unity coroutine end at time : & + Time.time);
它能使得5秒后---&输出 Unity coroutine end at time : 5 还不影响Start方法中语句的运行
2)WWW的用法
[C#] 纯文本查看 复制代码void Start()
Debug.Log (&--------------------start------------------------&);
// start unity coroutine
StartCoroutine(loadWebFile(&文件路径&));
Debug.Log (&---------------------end-------------------------&);
//加载网络文件
IEnumerator loadWebFile(string url)
WWW loader = new WWW(url);
float time = Time.
Debug.Log(&时间差:& + (Time.time - time));
Debug.Log(&加载完成&);
它能使得WWW加载完成文件后---&时间差:加载所消耗时间 ---加载完成&&也不影响Start方法中语句的运行
基于上述用法,我就有一种想法,怎么样可以自己编写类似于WaitForSeconds和WWW这样的类,可以不用写委托回调来实现。
然后我在网上查找资料,终于找到一篇文章关于Coroutine的详解,作者有跟我一样的迷惑。
我把地址贴出,支持原文:
按照文章所说,自己动手重新写了一遍,发现无法运行得到作者所说的效果,然后自己查找并解决了作者CoroutineWaitForSeconds与WaitForSeconds时间不同步的问题。自行扩展了CoroutineReadFile类,功能不够全面,只是提供一种思路
因为我在蛮牛寻求帮助无解,在此发帖,希望能帮助到与我一样迷惑的蛮牛开发者。
测试入口代码:
[C#] 纯文本查看 复制代码using UnityE
using System.C
public class CoroutineTest : MonoBehaviour {
void Start()
Debug.Log (&--------------------start------------------------&);
// start unity coroutine
StartCoroutine(UnityCoroutine());
// start self coroutine
CoroutineManager.Instance.StartCoroutineSimple(SelfCoroutine());
// start readFile coroutine
//CoroutineManager.Instance.StartCoroutineSimple(ReadFileCoroutine());
Debug.Log (&---------------------end-------------------------&);
IEnumerator UnityCoroutine()
Debug.Log(&Unity coroutine begin at time : & + Time.time);
yield return new WaitForSeconds(5);
Debug.Log(&Unity coroutine end at time : & + Time.time);
IEnumerator SelfCoroutine()
Debug.Log(&Self coroutine begin at time : & + Time.time);
yield return new CoroutineWaitForSeconds(5);
Debug.Log(&Self coroutine end at time : & + Time.time);
IEnumerator ReadFileCoroutine()
//测试加载CoroutineWaitForSeconds.cs文件,这里是我的目录路径
string path=Application.dataPath+&/Scripts/Coroutine/CoroutineWaitForSeconds.cs&;
Debug.Log (&开始加载:& + path);
CoroutineReadFile file = new CoroutineReadFile (path);
Debug.Log (&加载完成:& + path);
string byteStr = &&;
foreach (byte b in file.data) {
byteStr+=b+&,&;
Debug.Log (&字节长度:& + file.data.Length + &\n字节内容:& + byteStr);
项目贴图:
project.jpg (20.73 KB, 下载次数: 1)
14:16 上传
mainObj.jpg (24.55 KB, 下载次数: 3)
14:16 上传
waitSeconds.jpg (31.39 KB, 下载次数: 1)
14:16 上传
readFile.jpg (42.86 KB, 下载次数: 0)
14:16 上传
项目源码:
(4.82 KB, 下载次数: 25, 售价: 2 蛮牛币)
14:18 上传
点击文件名下载附件
支持的,给点蛮牛币打赏一下,谢谢
售价: 2 蛮牛币 &
startcoroutine 怎么用;
每日推荐:
61256/1500排名<font color="#FF昨日变化主题帖子积分
蛮牛粉丝, 积分 1256, 距离下一级还需 244 积分
蛮牛粉丝, 积分 1256, 距离下一级还需 244 积分
蛮牛币2601
在线时间283 小时
{:97:}好东西必须顶
[]: Bophie 在网吧通宵,花了 1
每日推荐:
71548/5000排名<font color="#FF昨日变化2主题帖子积分
日久生情, 积分 1548, 距离下一级还需 3452 积分
日久生情, 积分 1548, 距离下一级还需 3452 积分
蛮牛币3041
在线时间493 小时
拿过来看看,学习了。。。。
每日推荐:
7排名<font color="#FF昨日变化5主题帖子积分
在线时间41 小时
话说 如果在star 中使用了协程 的话 游戏时间暂停&&后再继续游戏& & 协程如何继续运行呢
每日推荐:
5925/1000排名<font color="#FF昨日变化4主题帖子积分
熟悉之中, 积分 925, 距离下一级还需 75 积分
熟悉之中, 积分 925, 距离下一级还需 75 积分
蛮牛币1221
在线时间180 小时
好像很厉害的样子~~~~~~~~~~~~~~~~~~~~~~~~~~
每日推荐:
购买游戏蛮牛书籍在Unity中StartCoroutine/yield return这个模式到底是怎么应用的?其中的原理是什么? - 知乎169被浏览18801分享邀请回答12添加评论分享收藏感谢收起

我要回帖

更多关于 python中的yield 的文章

 

随机推荐