中EN
精修课概念页

GOAP:只告诉 AI 想要什么,让它自己排步骤

Goal-Oriented Action Planning

更新于 2026-10-19 约 13 分钟游戏AIGOAP规划STRIPSF.E.A.R.Orkin

门被堵了,它跳了窗

在《F.E.A.R.》里,你把门堵住,冲过来的士兵会先踢门;踢不开,他就转身从窗户跳进来。没有哪个程序员写过「如果门被堵就去跳窗」这条规则——这串行动是 AI 在运行时自己规划出来的。

Jeff Orkin 在讲 F.E.A.R. 的 AI 时说过:单独实现找掩体、盲射、扔手雷都不难,难的是这些行为互相纠缠的时候,手工维护状态机里的转换。他的办法是把「何时切换、切到哪」从状态机里拿走,交给一个规划器。这个系统叫做目标导向行动规划 (Goal-Oriented Action Planning, GOAP)。

三个状态和一个计划

F.E.A.R. 角色的状态机只有三个状态:Goto(走到某处)、Animate(播一段动画)和 UseSmartObject(使用场景里的交互物体),后两者本质上都是播动画。状态机本身不再决定「下一步干什么」,只负责把规划器给的每一步执行出来。

flowchart LR
  G["目标:消灭敌人"] --> P["A* 规划器"]
  AS["行动集:攻击、装弹、去掩体……"] --> P
  WS["当前世界状态"] --> P
  P --> Plan["行动序列"]
  Plan --> FSM["执行:Goto / Animate"]

规划器的输入是目标、行动集和当前的世界状态,输出是一串行动;每个行动激活时,再去设置执行层状态机的状态和参数。

规划的骨架:目标、前提、效果

GOAP 的规划方式近似经典的 STRIPS 规划:

  • 目标是一个期望的世界状态,比如「威胁已消除」;
  • 行动有前提 (Precondition) 和效果 (Effect):前提满足才能执行,执行后效果会改写世界状态;
  • 计划就是一条行动链,能把当前的世界状态一步步变成目标状态。

动手:拿枪,还是近战

用一个自己编的小例子把规划走一遍。世界状态只有三项:有没有枪、枪有没有上膛、敌人死没死。现在的状态是「没枪、没上膛、敌人活着」,目标是「敌人死亡」。士兵有四个行动:

行动前提效果成本
捡枪无有枪1
装弹有枪已上膛1
开枪已上膛敌人死亡1
近战无敌人死亡5

把每一种世界状态看成图上的一个节点,每个能执行的行动看成一条边,边的长度就是行动的成本。规划,就是在这张图上找一条从当前状态走到「敌人死亡」的最短路:

flowchart LR
  S0["没枪 · 没上膛 · 敌人活着"] ==>|"捡枪 1"| S1["有枪 · 没上膛 · 敌人活着"]
  S1 ==>|"装弹 1"| S2["有枪 · 已上膛 · 敌人活着"]
  S2 ==>|"开枪 1"| G1["有枪 · 敌人死亡"]
  S0 -->|"近战 5"| G2["没枪 · 敌人死亡"]
  S1 -->|"近战 5"| G3["有枪 · 没上膛 · 敌人死亡"]

粗箭头那条路总成本是 3,直接近战是 5,所以规划器选了「捡枪 → 装弹 → 开枪」。这张图的节点是世界状态,不是地图上的位置;用来搜它的,正是寻路里那个 A*。

现在把行动集换掉,目标不变:

  • 刺客的行动集里没有枪械类行动,只能近战——同一个目标,规划出完全不同的行为;
  • 老鼠根本没有攻击行动,规划失败,于是退回去巡逻。

这就是 Orkin 说的第一个收益:目标和行动解耦。士兵、刺客、老鼠可以共用同一套目标,各自的行动集决定它们表现成什么样;后来加进游戏的无人机,也能用现成的目标和行动拼出来。

GOAP 对 STRIPS 做的四处实用化

学术上的 STRIPS 直接搬进游戏不够用,Orkin 做了四处改动:

改动做法为什么
行动有成本每个行动带一个 cost,用 A* 搜成本最低的计划同一个目标有多种做法时,能表达「更倾向哪种」
固定大小的世界状态用一个固定长度的数组表示世界状态,不用 STRIPS 的增删列表便于在规划时把前提和效果链式匹配起来
过程式前提昂贵的检查(比如「有没有逃跑的路」)在规划时按需计算不必把所有可能用到的事实都常驻在世界状态里
过程式效果行动激活时,直接设置执行层状态机的状态和参数把计划和执行连起来

叠加与重规划

第二个收益是分层叠加:开火、闪避、近战、找掩体、盲射、换掩体、喊话,每一项都是一个简单的行动,叠在一起就成了复杂的战术,不需要手画一张完整的转换图。

第三个收益是失败后重规划,也就是开头那一幕:

flowchart LR
  A["计划:走到门 → 踢门 → 冲进去"] --> B["踢门失败:门被堵住了"]
  B --> C["重新规划"]
  C --> D["新计划:走到窗 → 跳窗 → 近战"]

计划执行到一半发现走不通,就以当前的世界状态为起点重新规划。AI 看起来像是在「临场想办法」。

小队:命令加个体的判断

