Unity中巧用协程(Coroutine)做状态机
2014-05-09 18:56
253 查看
虽然这个其实在看了2dtoolkit的demo才知道的,不过我简化一下当作一点练习吧。不得不说国外在编程思想上总是领先不少。我之前用协程都是当作定时器来用,而别人直接拿来做动画,这就是差距啊
先来看看这样的情况:如果想做一只左右游动的鱼的行为,那么用状态机的思路就是左和右两个状态。那么代码写出来差不多就是
这个在C#里面就要额外声明一个变量state,状态多的时候还要声明枚举。要是回到最初写程序那会,新手都会写成
但是当游戏的处理方式变成以Update为一帧的处理方式之后,这种无脑的方法就失效了,这样出来的效果会是鱼根本不动,具体为什么我想写过的人都知道。于是就出现了冗长的switch或者if语句,而要做的仅仅就是切换几个状态而已
来看看用协程是怎么做的吧
协程允许你的代码执行到一半的时候,先去做完别的事情再回来,这样处理许多事情就会变得简单。比如做俄罗斯方块的时候,但算法满足消去一行的时候,你需要播放一个动画,再消去,通常的做法就是把游戏状态转到动画状态,这样才能保证消去的时候暂停其他动作,比如继续下落方块。如果用协程就直接把权限交给协程就ok。
说是这么说,但是当实现一种功能成习惯的时候,通常仍然习惯性的使用老方法而不会去使用新方法,虽然用熟练的方法可以更快的完成任务,但是想本质上提高效率还是需要思想上的进一步提升。这也是别人动不动能写一个框架,而你实现个小功能却找了半天bug的差距所在,很多时候开始的方向就是错的
先来看看这样的情况:如果想做一只左右游动的鱼的行为,那么用状态机的思路就是左和右两个状态。那么代码写出来差不多就是
void Update() { if(state==left){...} else{...} }
这个在C#里面就要额外声明一个变量state,状态多的时候还要声明枚举。要是回到最初写程序那会,新手都会写成
for(...) fish.moveleft(); for(...) fish.moveright();
但是当游戏的处理方式变成以Update为一帧的处理方式之后,这种无脑的方法就失效了,这样出来的效果会是鱼根本不动,具体为什么我想写过的人都知道。于是就出现了冗长的switch或者if语句,而要做的仅仅就是切换几个状态而已
来看看用协程是怎么做的吧
using UnityEngine; using System.Collections; public class NewBehaviourScript : MonoBehaviour { public Transform fish; // Use this for initialization void Start () { StartCoroutine(Move(100)); } IEnumerator Move(int speed) { float ut = 0; while (true) { ut += Time.deltaTime; if (ut >= 2) { ut = 0; var angles = fish.transform.localEulerAngles; angles.z += 180; fish.transform.localEulerAngles = angles; } fish.Translate(speed * Time.deltaTime, 0, 0); yield return 0; } } }
协程允许你的代码执行到一半的时候,先去做完别的事情再回来,这样处理许多事情就会变得简单。比如做俄罗斯方块的时候,但算法满足消去一行的时候,你需要播放一个动画,再消去,通常的做法就是把游戏状态转到动画状态,这样才能保证消去的时候暂停其他动作,比如继续下落方块。如果用协程就直接把权限交给协程就ok。
说是这么说,但是当实现一种功能成习惯的时候,通常仍然习惯性的使用老方法而不会去使用新方法,虽然用熟练的方法可以更快的完成任务,但是想本质上提高效率还是需要思想上的进一步提升。这也是别人动不动能写一个框架,而你实现个小功能却找了半天bug的差距所在,很多时候开始的方向就是错的
相关文章推荐
- Unity协程(Coroutine)原理深入剖析再
- unity脚本中的协程Coroutine
- Unity协程(Coroutine)原理深入剖析
- Unity协程(Coroutine)原理深入剖析
- Unity协程(Coroutine)管理类——TaskManager工具分享
- Unity协程(Coroutine)原理深入剖析
- Unity3D - Unity协程(Coroutine)原理深入剖析
- Unity协程(Coroutine)原理深入剖析
- Unity协程(Coroutine)原理深入剖析(转载)
- Unity协程(Coroutine)原理深入剖析
- 【Unity3D基础教程】给初学者看的Unity教程(五):详解Unity3D中的协程(Coroutine)
- [Unity菜鸟] 协程Coroutine
- Unity协程(Coroutine)原理深入剖析
- Unity协程(Coroutine)原理深入剖析再续
- 【转】Unity协程(Coroutine)原理深入剖析
- C#中的yield return与Unity中的Coroutine(协程)(上)
- Unity协程(Coroutine)原理深入剖析
- Unity协程(Coroutine)原理深入剖析(转)
- Unity引擎在执行协程(Coroutine)的原理
- Unity Notes之协程(Coroutine)简析