zoukankan      html  css  js  c++  java
  • 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();
        }
    }  






  • 相关阅读:
    mysql int类型 int(11) 和int(2)区别
    mysql 用户 登陆 权限相关
    【转】ext4+delalloc造成单次写延迟增加的分析
    write 系统调用耗时长的原因
    【转】通过blktrace, debugfs分析磁盘IO
    win7 wifi热点
    【SystemTap】 Linux下安装使用SystemTap源码安装SystemTap
    pdflush进程介绍与优化【转】
    How to find per-process I/O statistics on Linux
    oom_killer
  • 原文地址:https://www.cnblogs.com/cathytong/p/6128403.html
Copyright © 2011-2022 走看看