unity中實現FSM有限狀態機

有限狀態機(FSM)在遊戲中的運用很是普遍. 使用它編程快速簡單, 而且易於理解.git

#FSM由如下幾個部分組成github

  1. 內在的全部狀態
  2. 輸入條件
  3. 狀態之間起到鏈接性做用的轉換函數

#在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

thefuntastic/Unity3d-Finite-State-Machine使用方法

引入packet包

using MonsterLove.StateMachine; //Remember the using statement before the class declaration

public class MyManagedComponent : MonoBehaviour
{

}

定義FSM狀態的Enum

public enum States
{
    Init, 
    Play, 
    Win, 
    Lose
}

建立狀態機的引用變量

StateMachine<States> fsm;

初始化StateMachine

void Awake() {
    fsm = StateMachine<States>.Initialize(this);
}

這樣一個狀態機就已經建立好了, 定義好StateMachine之後, 它會自動爲咱們建立相應的回調函數. 使用方法是定義一個 狀態名_方法名. 已經支持的方法有:code

  • Enter
  • Exit
  • FixedUpdate
  • Update
  • LateUpdate
  • Finally

例如:遊戲

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);

很方便,有沒有..

相關文章
相關標籤/搜索