AstraAI · 组合与覆盖

正确区分优先级、行为分数与 Stack 顺序,按完整路径组织可撤销的配置。

本页内容5 节

用路径定位一个行为

一个行为的身份是完整路径,例如 Daily/Rest。Daily 是 Group,Rest 是 Behavior;路径使用 FName,大小写不能用来区分两个身份。

Modifier 的每条请求属于 AddGroup、AddBehavior、RemoveGroup 或 RemoveBehavior。它描述对最终组合的修改,不是一份每帧顺序执行的动作清单。

在编辑器里组织配置

打开 AIBM_ 后,先选择 Critical 或 Normal,再添加根组或根行为。编辑器的“路径与请求工具”支持输入完整路径、选择 Group/Behavior 类型、添加与移除请求,并提供重命名、顺序调整与节点参数编辑。

父组负责条件,子组与子行为继承根优先级。给节点填写设计说明,能帮助区分“为什么需要这一项”与“这项的当前参数”;说明与节点颜色不参与评分。

打开 AIBMS_ 时,只配置 Modifier 类型及其先后顺序。行为内部的 Logic、条件、评分参数在所属 Modifier 中修改;Stack 不提供另一套参数覆盖。

三种顺序分别影响什么关系 / 流程
正在整理图表…
三种顺序分别影响什么
查看图表源码
flowchart TB
  Priority(Critical / Normal) -->|决定竞争层级| Selection(候选选择)
  Score(Behavior 分数) -->|同级比较| Selection
  Order(Stack 前层到后层) -->|组合增删与替换| Effective(最终有效配置)
  Effective --> Selection

后层怎样覆盖前层

操作最终行为
后层添加同路径 Behavior完整替换前层定义,包括它的 Logic 与参数
撤回覆盖层恢复仍然有效的前层定义
后层显式重定义已有 Group替换该组条件,保留已有子项
向已有 Group 增删子行为引用其路径,不需要顺手重复定义 Group
移除 Group该路径下的组与行为退出最终组合

例如,前层定义 Daily/Rest,后层以同一路径放入受伤后的休息配置。后层存在时使用后层完整定义;撤回后恢复前层。这里没有按字段合并,也不按 Behavior 的类名合并两个不同路径。

正在执行的行为若因撤回或替换而失去原定义,组件会先取消、清理,再重新选择。不会为了保留当前动作继续使用已经撤销的配置。

运行时应用要保存 Handle

AddModifier 返回应用句柄,用它精确定位一次应用。相同 Modifier 类型的不同 Handle 是独立应用;不要只保存类型,事后猜测要撤回哪一层。

请求在安全边界处理,拿到 Handle 只表示申请已登记。通过 OnModifierChanged 观察 Pending、Applied、Rejected、Removed,需要生效结果时以通知为准。

可选的来源对象是弱引用;来源失效时,属于它的应用会撤销。MoveModifier 的位置从零开始,最终组合不合法时会拒绝。应用与移除事件 OnApplied / OnRemoved 成对管理该层自己的副作用,不因重算而重复执行仍保留的层。

配置共享,应用状态独立

多个 NPC 可以引用同一套 Modifier、Group、Behavior 模板。每个 NPC 的应用 Handle、评估结果、冷却与活动执行独立;不要把当前目标、Owner、执行下标写进共享模板成员。

评分与抢占的具体规则见评分与抢占,动作中的独立数据与清理见Logic 与生命周期。区域应用的来源管理见行为区域。

实现入口:插件的 Behavior/AstraAIBehaviorModifier、AstraAIBehaviorModifierStack、AstraAIBehaviorTypes 与 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,日常只改内容与关系,沿用共享版式和图表。