AsyncMixin · 模块总览与项目接入

管理软引用加载、有序回调与任务作用域,了解指示器画布的实际接入,以及加载完成后的资源和宿主生命周期。

本页内容6 节

子模块与功能

进入具体功能,查阅使用步骤、运行机制与扩展方法。

资源加载

  • 软引用加载与 C++ 用法

    用组件加载软对象和控件类,保存加载结果,理解路径数组、同步回调、失败结果,以及重载与退出时的取消清理。

  • 主资产与资源驻留

    按主资产 ID 和 Bundle 预加载资源,理解句柄保留、取消与 GC 引用的关系,以及 AssetManager 和打包配置的职责。

任务编排

  • 回调顺序与独立作用域

    理解并行加载与有序回调的区别,使用 FAsyncScope 分开取消任务,了解 AsyncEvent、开始完成通知和等待条件的当前边界。

它负责什么

AsyncMixin 是项目内启用的 C++ 运行时工具。宿主继承 FAsyncMixin,就可以排入资源加载、普通回调和等待条件;需要多条独立任务链时,使用成员形式的 FAsyncScope。底层资源仍由 UE 的 AssetManager 和 StreamableManager 加载。

它把回调顺序、取消和宿主寿命放在一起管理。多个加载请求可以同时进行,回调按入队顺序推进;结束当前界面、切换预览目标或复用对象时,宿主可以取消自己这一组未执行的步骤。

Starry.uproject 已启用插件,StarryGame 已依赖 AsyncMixin。当前在项目 Source 中核对到的直接使用方是指示器系统的 SActorCanvas,不能把其他系统直接调用 RequestAsyncLoad 的代码也算作 AsyncMixin 接入。

指示器画布拥有业务,AsyncMixin 管理加载步骤关系 / 流程
正在整理图表…
指示器画布拥有业务,AsyncMixin 管理加载步骤
查看图表源码
flowchart TD
  Descriptor(指示器描述对象) -->|软控件类| Canvas(SActorCanvas)
  Canvas -->|AsyncLoad / Start| Mixin(FAsyncMixin)
  Mixin -->|申请资源| Stream(AssetManager / StreamableManager)
  Stream -->|加载状态| Mixin
  Mixin -->|按序回调| Check(弱引用与画布成员检查)
  Check --> Pool(控件池创建或复用)
  Pool --> Slot(绑定指示器并加入画布)

从哪项功能开始

功能阅读入口解决的问题
加载软对象、软类与路径数组软引用加载与 C++ 用法选择重载,接住结果,在功能退出时取消并清理
预加载主资产与 Bundle主资产与资源驻留配置资源包,确定预热结果由谁保留、何时释放
多条任务链、普通回调与等待回调顺序与独立作用域理解同步完成、自动启动、跨任务阻塞和条件接口的当前限制

AsyncMixin 的公开能力是原生 C++ 接口,没有提供可直接摆放的蓝图节点。C++ 可以把加载结果交给蓝图界面,正文按实际接口展示代码。

指示器画布怎样使用

SActorCanvas 同时继承 SPanel、FAsyncMixin 和 FGCObject。新增一个指示器时,画布先记录描述对象,再读取它的 TSoftClassPtr<UUserWidget>,调用 AsyncLoad,最后显式 StartAsyncLoading()。

完成回调捕获画布 this、描述对象的弱引用和请求时的控件类。回调先检查描述对象是否仍有效,再检查它是否仍在 AllIndicators 中;通过后才向 FUserWidgetPool 取得控件、调用指示器绑定接口并添加画布插槽。

这两项检查含义不同:弱引用检查 UObject 是否还存在,集合检查该指示器是否还属于当前画布。即使对象尚未被 GC,移除后的旧请求也不应重新把它显示出来。

删除一个指示器时,画布解除控件绑定、归还控件池、移除插槽并更新集合。它不会因此取消整个画布的加载队列,因为同一队列中还可能有其他指示器。如何划分取消范围见独立作用域。

谁负责生命周期

对象或资源负责方当前规则
底层资源加载AssetManager/StreamableManagerAsyncMixin 发出请求并跟踪句柄,不负责业务配置与打包规则
未执行的步骤与完成通知FAsyncMixin / FAsyncScope显式取消或析构时解除本作用域的跟踪,操作与销毁都在游戏线程
指示器是否仍应显示SActorCanvas用弱引用与当前集合检查过滤过期业务结果
描述对象的 GC 引用画布的 FGCObjectAddReferencedObjects 收集 AllIndicators;Mixin 不替任意 UObject 保活
已创建的控件与插槽画布和控件池移除时解绑、归还和拆除;取消加载不会撤回已执行的界面操作

UObject 的 EndPlay、控件移出界面与 C++ 析构发生在不同阶段。新接入应在业务退出时主动取消,不要只等最终析构。资源加载完成后需要继续使用的 UObject,应由 UPROPERTY、已有资源管理者或合适的 GC 引用接住,具体见加载示例。

接入其他模块

在自己的 Build.cs 中加入 AsyncMixin,源文件包含 AsyncMixin.h。如果公共头文件继承 FAsyncMixin 或持有 FAsyncScope,把它列为公开依赖;仅 .cpp 内部使用时可作为私有依赖。依赖列表继续每行一个模块。下面的加载示例额外使用 UMG,StarryGame 已具备这两项依赖。

插件不创建 World 子系统,也不提供跨网络的任务同步。它管理本地宿主的步骤;Async Message System则用于发送与监听事件,两者按各自用途接入。

实现入口:Plugins/EngineExtension/AsyncMixin/Source/Public/AsyncMixin.h、同插件的 Source/Private/AsyncMixin.cpp,以及 Source/StarryGame/Framework/UI/IndicatorSystem/SActorCanvas.h/.cpp。这里记录当前源码和实际调用,手册示例没有加入工程或运行 PIE。

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