• AI之有限状态机


    ----什么是有限状态机-----------------------------------
      有限状态机拥有有限数量的状态,并且每一个状态可以切换到0个或多个状态,输入决定了下一个状态的迁移。
      有限状态机分为两种:确定性非确定性,并且非确定性的有限状态机可以转换为确定性有限状态机。

    ----对于有限状态机的考虑-----------------------------
      例如被攻击后转向敌人,释放技能后切换到休息状态,如果敌人过于强大会逃跑,这些问题首先直观的使用if else语句,可以这样但是通常非常难以写出来,而且的修改会很麻烦,这时候可用使用“有限状态机”来解决。

    ----模块设计-------------------------------------------
    State:是有限状态机的基类,它是一个抽象类,其中包含了一些通用的成员和方法。作为一个基类,是可以被子类继承的,所以方法是virtual的,以便于实现多态。使用时可以继承自State,可以override基类的OnEnter / OnTick / OnExit 等方法实现个性化的一些操作。

    public abstract class State
    {
        protected State(Character character)
        {
            Character = character;
        }
        public Character Character { getprivate set; }
        public virtual void OnEnter()
        {
        }
        public virtual State OnTick()
        {
            return this;
        }
        public virtual void OnExit()
        {
        }
    }
    public class Idle : State
    {
        public Idle(Character character)
            : base(character)
        {
        }
        public override State OnTick()
        {
            Character.Play(Character.Idle);
            return this;
        }
    }  


    ----具体实现-------------------------------------------
    public abstract class Character : MonoBehaviour
    {
        private State state;
        //表示当前状态
        public State State
        {
            get
            {
                return state;
            }
            protected set
            {
                if (state == null)
                    state = new Idle(this);
                if (state != value)
                {
                    var old_state = state;
                    state = value;
                    //通知状态切换
                    OnStateChanged(state, old_state);
                    //调用上一个状态的退出方法
                    old_state.OnExit();
                    //进入当前当前状态
                    state.OnEnter();
                }
            }
        }
        protected virtual void OnStateChanged(State new_state, State old_state)
        {
        }
        void Update()
        {
            if (State != null)
                //在每一帧调用当前状态的OnTick方法,根据其返回值切换状态
                State = State.OnTick();
        }
    }  






  • 相关阅读:
    2020年7月15日Java学习日记
    2020年7月14日Java学习日记
    2020年7月13日Java学习日记
    2020年7月12日Java学习日记
    2020年7月11日Java学习日记
    2020年7月10日Java学习日记
    2020年7月9日Java学习日记
    2020年7月8日Java学习日记
    链式栈(Chain stack)
    Codeforces-1375-D-Replace by MEX
  • 原文地址:https://www.cnblogs.com/cathytong/p/6128403.html
Copyright © 2020-2023  润新知