Unity 中用有限状态机来实现一个 AI
最近在阅读《游戏人工智能编程案例精粹(修订版)》,本文是书中第二章的一篇笔记。
有限状态机(英语:Finite-state machine, 缩写:FSM),是一个被数学家用来解决问题的严格形式化的设备,在游戏业中也常见有限状态机的身影。
对于游戏程序员来说,可以用下面这个定义来了解:
一个有限状态机是一个设备(device),或是一个设备模型(a model of a device)。具有有限数量的状态,它可以在任何给定的时间根据输入进行操作,是的从一个状态变换到另一个状态,或者是促使一个输出或者一种行为的发生。一个有限状态机在任何瞬间只能处在一种状态。
——《游戏人工智能编程案例精粹(修订版)》 Mat Buckland
有限状态机就是要把一个对象的行为分解成易于处理的“块”或者状态。拿某个开关来说,我们可以把它分成两个状态:开或关。其中开开关这个操作,就是一次状态转移,使开关的状态从“关”变换到“开”,反之亦然。
拿游戏来举例,一个 FPS 游戏中的敌人 AI 状态可以分成:巡逻、侦查(听到了玩家)、追逐(玩家出现在 AI 视野)、攻击(玩家进入 AI 攻击范围)、死亡等,这些有限的状态都互相独立,且要满足某种条件才能从一个状态转移到另外一个状态。
有限状态机由三部分组成:
- 存储任务信息的一些状态(states),例如一个 AI 可以有探索状态、追踪状态、攻击状态等等。
- 状态之间的一些变换(transitions),转移代表状态的转移,并且描述着状态转移的条件。例如听到了主角的脚步声,就转移到追踪状态。
- 需要跟随每个状态的一系列行为(actions)。例如在探索状态,要随机移动和找东西。
下图是只有三种状态的 AI 的有限状态机图示:
优缺点
实现有限状态机之前,要先了解它的优点:
- 编程快速简单:很多有限状态机的实现都较简单,本文会列出三种实现方法。
- 易于调试:因为行为被分成单一的状态块,因此要调试的时候,可以只跟踪某个异常状态的代码。
- 很少的计算开销:几乎不占用珍贵的处理器时间,因为除了 if-this-then-that 这种思考处理之外,是不存在真正的“思考”的。
- 直觉性:人们总是自然地把事物思考为处在一种或另一种状态。人类并不是像有限状态机一样工作,但我们发现这种方式下考虑行为是很有用的,或者说我们能更好更容易地进行 AI 状态的分解和创建操作 AI 的规则,容易理解的概念也让程序员之间能更好地交流其设计。
- 灵活性:游戏 AI 的有限状态机能很容易地由程序员进行调整,增添新的状态和规则也很容易扩展一个 AI 的行为。
有限状态机的缺点是:
- 当状态过多时,难以维护代码。
- 《AI Game Development》的作者 Alex J. Champandard 发表过一篇文章《10 Reasons the Age of Finite State Machines is Over》
if-then 实现
这是第一种实现有限状态机的方法,用一系列 if-then 语句或者 switch 语句来表达状态。
下面拿那个只有三个状态的僵尸 AI 举例:
1 | public enum ZombieState |