FSM框架-有限状态机 分段例子代码

有限状态机:通过代码根据游戏体当前的状态,使游戏体做出状态对应的行为
使用原因:降低代码耦合性,使逻辑清晰,扩展性强

StateBase类 
1.创建状态ID
2.状态机:Machine类型 machine
3.构造函数:传递ID值  初始化 的ID值
4.OnEnter 进入状态  --传递object参数
5.OnStay  保持状态
6.OnExit 退出状态
FSM框架-有限状态机 分段例子代码

StateTemplate<T>类  
   --状态属于哪一个角色 继承Base类
1.定义状态的拥有者 T类型  m_owner
2.构造函数  获取ID值和T类型变量 向父类构造传递ID 
    T类型变量初始化1的值
FSM框架-有限状态机 分段例子代码

StateMachine类 
  --状态的保留切换等 状态机类
1.创建字典 键ID,值存储状态  m_StateCache
2.定义Base类变量  
   m_CurrentState用来保存当前角色执行的状态
3.定义另外一个Base类变量  
   m_PreviousState用来保存当前角色执行的上一个状态
4.构造函数  
   传递Base类变量 beganState
    m_PreviousState为null
    m_CurrentState等于beganState
    实例化字典变量 
    调用存储状态方法RegisterState(beganState)
    beganState.OnEnter   --开始状态的执行
FSM框架-有限状态机 分段例子代码
 5.存储状态方法 RegisterState(StateBase aState)
    局部变量id 等于 aState.ID
    判断字典中是否有该键值 字典名.ContainsKey(键名) 有就return
    字典内存储 键值为id 值为aState
    aState的状态机变量等于this
FSM框架-有限状态机 分段例子代码
 6.状态保持方法 FSMUpdate()
     判断当前状态不为空,m_CurState.OnStay()
FSM框架-有限状态机 分段例子代码
7.状态切换方法 TransLateToState(int id,params object[] args)
   查找字典是否有该id键值 没有return结束 有继续
   上一个状态等于当前状态 m_PreviousState= m_CurrentState
   当前状态等于字典内id键值对应的状态 m_PreviousState=m_StateCache[id]
   当前状态进入  m_PreviousState.OnEnder()
FSM框架-有限状态机 分段例子代码

实现效果
1.创建默认状态类IdleState  游戏体挂载控制类PlayControl
2.IdleState类  --默认状态类    AttackState--攻击状态类    RunState--奔跑状态类
   (三个状态类的内容只是不同状态下的不同逻辑)
   IdleState继承自StateTemplate<PlayControl>
   IdleState构造函数传递id值和PlayControl类 owner 
   向父类构造传(:base) id 和 owner
   IdleState类重写父类OnEnder,OnStay,OnExit方法 --方法内写入具体状态逻辑
FSM框架-有限状态机 分段例子代码
3.PlayControl类
   创建枚举PlayerStates 存储状态类型
   FSM框架-有限状态机 分段例子代码
   定义状态机变量,Animator 变量,枚举变量并初始化
FSM框架-有限状态机 分段例子代码
    初始化状态机,并向状态机中字典传递键值id和状态
    FSM框架-有限状态机 分段例子代码
    通过按键控制 改变枚举状态值 执行状态改变方法
FSM框架-有限状态机 分段例子代码FSM框架-有限状态机 分段例子代码
    LateUpdate方法里执行保持方法
FSM框架-有限状态机 分段例子代码