AIController 与 Pawn:控制权与分层

UE 的 AI 架构里有两个核心角色:Pawn(被控制的实体)和 AIController(控制者)。这个"控制者 / 被控者"分离是理解一切 AI 代码的钥匙。

Possess:控制权的建立

游戏开始时(或 AI 生成时),AIController 会 Possess(附身)一个 Pawn。之后:

  • AIController 持有决策组件(行为树组件、感知组件、状态树组件);
  • Pawn 持有表现与移动能力(网格、动画、移动组件)。
AIController(脑)
  ├ 感知组件:我看到了什么
  ├ 行为树组件:我该怎么想
  └ 黑板:我的记忆
       ↓ Possess / MoveTo
Pawn(身体)
  ├ 角色移动组件:怎么走
  ├ 动画蓝图:怎么演
  └ 碰撞与网格:我在哪

为什么不把 AI 写在 Pawn 里

把决策逻辑写进 Pawn 的蓝图,是新手最常做的事。代价:

  • 同一个Pawn 无法换脑:做一个"被玩家附身的 NPC"(比如控制城镇里的守卫)就要重写逻辑;
  • AI 死亡后 LostTarget 等状态无处安放:Pawn 销毁,记忆消失;
  • 复用难:不同类型的敌人想共享决策逻辑,只能复制蓝图。

正确做法:决策与记忆放 AIController 或其组件,Pawn 只管"动"。这也是官方 AI控制器 文档强调的分工。

常用 API 速查

需求 接口
让 AI 去某处 AIController → MoveToLocation / 行为树里的 MoveTo 节点
获取当前目标 黑板里的对象 / GetFocusActor
感知事件绑定 AIPerception 组件的 OnTargetPerceptionUpdated
失去控制 Unpossess(Pawn 死亡时 AIController 可以转而 Possess 别的)

一个常见的分层错误

把"移动完成"当作决策依据:MoveTo 的回调里直接写下一段行为("到了就开始攻击")。这把决策层寄生在移动层。更好的写法是:移动结果写进黑板(HasReached = true),由行为树 / 状态树读黑板决定下一步——决策层永远主动轮询,而不是被动被回调驱动。