URL
status
type
date
slug
summary
tags
category
password
icon
参考类图
notion image
食用方式:框架源码+用户定义脚本(直接复制粘贴框架源码,只有自定义脚本要根据需求来写

FSM框架

有限状态机 (Finite State Machine,简称FSM) 系统,用于管理对象在不同状态之间的转换,其具体实现由StateTypeIStateBlackboardFSM这四部分组成。
notion image
这个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函数添加即可。状态的具体切换逻辑基本上都可以在状态类中进行实现,除设置初始状态外,大部分情况下状态切换都无需在组件类中添加。
 
相关文章
Global Game Jam历年主题及解读
Lazy loaded image
探索美学风格:旧核、梦核与怪核的特征及区别
Lazy loaded image
Unity中不同光照的渲染顺序
Lazy loaded image
Miku的一年四季
Lazy loaded image
基于Excel的对话系统
Lazy loaded image
Unity实现多人联机(基于Mirror+Steamworks)
Lazy loaded image
游戏开发小团队的项目与开发建议Unity音频管理框架
Loading...
Cloud
Cloud
Free writing
最新发布
RPG Maker MZ素材规格
2025-1-17
Project Pianting设计文档
2025-1-7
第一年
2025-1-6
水族馆
2025-1-6
Flow in Games
2025-1-6
MISIDE текстовое интервью с разработчиком
2025-1-6
公告