AstraAI · 调试与排查

从初始化到候选、机会、应用层与后端,沿真实运行路径定位 AI 没有行动的原因。

本页内容5 节

打开项目的 AI 面板

在非 Shipping 游戏中按 F1 打开 HaloDebug 输入,再打开 AI 菜单。Starry 当前注册了以下窗口,它们共享项目的 AI 调试会话。

菜单主要查看内容
AI → Agents选择与定位当前 AI
AI → AstraBehavior当前组合决策与行为执行
AI → Objectives当前机会与生成器相关数据
AI → Modifiers应用层及组合结果
AI → BehaviorTreeBT 后端
AI → StateTreeStateTree 后端
AI → HTNHTN 后端
AI → Blackboard实际黑板数据

这里的窗口是 Starry 项目通过 HaloDebug 注册的面板。插件提供真实运行事件,项目会话组织显示;不会为了打开调试窗口重新调用一遍评分来生成“历史结果”。

按运行链定位

AI 不行动时先确认哪一层没有完成关系 / 流程
正在整理图表…
AI 不行动时先确认哪一层没有完成
查看图表源码
flowchart TD
  Begin(AI 没有行动) --> Ready{Controller Ready?}
  Ready -->|否| Setup(检查控制、Provider、软引用与失败通知)
  Ready -->|是| Layers{Modifier 已应用?}
  Layers -->|否| Apply(检查 Stack、来源与 Rejected 事件)
  Layers -->|是| Facts{条件与机会有效?}
  Facts -->|否| Objective(检查 Generator 更新与精确类)
  Facts -->|是| Choice{有可选行为?}
  Choice -->|否| Score(检查优先级、分数、冷却)
  Choice -->|是| Exec(检查当前 Logic、后端与清理)

常见现象与检查点

现象优先检查
没有 AstraAI BrainBrainType 是否为 Composition,Pawn 是否提供 AISetup,控制器是否运行在允许的世界
初始化直接停在 StoppedUStarryAISettings::bDisableLogic 是否开启;全局禁用时不会开始加载配置
初始化一直未完成软引用加载、ObjectiveSetup 与 ModifierStack、OnAISetupFailed 的原因
AISetup 资产校验失败是否填写有效的 PerceptionSenseProfile;新建感知配置还须检查感官与 DominantSense
新加 Modifier 没有效果不能只看 Handle;确认 Applied/Rejected,检查后层覆盖
有机会却不执行机会是否当前有效、是否精确类匹配、组条件、分数与冷却
高分行为没有抢占是否同级严格高分、当前是否 Critical、是否阻止普通中断
已切换配置却仍等待旧执行的 Cancel/Cleanup 与局部树是否安全结束
新执行被旧任务结束异步回调是否保存并校验原 ExecutionId
BT 看起来走完却按失败SingleRun 是否通过 FinishTree 明确报告结果

实时数据和历史值分清

AstraBehavior 树中,灰色表示条件失败、冷却或优先级阻挡;白色表示最近评估可用;黄色表示当前执行行为及其祖先组。[--] 表示尚无有效评分记录,条件失败后仍可保留最近一次真实分数,Normal 显示上次实际评估结果。

Timeline 记录启停、原因与当时的 Objective 内容,收起图表后仍可查看历史表。当前只采集所选角色;横轴为游戏秒,察觉曲线取 Starry 各目标累计察觉值的最大值,范围 0~1。

对象 Inspector 展示的是当前对象;历史查看需要会话在当时采集的值。不要拿当前共享模板或当前 Struct 地址,反推几秒前另一次执行的状态。

记录问题时同时写下 Controller、行为完整路径、应用 Handle、执行 Id、发生的世界和触发操作。这样能够判断是配置未应用、条件不满足、任务失败,还是回调代次错误。

验证改动时观察退出

先验证直接相关的成功与失败,再检查抢占、配置撤销、角色销毁与复用。若修正的是接入顺序,先确认原生初始化与通知是否完整,不把一次手动赋值或延迟能绕过问题当成根因证据。

HaloDebug 的操作与远程显示见调试工具入门和远程面板。执行清理规则见Logic 与生命周期。

实现入口:Source/StarryGame/Framework/Development/StarryDebugSubsystem 与 Framework/AI/Debug 下的窗口、FStarryAIDebugSession;运行事件定义位于 AstraAI 插件。

