AstraAI · Logic 与生命周期

把动作接入 Start、Cancel、Cleanup,正确处理共享模板、蓝图实例与过期异步回调。

本页内容6 节

Logic 负责这一次动作

Behavior 选择机会,Logic 取得这次动作需要的目标与资源,启动任务,并在结束时归还。项目中的 GAS、Smart Object 或具体交互各自负责实际能力,AstraAI 不要求所有交互都经过一种专用 GA 基类。

每个 Controller 至多一个顶层活动 Logic。BT、StateTree 内部仍可以按各自机制组织任务,这个限制不等于后端内部只能有一个节点。

旧执行清理完成后,下一次执行才开始状态
正在整理图表…
旧执行清理完成后,下一次执行才开始
查看图表源码
stateDiagram-v2
  [*] --> Ready
  Ready --> Running: Start
  Running --> Running: Tick
  Running --> Cleaning: FinishExecution 成功或失败
  Running --> Cancelling: 抢占、撤销或失效
  Cancelling --> Cleaning: 取消完成
  Cleaning --> Cleaning: 等待后端安全停止
  Cleaning --> Ready: Cleanup 完成
  Ready --> Running: 下一次选择
  Ready --> [*]: 关闭

选哪一种状态存储

实现方式配置与状态放在哪里
原生、无 UObject 成员状态的 Logic共享模板;本次数据由 GetInstanceDataType() 指定的 Struct 保存
需要独立 UObject 成员状态的原生 Logic构造时启用 bCreateInstance,实际执行时创建实例
蓝图 Logic派生 UAstraAIBehaviorLogic_BlueprintBase,实际执行时创建独立对象

不要为了蓝图事件图直接派生基础 Logic 或原生 BT/StateTree Logic。蓝图入口统一使用 BlueprintBase。组件不会预先复制所有候选,也不会连同所属 Modifier、Group、Behavior 一起复制。

原生生命周期的分工

  • Start:建立本次任务、订阅和资源,保存必要执行数据。
  • Tick:更新当前执行;持续约束使用 IsExecutionValid。
  • Cancel:请求停止任务,处理被抢占或主动撤销。
  • Cleanup:解绑、归还资源并完成结算;后端还没安全停止时可返回 false 等待。

这些方法由选择器同步分派,传入 Data 属于当前执行。不要从异步回调直接重新调用 Start、Tick 或 Cleanup。

取消等待期间仍可能收到 Tick,用于确认已有后端退出;准备提交新动作时先检查 Context.Component->CanSubmitActions(Id)。不能因为还在 Tick,就继续推进正常动作链。

FinishExecution(Id, Result) 只接受当前执行原代次的首次完成,实际结算等回调退栈后处理。旧执行清理未完成时,新行为不会先抢占同一批资源。

异步回调保存原 Id

启动时保存组件弱引用与本次 FAstraAIExecutionId。回调到来后先确认组件还存在,再通过 FindLogicData(原Id) 取得仍有效的数据,或调用 FinishExecution(原Id, Result) 报告结果。

不要捕获 FInstancedStruct 内存地址跨越异步边界:旧执行退出后,该地址可能已经失效。也不要在回调里读取“组件当前的 Id”代替原 Id,否则上一次任务的完成可能结束下一次任务。

资源有独立生命周期时,回调还应使用该领域自己的有效性判断。执行 Id 解决的是“是不是同一次 Logic”,不能代替资产加载句柄、Actor 弱引用等检查。

蓝图怎样结束与取消

创建 AIBL_ 蓝图后,实现 OnStart(Context, Execution),在动作完成时调用 Finish(Result)。默认 OnStart 直接成功,所以只添加类型、未实现逻辑,不会自动得到等待或移动能力。

在 OnCancel 中停止自己启动的任务;取消完成后调用 Finish(Aborted)。默认取消直接报告 Aborted。取消过程中不能再启动下一段正常动作。

OnCleanup 用于同步解除委托、归还资源与处理结果,不能在里面依赖 latent 等待。随后组件会清除本蓝图实例的 latent 与定时器,释放组件引用,交由 GC 回收。

开发时验证一轮完整退出

先验证正常成功与失败,再验证执行中抢占、配置撤销、宿主结束与再次执行。观察是否重复订阅、迟到回调结束了新任务、取消后任务仍运动,以及下一次执行是否读到了旧目标。

后端的结果与退出约束见BT、StateTree 与 HTN,命令领取与归还见命令。

实现入口:Behavior/AstraAIBehaviorLogic、AstraAIBehaviorLogic_BlueprintBase、AstraAIBehaviorLogic_Wait 与 AstraAIComponent。

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