在Unity中实现有限状态机

作者: 超级大柱子 | 来源:发表于2016-02-02 23:21 被阅读6088次

    简介

    有限状态机,(英语: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());
            }
        }
    }
    

    相关文章

      网友评论

        本文标题:在Unity中实现有限状态机

        本文链接:https://www.haomeiwen.com/subject/vfqekttx.html