AstraAI · 命令发布与领取

发布一条命令后,经机会评估、Take、执行与 EndUse 完成一次受控使用。

本页内容5 节

发布不会自动执行

命令代表一份可以被符合条件的 AI 使用的任务配置。发布后,命令生成器把它转成可选机会,Behavior 判断是否值得接取,Logic 真正开始时才领取。

所以只调用“发布命令”却没有生成器、Behavior 与 Logic,不会凭空产生移动、技能或交互。

发布、评估与实际使用分开时序
正在整理图表…
发布、评估与实际使用分开
查看图表源码
sequenceDiagram
  participant Caller as 发布方
  participant Cmd as Command
  participant Gen as Commands Generator
  participant Behavior as Behavior
  participant Logic as Logic
  Caller->>Cmd: Issue AI Command
  Cmd-->>Caller: Registered
  Gen->>Cmd: 收集可用机会
  Behavior->>Cmd: CanTake 只读检查
  Logic->>Cmd: Start 时 Take,绑定执行 Id
  Cmd-->>Caller: Taken
  Logic->>Logic: 执行业务任务
  Logic->>Cmd: Cleanup 时 EndUse
  Cmd-->>Caller: Finished 或 Returned

配置接取要求

字段含义与单位
Duration游戏时间秒;-1 无限,正数为有效期,其余值拒绝
Radius厘米;-1 不限范围,非负值以 Center 为球心
Center世界空间坐标,配合 Radius 定义接取范围
TagQuery接取者必须符合的标签条件
AllowedActors显式允许的 Pawn 列表;空列表不限角色,非空时与其他要求共同约束

Duration、Radius 必须是有限值,Center 不能包含 NaN。AllowedActors 使用弱引用,不延长指定角色的寿命。

候选的 CanTake 与正式 Take 都会检查半径。领取后离开球形范围不会仅因这一条配置自动取消,持续约束应由实际任务或 Logic 处理。

发布时会复制一份具体配置;多个 NPC 引用这条发布命令的同一身份,发布后不再修改其配置。需要变化时应结束旧发布并重新发布合适配置。

蓝图发布路线

使用 Issue AI Command(UAstraAIAsyncIssueCommand)提供有效的 AAIController、命令 Class,以及可选的同类型、尚未发布的初始化对象。先绑定需要的输出事件,再根据实际结果处理后续流程。

蓝图通知为 OnCommandRegistered、OnCommandTaken、OnCommandReturned、OnCommandFinished、OnCommandTimeout 与 OnFailed。发布失败通过 OnFailed 报告,不会先假装 Registered。

发布、Take、EndUse 与撤销应在服务端或单机的权威世界运行。发布节点检查控制器权威,命令子系统拒绝 NM_Client 世界;客户端调用此节点不会自动发送 RPC。

EndSubscription 只停止本监听者接收事件,不撤销命令。某个 NPC 的 Finished 也不代表所有其他 NPC 都已经结束使用。

在 AI 侧接入

把 UAstraAIObjectiveGenerator_Commands 加入 Objective Setup。SupportedClasses 为空时接受全部命令类型,非空时按支持类型及子类过滤。

Behavior 使用只读的 CanTake 评估机会;不要在评分时先 Take。Logic 的 Start 调用 Take(Component, ExecutionId),将占用归属绑定到本次执行;在自己的 Cleanup 中配对调用 EndUse(Component, ExecutionId, Result)。

清理后才报告完成,能避免“已通知下一段动作开始,但旧命令资源仍被占用”。同一角色成功完成后不会反复消费同一条命令。

撤销和超时怎样退出

撤销与超时会让命令失去有效性,已经使用它的执行仍须按取消与清理协议退场。不能在命令失效时直接丢掉任务引用、跳过归还。

若出现“有命令却没人执行”,先检查发布通知、要求交集、生成器过滤、当前 Objective,再检查 Behavior 分数与 Logic 的 Take 结果。AI 调试与 Logic 生命周期提供对应排查入口。

实现入口:插件 Commands/AstraAICommand、AstraAICommandSubsystem、AstraAIObjective_Commands 与 AstraAIAsyncIssueCommand。

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,日常只改内容与关系,沿用共享版式和图表。