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






posted @ 2016-12-03 12:33  TTT童童童  阅读(946)  评论(0编辑  收藏  举报