Unity中巧用协程(Coroutine)做状态机


虽然这个其实在看了2dtoolkit的demo才知道的,不过我简化一下当作一点练习吧。不得不说国外在编程思想上总是领先不少。我之前用协程都是当作定时器来用,而别人直接拿来做动画,这就是差距啊


先来看看这样的情况:如果想做一只左右游动的鱼的行为,那么用状态机的思路就是左和右两个状态。那么代码写出来差不多就是


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)做状态机)