FSM,有限狀態(tài)機集灌,可以理解成是對行為邏輯的抽象复哆,就好象人在生活中會做出各種行為腌零,例如吃飯梯找、睡覺等,這些所有我們都看作是“行為”的分支益涧,由大腦決定每種行為具體是什么實施锈锤。
在整個FSM架構(gòu)中闲询,其實與上面解釋一致久免,首先有一個狀態(tài)基類stateObject扭弧,里面有三個方法阎姥,分別是狀態(tài)前、狀態(tài)中鸽捻、狀態(tài)后呼巴。所有具體行為都要繼承這個基類,在這三個方法中具體實現(xiàn)各種方法的邏輯衣赶。然后厚满,需要一個stateManager(大腦)狀態(tài)管理類來管理這些狀態(tài)屑埋,特別注意的是里面changeState方法痰滋,他是狀態(tài)跳轉(zhuǎn)的關(guān)鍵。至于如果存儲各種狀態(tài)敲街,你可以用list類 ,字典類等等多艇。
有限狀態(tài)機是把一個對象的行為分解稱為易于處理的“塊”或狀態(tài)。
例如复隆,燈的開關(guān),就是一個簡單的有限狀態(tài)機挽拂。它有兩種狀態(tài):開和關(guān)骨饿。
優(yōu)點
因為它編程快速簡單台腥,易于調(diào)試,性能高黎侈,與人類思維相似從而便于梳理闷游,靈活且容易修改
數(shù)據(jù)結(jié)構(gòu)中的理解
FSM本質(zhì)上是張連通圖峻汉。
每個節(jié)點之間滿足一定條件之后可以相互轉(zhuǎn)化
實例分析
FSM的結(jié)構(gòu)和邏輯整體結(jié)構(gòu)分為4個部分AIControllerFSMIStateMoveState, AttackState, IdleState, DieState解釋:1.其中AIController用于實現(xiàn)各種行為動作,它作為AI行為動作的控制器.2.FSM用于存放判斷參數(shù)和統(tǒng)一調(diào)用各狀態(tài)機3.IState狀態(tài)機接口,等待各種狀態(tài)機實現(xiàn)其功能4.各種State,每個狀態(tài)機內(nèi)部實現(xiàn)開關(guān)邏輯實現(xiàn)FSM創(chuàng)建一個AIController創(chuàng)建一個AIController,綁定在怪物身上,用于控制怪物做什么事情public class AIController : MonoBehaviour { public FSM fsm; void Start () { fsm = GetComponent ();
? ? ? ? fsm.ac = this;
? ? ? ? //初始化一個默認狀態(tài)機
? ? ? ? fsm.ChangeState(new MoveState());
? ? }
? ? public void Move(){
? ? ? ? Debug.Log("move");
? ? }
? ? public void Attack(){
? ? ? ? Debug.Log("attack");
? ? }
創(chuàng)建一個FSM
FSM用于傳遞狀態(tài)機,創(chuàng)建一個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);
? ? ? ? }
? ? }
}
創(chuàng)建一個狀態(tài)機接口:IState
public interface IState{
? ? void Execute(AIController ac);
}
創(chuàng)建多個狀態(tài)機
在狀態(tài)機中實現(xiàn)判斷和調(diào)用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());
? ? ? ? }
? ? }
}