F.E.A.R. 的小队协调并不复杂:全局协调器按距离把附近的士兵重新分组,简单的小队行为发出「命令」,比如一起找掩体、一人压制其他人推进;每个士兵再按自己目标的优先级决定服不服从——逃命的优先级比前进高。

玩家眼里那些「包抄」「钳形攻势」,很多时候并不是专门的小队规划,而是每个士兵各自找掩体、各自寻路的结果凑出来的。小队喊话也是在行为决定之后才补上的,用来制造「他们听懂了命令」的错觉。要做更重的并行协调,Orkin 指向的后续方向是分层任务网络 (HTN)。

在游戏里怎么用

取舍与常见的坑

小结与练习

  • GOAP 让行动带上前提、效果和成本,用 A* 在世界状态图上搜成本最低的计划;
  • F.E.A.R. 的状态机只剩三个状态,「下一步干什么」交给规划器;
  • 三大收益:目标和行动解耦、简单行为叠加出复杂战术、失败后重规划;
  • 代价是世界状态的设计、行动的作者纪律和规划的 CPU。

练习:在拿枪的例子里再加两个行动:「捡手雷」(前提无,效果有手雷,成本 1)和「扔手雷」(前提有手雷,效果敌人死亡,成本 1)。画出新的状态图,算一算哪条计划最便宜。如果附近根本没有枪可捡,计划又会变成什么?

  1. Three States and a Plan: The A.I. of F.E.A.R.(笔记) Jeff Orkin, Three States and a Plan (GDC 2006)
  2. alumni.media.mit.edu/~jorkin/gdc2006_orkin_jeff_fear.pdf
  3. alumni.media.mit.edu/~jorkin/goap.html
  4. Handling Complexity in the Halo 2 AI(笔记) Isla 2005(复杂度背景,Orkin 引用)

相关页面

游戏开发游戏 AI 决策管线Game AI Sense-Decide-Act Pipeline游戏 AI(与生成式 DNN 不同)通常按 感知 → 决策 → 执行 分层:底层是寻路、感知与记忆;中层是角色控制(对接动画/物理);上层是目标与决策(行为树、效用、规划等)。GEA 强调「perception is reality」——玩家看不见的内部聪明不算数。游戏开发决策架构选型:FSM、行为树与效用Choosing FSM, Behavior Tree & Utility AIFSM 强在少量离散状态与硬转换;行为树强在优先级回退与模块化任务;效用强在连续权衡与数据驱动调参;GOAP 强在声明式动作组合与重规划。实作常分层混用,而不是四选一宗教战。游戏开发状态模式与有限状态机State Pattern & Finite State Machines状态模式 (State Pattern) 把对象“依赖状态的行为”分散到各个状态类中,对象只持有指向当前状态的指针并把调用委托给它,状态切换就是换指针。它是实现有限状态机 (Finite State Machine, FSM) 的一种方式。FSM 能用很强的结构约束理清一团乱麻的标志位代码;状态组合爆炸、需要复用和需要“回到之前状态”时,分别用并发状态机、分层状态机和下推自动机来扩展。游戏开发行为树原理Behavior Tree Fundamentals行为树 (Behavior Tree, BT) 用层级节点控制决策流:叶子做动作或条件,Sequence / Selector 等组合节点决定子节点如何推进;节点返回 Success / Failure / Running,从而自然跨多帧。相对 FSM,BT 更易用优先级回退表达「失败了还有 Plan B」。游戏开发黑板架构Blackboard Architecture黑板 (Blackboard) 是多模块共享的「工作记忆」:感知写入、决策读取、任务更新键值,避免各子系统用私有状态互相耦合。行为树的 Data Context、GOAP 的 Working Memory、Halo 的 Props,都是同一思想的变体。游戏开发寻路与导航理论基础Pathfinding & Navigation Theory寻路是在图上找代价可接受的路径:BFS / Dijkstra / A 是同一家族;NavMesh、路点、格子是不同的图构建方式。分层(走廊↔房间、扇区↔网格)与「全局路径 + 局部避障」把大规模导航拆开。A 本身不管编队、动态挤让与动画根运动。游戏开发群体与阵型行为Group & Formation Behaviors群体行为分两路:涌现式(Boids 分离/对齐/聚合)适合鱼群鸟群与背景人流;编排式(小队命令、阵型槽位、订单/风格)适合战术 AI。F.E.A.R. 表明复杂「侧翼」常可由个体目标 + 导航涌现,不必重型小队规划器。游戏开发 · UE5行为树与 StateTreeBehavior Tree & StateTreeUE 的 AI 决策有两套工具:行为树 (Behavior Tree) + 黑板 (Blackboard) 是事件驱动的,条件写成装饰器 (Decorator),用 Simple Parallel、Services 和 Observer Aborts 代替传统并行节点;StateTree 是结合了行为树选择器和状态机转换的通用分层状态机,只在转换触发时按需选择状态,激活路径上的任务并发运行,通过属性绑定传递数据,也是 Mass 的行为层。优先级抢占多的战斗 AI 适合行为树,状态显式、分层或大规模的场景适合 StateTree。

被这些页面引用1 篇

输入关键词开始搜索

滚轮或双指缩放 · 拖动平移 · 双击放大 / 还原