有限状态机:通过代码根据游戏体当前的状态,使游戏体做出状态对应的行为
使用原因:降低代码耦合性,使逻辑清晰,扩展性强
StateBase类
1.创建状态ID
2.状态机:Machine类型 machine
3.构造函数:传递ID值 初始化
1 的ID值
4.OnEnter 进入状态 --传递object参数
5.OnStay 保持状态
6.OnExit 退出状态
StateTemplate类
--
状态属于哪一个角色 继承Base类
1.定义状态的拥有者 T类型 m_owner
2.构造函数 获取ID值和T类型变量 向父类构造传递ID
T类型变量初始化
1
的值
--状态的保留切换等 状态机类
1.创建字典 键ID,值存储状态 m_StateCache
2.定义Base类变量
m_CurrentState用来保存当前角色执行的状态
3.定义另外一个Base类变量
m_PreviousState用来保存当前角色执行的上一个状态
4.构造函数
传递Base类变量 beganState
m_CurrentState等于beganState
实例化字典变量
调用存储状态方法RegisterState(beganState)
beganState.OnEnter --开始状态的执行
5.存储状态方法 RegisterState(StateBase aState)
局部变量id 等于 aState.ID
判断字典中是否有该键值 字典名.ContainsKey(键名) 有就return
字典内存储 键值为id 值为aState
aState的状态机变量等于this
6.状态保持方法 FSMUpdate()
判断当前状态不为空,m_CurState.OnStay()
7.状态切换方法 TransLateToState(int id,params object[] args)
查找字典是否有该id键值 没有return结束 有继续
上一个状态等于当前状态 m_PreviousState= m_CurrentState
当前状态等于字典内id键值对应的状态 m_PreviousState=m_StateCache[id]
当前状态进入 m_PreviousState.OnEnder()
实现效果
1.创建默认状态类IdleState 游戏体挂载控制类PlayControl
2.IdleState类 --默认状态类 AttackState--攻击状态类 RunState--奔跑状态类
(三个状态类的内容只是不同状态下的不同逻辑)
IdleState继承自
StateTemplate<
PlayControl
>
IdleState构造函数传递id值和PlayControl类 owner
IdleState类重写父类OnEnder,OnStay,OnExit方法 --方法内写入具体状态逻辑
3.PlayControl类
创建枚举PlayerStates 存储状态类型
定义状态机变量,Animator 变量,枚举变量并初始化
初始化状态机,并向状态机中字典传递键值id和状态
通过按键控制 改变枚举状态值 执行状态改变方法