一、FSM基础:什么是有限状态机、状态与转移的核心概念、FSM在游戏AI中的应用场景

大家好,我是你们这门课的老朋友。今天咱们来聊聊游戏AI里最基础、也最实用的一个概念——有限状态机。英文叫Finite State Machine,简称FSM。

说实话,我入行那会儿,第一个真正上手的AI系统就是FSM。那时候带我的老工程师跟我说:“小子,别小看这玩意儿,它虽然简单,但90%的游戏AI都能用它搞定。”我当时还不信,后来做了十几年项目,发现还真是这么回事。

什么是有限状态机?

有限状态机,说白了就是一个“有固定数量状态”的机器。它同一时间只能处于一个状态,然后根据输入的事件或条件,从一个状态切换到另一个状态。

我习惯这么理解:它就像你手机里的“勿扰模式”。你打开它,手机就进入“静音”状态;你关掉它,又回到“正常”状态。就这么简单。

FSM有三个核心要素:

  • 状态(State):系统当前所处的模式或情况
  • 转移(Transition):从一个状态切换到另一个状态的过程
  • 事件/条件(Event/Condition):触发转移的原因

核心要点:FSM的“有限”二字很关键。状态数量是确定的、可枚举的。你不能有无限个状态,否则就不叫有限状态机了。

状态与转移的核心概念

咱们先聊聊状态。状态是什么?它代表一个对象在某个时刻的“行为模式”或“属性集合”。

举个例子,一个游戏里的NPC守卫:

  • 巡逻状态:沿着固定路线走,偶尔停下来看看
  • 警觉状态:听到可疑声音,停下来仔细听
  • 战斗状态:发现敌人,开始攻击
  • 逃跑状态:血量太低,转身就跑

每个状态都对应一套特定的行为逻辑。在巡逻状态下,NPC不会去攻击;在战斗状态下,它也不会继续巡逻。这就是状态的意义——它决定了“当前该做什么”。

再来说转移。转移就是状态之间的“跳转”。它需要满足一定的条件才会发生。

我画个简单的转移规则:

巡逻 → 警觉:当听到异常声音
警觉 → 战斗:当确认敌人位置
战斗 → 逃跑:当血量 < 20%
战斗 → 巡逻:当敌人被消灭
逃跑 → 巡逻:当脱离战斗且血量恢复

你看,每个转移都有明确的触发条件。这就是FSM的设计精髓——把复杂的行为拆解成清晰的“状态+转移”对。

我的小经验:设计FSM时,我习惯先画出所有状态,再画转移线。别一上来就想着转移条件,先把“有哪些状态”搞清楚,后面的事就顺了。

FSM在游戏AI中的应用场景

FSM在游戏AI里用得特别广。我挑几个典型的场景说说:

1. 敌人AI

这是最常见的应用。从早期的《吃豆人》到现在的3A大作,敌人AI几乎都离不开FSM。

我记得做《XX传奇》那会儿,我们给每个小怪设计了5个状态:

状态 行为 转移条件
空闲 原地站立,偶尔打哈欠 玩家进入警戒范围
巡逻 沿路径走动 发现玩家
追击 朝玩家移动 进入攻击范围
攻击 释放技能或普通攻击 玩家跑出范围
返回 回到初始位置 回到巡逻点

这个结构简单吧?但实际跑起来效果特别好。玩家会觉得这个怪物“有脑子”——它会追你,打不到你会追,追不上还会回去。其实背后就是几个状态在来回切换。

2. 角色动画控制

你可能没意识到,角色动画系统本质上也是一个FSM。站立、走路、跑步、跳跃、攻击……每个动画状态之间都有明确的转移条件。

我曾经踩过一个坑:做跳跃动画时,忘记加“落地”这个转移条件。结果角色跳起来后就一直飘在空中,怎么都下不来。后来排查了半天,才发现是FSM里少了一条转移线。

避坑指南:设计FSM时,一定要检查“死循环”和“死状态”。死循环就是状态A→B→A→B永远出不来;死状态就是某个状态进去后,没有任何转移条件能出来。这两种情况我都遇到过,调试起来特别头疼。

3. 游戏流程控制

FSM还能用来控制游戏的整体流程。比如:

  • 加载状态 → 显示加载画面
  • 菜单状态 → 显示主菜单
  • 游戏状态 → 正式游戏
  • 暂停状态 → 暂停游戏
  • 结算状态 → 显示结果

每个状态之间通过玩家操作或系统事件来转移。这个结构清晰,维护起来也方便。

4. 队友AI

队友AI比敌人AI复杂一些,因为队友需要配合玩家行动。但FSM依然能胜任:

  • 跟随状态:跟在玩家身后
  • 战斗状态:攻击玩家正在打的敌人
  • 救援状态:玩家血量低时,跑过去加血
  • 探索状态:玩家不动时,在附近搜索物品

每个状态都对应一套行为逻辑,转移条件也相对明确。嗯,这里要注意一点:队友AI的状态转移条件往往需要结合玩家的状态来判断,不能只看自己。

FSM的优缺点

说了这么多好处,我也得客观说说FSM的短板。

优点:

  • 简单直观,容易理解和实现
  • 调试方便,状态和转移一目了然
  • 性能开销小,适合大量AI单位
  • 团队协作友好,设计师也能看懂

缺点:

  • 状态数量多了以后,转移线会变得很乱(我管这叫“状态爆炸”)
  • 难以处理复杂的并行行为
  • 扩展性有限,加一个新状态可能要改很多转移条件

我的建议:如果你的AI系统状态不超过10个,FSM是最佳选择。超过10个,我建议考虑用行为树或者分层状态机。这个咱们后面章节会详细讲。

小结

今天咱们聊了FSM的基础知识。说白了,它就是一套“状态+转移”的规则系统。你给它一个当前状态,再给它一个输入条件,它就能告诉你下一步该做什么。

FSM虽然简单,但千万别小看它。我见过不少项目,用FSM做出了非常聪明的AI。关键不在于技术多复杂,而在于你如何设计状态和转移规则。

下一章,咱们会深入聊聊如何用代码实现一个FSM。我会带着大家手写一个简单的FSM框架,到时候你就知道这东西到底有多实用了。

好,今天就到这儿。有什么问题,咱们课后交流。