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),由行为树 / 状态树读黑板决定下一步——决策层永远主动轮询,而不是被动被回调驱动。
