AI之有限状态机

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

----对于有限状态机的考虑-----------------------------
  例如被攻击后转向敌人,释放技能后切换到休息状态,如果敌人过于强大会逃跑,这些问题首先直观的使用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();
    }
}  






转载于:https://www.cnblogs.com/cathytong/p/6128403.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值