有限状态机(FSM)在游戏中的运用很是普遍. 使用它编程快速简单, 而且易于理解.git
#FSM由如下几个部分组成github
#在Unity中使用FSM 一般实现一个FSM咱们的写法通常是这样的. ##定义枚举定义的状态编程
public enum Hero_Enum { Wait, Move, Attack, Die }
这里咱们定义一个主角, 它有4个状态分别是等待,移动,攻击,死亡四个状态.框架
private Hero_Enum currState;
public void SetState (Hero_Enum newState) { currState = newState; switch (currState) { case Hero_Enum.Wait: WaitEnter(); break; case Hero_Enum.Move: MoveEnter(); break; case Hero_Enum.Attack: AttackEnter(); break; case Hero_Enum.Die: DieEnter(); break; } }
在不一样的状态下咱们须要执行相对应的逻辑, 那写法以下:函数
public void Update() { switch (currState) { case Hero_Enum.Wait: DoWait(); break; case Hero_Enum.Move: DoMove(); break; case Hero_Enum.Attack: DoAttack(); break; case Hero_Enum.Die: DoDie(); break; } }
这里只是罗列了一下一个基本的FSM结构, 这样写下来发现敲得代码也很多, 那么问题来了, 有没有一个更好的办法来实现FSM呢?this
答案是有, 在这里推荐一个比较好用的FSM框架, 它的原地址在 https://github.com/thefuntastic/Unity3d-Finite-State-Machine3d
using MonsterLove.StateMachine; //Remember the using statement before the class declaration public class MyManagedComponent : MonoBehaviour { }
public enum States { Init, Play, Win, Lose }
StateMachine<States> fsm;
void Awake() { fsm = StateMachine<States>.Initialize(this); }
这样一个状态机就已经建立好了, 定义好StateMachine之后, 它会自动为咱们建立相应的回调函数. 使用方法是定义一个 状态名_方法名. 已经支持的方法有:code
例如:游戏
void Init_Enter() { Debug.Log("We are now ready"); } //Coroutines are supported, simply return IEnumerator IEnumerator Play_Enter() { Debug.Log("Game Starting in 3"); yield return new WaitForSeconds(1); Debug.Log("Game Starting in 2"); yield return new WaitForSeconds(1); Debug.Log("Game Starting in 1"); yield return new WaitForSeconds(1); Debug.Log("Start"); } void Play_Update() { Debug.Log("Game Playing"); } void Play_Exit() { Debug.Log("Game Over"); }
当进入到Init状态到, 会自动执行咱们刚刚定义的Init_Enter方法, 同时支持IEnumerator, 如上面的Play_Enter方法.get
那么咱们如何切换状态呢. 使用它就能够:
fsm.ChangeState(States.Init);
很方便,有没有..