1. 程式人生 > >在Unity中實現FSM有限狀態機

在Unity中實現FSM有限狀態機

簡介

有限狀態機,(英語:Finite-state machine, FSM),又稱有限狀態自動機,簡稱狀態機,是表示有限個狀態以及在這些狀態之間的轉移和動作等行為的數學模型 -- 引用百度百科的解釋:

有限狀態機(FSM)是遊戲AI的一種常用模型,我做一個簡單的記錄,在Unity中實現有限狀態機模型.

FSM的結構和邏輯

整體結構分為4個部分

  • AIController
  • FSM
  • IState
  • MoveState, AttackState, IdleState, DieState
    解釋:
    1.其中AIController用於實現各種行為動作,它作為AI行為動作的控制器.
    2.FSM用於存放判斷引數和統一呼叫各狀態機
    3.IState狀態機介面,等待各種狀態機實現其功能
    4.各種State,每個狀態機內部實現開關邏輯

    實現FSM

    建立一個AIController

    建立一個AIController,繫結在怪物身上,用於控制怪物做什麼事情
public class AIController : MonoBehaviour {
    public FSM fsm;
    void Start () {
        fsm = GetComponent<FSM> ();
        fsm.ac = this;
        //初始化一個預設狀態機
        fsm.ChangeState(new MoveState());
    }
    public void Move(){
        Debug.Log("move"
); } public void Attack(){ Debug.Log("attack"); }

建立一個FSM

FSM用於傳遞狀態機,建立一個FSM繫結在怪物身上

public class FSM : MonoBehaviour {

    public IState currentState{ get; private set;}
    public bool isCanAttack;
    public bool isCanMove;
    public AIController ac;
    void Start () {

    }

    public
void ChangeState(IState newState)
{ currentState = newState; } void Update () { if (currentState != null && ac != null) { currentState.Execute (ac); } } }

建立一個狀態機介面:IState

public interface IState{
    void Execute(AIController ac);
}

建立多個狀態機

在狀態機中實現判斷和呼叫AIController的行為方法


MoveState:

public class MoveState : IState {
    public void Execute (AIController ac)
    {
        if (ac.fsm.isCanMove) {
            ac.Move();
        }
        else {
            ac.fsm.ChangeState(new IdleState());
        }
    }
}

AttackState:

public class AttackState : IState {
    public void Execute (AIController ac)
    {
        if (ac.fsm.isCanAttack) {
            ac.Attack();
        }
        else {
            ac.fsm.ChangeState(new MoveState());
        }
    }
}