我的游戏开发笔记(五):Coroutine及其用法
来源:互联网 发布:windows文本效果在哪里 编辑:程序博客网 时间:2024/05/16 01:54
在看别人代码的时候总是发现有个StartCoroutine(XXXXXX()),刚开始根本不明觉厉,只好查查单词。
Coroutine翻译过来是协同程序,那么什么是协同程序,又去百度了下,发现大多的解释是协同程序就像一个线程,占用少量的资源,不过并不是由系统调用,是由程序员调用,但是一经启动就无法停止下来(除非Stop)。
在u3d中,StartCoroutine()必须结合IEnumerator来使用,何谓IEnumerator,IEnumerable和IEnumerator 详解,这篇博文详细地解释了IEnumerator。
一个IEnumerator的方法在其每一条路径上都必须用yield return进行返回,经常用的大致有一下几种返回值
//等待XX秒后执行下面的语句。yield return new WaitForSeconds(XX);//等待加载完毕。yield return new WaitForEndFrame();//等待FixedUpdate完毕。yield return new WaitForFixedUpdate()//等待下一帧。yield return null;yield return只要理解为“等待什么完成”就可以了。
Coroutine广泛运用于u3d中,其中一个优点就是延时。
先举个例子,我们在做游戏中经常会遇到倒计时的制作。
在不使用Coroutine的情况下,一般我是这么实现的
<pre name="code" class="html">float createTime=3f;void Update(){ createTime-=Time.deltaTime;}void OnGUI(){ if(createTime>0) { GUI.Label(new Rect(Screen.width/2,Screen.height/2,20f,20f),createTime.ToString("F0"));} }
在用Coroutine的情况下,我是这么实现的
int createTime=3;void OnGUI(){if(createTime>0){StartCoroutine(TimeCutDown(1));GUI.Label(new Rect(Screen.width/2,Screen.height/2,20f,20f),createTime.ToString());}}IEnumerator TimeCutDown(float gap){yield return new WaitForSecond(gap);createTime--;StopAllCoroutine();}
看上去不用Coroutine比用Coroutine简单,可是你必须得在每一帧都计算一次倒数的时间,若你一个游戏里面有几十个倒数,你必须得分清所有计时器,并逐一计算。而用Coroutine,你在想用延时时只需要写上
StartCoroutine(TimeCutDown(XX));随便来多少个倒计时。
使用Coroutine的第二个优点,也是最大的一个优点,就是异步。
何谓异步,举个例子,我们在想要制作Loading界面的时候,总想要在Loading界面同时加载其他界面,当其他界面加载完毕的时候,就跳出Loading界面而显示其他界面。这就是异步。
Unity3d中制作Loading场景进度条所遇到的问题,这篇文章很好的阐述了如何异步实现Loading界面。
总之,任何我们想同时进行的工作,首先我们就可以想想用Coroutine能不能实现,个人认为还是挺方便的。
Coroutine的第三个优点就是,它会一直执行下去,除非停止。
这跟for循环的区别在于 Coroutine执行没有条件,而是当你停止的时候才停止,否则会无限循环。
那这还算优点吗?这不是加大CPU负荷吗?
我们在制作游戏的时候总有一些东西是要全程判断的,比如胜利与否、死亡与否以及角色该执行的动作,当然我们可以写在update()里面进行判断,但是有时候我们并不想写在update()里面,可能是因为里面的东西太多了,也可能是单纯的不想写在update()里,所以我们可以使用StartCoroutine(),它就只会在Start()或者Awake()里面调用一次,然后一直执行下去除非你停止。
Unity手游之路<十>自动寻路Navmesh之跳跃,攀爬,斜坡,从这里我们看到,作者就是在Start()里用StartCoroutine()实现角色动作的全程监控,实时改变人物的动作。
- 我的游戏开发笔记(五):Coroutine及其用法
- 我的游戏开发笔记(五):Animator的运用二
- Python游戏服务器开发日记(三)用greenlet模拟lua coroutine的研究
- Go游戏服务器开发的一些思考(十):goroutine和coroutine
- 我的NDK学习开发笔记(五)
- 我的游戏开发系列笔记(索引)
- 我的Android游戏开发笔记
- 游戏开发学习笔记(五)人物的移动及相机的跟随
- 游戏开发笔记(五)——服务端系统分层
- cocos2dx游戏开发学习笔记(五)之引擎框架
- 【Unity3D游戏开发学习笔记】(五)灵魂降临—Unity脚本的简单运用
- 我的php学习笔记(十八)php的面向对象开发(五)
- 我的游戏库开发(开篇)
- 我的游戏开发(前言)
- 我的游戏开发笔记(四):Animator的初步运用(一)
- 我的游戏开发笔记(六):NavMeshAgent及自动寻径(跳跃)。
- 我的游戏开发笔记(二):加状态以及检东西
- 我的游戏开发笔记(三):扔东西与跟踪。
- GNS3模拟cisco7200与实体系统联网、启动telnet、SSH2,具体操作留存
- QNX系统glib-2.44交叉编译
- 纯HTML5后台模板
- [LeetCode179] Largest Number
- 添加 防火墙端口
- 我的游戏开发笔记(五):Coroutine及其用法
- jquery利用attr()方法改变checkbox控件状态的问题
- 2015多校联合第三场 hdu5317 RGCDQ
- 自动化测试应用推广 领导反思篇
- 微信关键词自动回复代码
- sizeof 与 strlen
- 购房的注意事项
- MTK申请patch流程
- test