Starry手册导览从模块进入子模块与具体功能,查阅功能用途、配置步骤、技术架构和扩展方法。工程分层与系统协作了解 Framework、Gameplay 与通用插件的依赖方向,以及配置装配和运行状态的边界。模块总览与接入从行为系统、执行系统与机会调度了解 AstraAI,再为角色配置第一套组合决策。组合与覆盖正确区分优先级、行为分数与 Stack 顺序,按完整路径组织可撤销的配置。评分与抢占沿着条件、优先级、分数、持续有效性与冷却,解释一个行为为何开始或退出。Logic 与生命周期把动作接入 Start、Cancel、Cleanup,正确处理共享模板、蓝图实例与过期异步回调。BT、StateTree 与 HTN复用控制器上的树组件,正确传入数据、报告整树结果并等待安全退出。Objective 与机会生成把领域事实整理成当前机会,让评分只读数据,让生成器独立管理订阅。命令发布与领取发布一条命令后,经机会评估、Take、执行与 EndUse 完成一次受控使用。行为区域用可挂载的 Zone 组件分配行为层,并把回区机会与实际导航分开。调试与排查从初始化到候选、机会、应用层与后端,沿真实运行路径定位 AI 没有行动的原因。模块总览与使用了解通用调试工具的操作、远程连接与窗口扩展,再由各模块的排查说明定位具体问题。netImgui 远程面板在独立桌面程序查看调试窗口,区分远程 UI、游戏视口绘制与玩法网络权限。窗口扩展与属性绘制复用窗口生命周期、反射 Inspector 和场景绘制,避免为每个调试页重做基础设施。模块总览与接入从配置绑定、动作处理、通道缓存与玩家改键了解 Input,再接入角色的输入配置。绑定与配置生命周期理解跨 IMC 的共享绑定、配置所有权、延迟初始化,以及切换角色时的清理。Handler 与能力分派选择正确的输入阶段,把输入交给移动、GAS、GameplayEvent 或 UI,保持共享 Handler 无玩家状态。修饰器与双击选择输入值变换所在层,理解玩家设置修饰器与 Double Tap 的时序规则。通道输入缓存按 GameplayTag 通道开窗,保留首批或末批输入,正常关闭执行,中断取消丢弃。改键与玩家设置通过 GameSettings 统一编辑与应用,区分 SharedSettings 偏好和 Enhanced Input 键映射数据。调试与排查使用 Gamepad 与 Actions 观察和模拟输入,沿设备、映射、绑定、缓存与能力定位问题。模块总览与接入使用 UE 5.8 原生 Async Message System,把事件通知与接收方解耦,查阅消息收发、路由和 Starry 的实际接入。蓝图收发与解绑通过消息 Id、监听、载荷封装与解包的核心连线,掌握蓝图收发和任务解绑。C++ 收发与解绑按取得系统、登记监听、读取载荷、发送与解绑的顺序,查阅原生 C++ 接口用法。标签、时机与生命周期理解消息的标签层级、World 和 Endpoint 路由、游戏线程派发、载荷快照与 C++ 监听清理。项目消息与排查查阅 Starry 已接入的消息标签、载荷和触发点,区分本地通知、状态复制与 RPC 转发,并沿真实链路排查。模块总览与项目接入管理软引用加载、有序回调与任务作用域,了解指示器画布的实际接入,以及加载完成后的资源和宿主生命周期。软引用加载与 C++ 用法用组件加载软对象和控件类,保存加载结果,理解路径数组、同步回调、失败结果,以及重载与退出时的取消清理。主资产与资源驻留按主资产 ID 和 Bundle 预加载资源,理解句柄保留、取消与 GC 引用的关系,以及 AssetManager 和打包配置的职责。回调顺序与独立作用域理解并行加载与有序回调的区别,使用 FAsyncScope 分开取消任务,了解 AsyncEvent、开始完成通知和等待条件的当前边界。在文档中说明蓝图用法将真实蓝图节点嵌入正文,结合步骤、引脚和连线说明功能,节点文本随文章保存。维护这本手册本地文件与网页编辑共用一份 MDX,日常只改内容与关系,沿用共享版式和图表。