URL
status
type
date
slug
summary
tag
category
password
icon
FSM框架1. StateType 枚举2. IState 接口3. Blackboard 类4. FSM 类属性和构造函数方法FSM框架源码用户定义脚本(使用案例)1.ObjectBlackboard2.状态枚举3.状态类(对IState的实现)状态机组件类
参考类图
食用方式:框架源码+用户定义脚本(直接复制粘贴框架源码,只有自定义脚本要根据需求来写)
FSM框架
有限状态机 (Finite State Machine,简称FSM) 系统,用于管理对象在不同状态之间的转换,其具体实现由
StateType
,IState
,Blackboard
,FSM
这四部分组成。这个FSM 系统提供了一种灵活的方式来管理对象的不同状态。通过定义状态接口和状态类型枚举,可以轻松地添加、切换和更新状态,同时共享数据通过黑板类进行管理。这个系统非常适用于需要复杂状态管理的游戏对象,比如敌人 AI、角色行为等。
1. StateType
枚举
定义了各种状态类型:
这些状态类型可以用于标识不同的行为状态,如站立,寻找敌人,攻击等等,需要什么状态依照游戏需要实现的功能而定。
2. IState
接口
定义了状态接口,所有具体的状态类都需要实现这个接口
该接口包含三个方法:
OnEnter()
: 进入状态时调用。
OnExit()
: 退出状态时调用。
OnUpdate()
: 每帧更新时调用。
OnCheck()
:条件检查时调用。
OnFixedUpdate()
: 固定更新时调用。
3. Blackboard
类
用于存储共享数据或配置数据:
此类标记为
[Serializable]
,意味着它可以被序列化,适用于 Unity 的 Inspector 界面。4. FSM
类
管理状态转换的有限状态机类:
属性和构造函数
属性
curState
: 当前状态。
states
: 一个字典,存储状态类型和对应的状态对象。
blackboard
: 共享数据的黑板对象。
构造函数
方法
AddState(StateType stateType, IState state)
: 添加状态到字典中,如果状态类型已存在则输出日志信息。
SwitchState(StateType stateType)
: 切换当前状态到指定状态,如果当前状态存在则调用其OnExit()
方法,切换到新状态并调用其OnEnter()
方法。
OnUpdate()
: 调用当前状态的OnUpdate()
方法。
未实现的方法
OnFixedUpdate()
和 OnCheck()
被注释掉了,可能在未来的扩展中会用到。FSM框架源码
用户定义脚本(使用案例)
温馨提示:如果代码量较大,建议分为多个脚本,这样可读性会好很多,管理起来也方便。
1.ObjectBlackboard
游戏物体的黑板类,存放在各个状态之间共享,可在检视器中配置FSM组件的变量,这里之所以选择继承是为了只针对一类游戏物体,以便于隔离区分不同种游戏物体的黑板类。
AI托管的游戏物体可以是小怪,可以是NPC,甚至可以是小道具或者建筑,这里以敌人Enemy为例。
2.状态枚举
3.状态类(对IState的实现)
实现IState中的状态的处理逻辑,比如进入状态时做什么,退出状态时做什么,在状态中做什么等。
Idle状态
Move状态
状态模版
状态机组件类
在本文的所有脚本中,只有这个脚本是继承了MonoBehaviour的。因此,只需要将这个脚本挂载到想要使用状态机的游戏物体上即可。检视器中,该组件的可配置变量在黑板类中被定义。
状态机需要拥有什么状态,直接用一行代码通过AddState函数添加即可。状态的具体切换逻辑基本上都可以在状态类中进行实现,除设置初始状态外,大部分情况下状态切换都无需在组件类中添加。
- 作者:Cloud
- 链接:https://cloud09.xyz/article/bffb411c-e95d-40c3-a24a-0403f546ca5e
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。