有限狀態機(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);
很方便,有沒有..