Async Message · 模块总览与接入

使用 UE 5.8 原生 Async Message System,把事件通知与接收方解耦,查阅消息收发、路由和 Starry 的实际接入。

本页内容5 节

子模块与功能

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

消息收发

  • 蓝图收发与解绑

    通过消息 Id、监听、载荷封装与解包的核心连线,掌握蓝图收发和任务解绑。

  • C++ 收发与解绑

    按取得系统、登记监听、读取载荷、发送与解绑的顺序,查阅原生 C++ 接口用法。

消息路由

项目接入

  • 项目消息与排查

    查阅 Starry 已接入的消息标签、载荷和触发点,区分本地通知、状态复制与 RPC 转发,并沿真实链路排查。

它在项目中负责什么

Async Message System 是 UE 5.8 的原生插件,用标签标识消息、用结构体承载数据,让发送方在不知道具体接收对象的情况下发布通知。接收方提前登记监听,在自己的接收阶段处理消息。

Starry 已启用这个插件,StarryGame 和 StarryEditor 也已加入模块依赖。技能失败、伤害、淘汰、玩家重置、背包堆叠与快捷栏变化已有 C++ 发送入口;具体消息和触发位置见项目消息与排查。当前源码扫描中,项目的 C++ 监听示例位于专项测试,不能据此声称所有 UI 消费者已经接完。

同一 World 内的消息收发关系 / 流程
正在整理图表…
同一 World 内的消息收发
查看图表源码
flowchart LR
  Sender(技能 / 背包 / 快捷栏) -->|Message Id + 结构体| System(World 的消息系统)
  World(World Subsystem) -->|创建与关闭| System
  System --> Queue(按接收选项排队)
  Queue -->|到达监听的 Tick Group| Listener(蓝图 / C++ 监听者)
  Listener --> Decode(检查来源与载荷类型)
  Decode --> Filter(筛选本玩家 / 目标)
  Filter --> View(刷新表现或领域观察)

消息用于描述“已经发生了什么”。它适合刷新显示、事件提示与解耦观察。需要立即得到返回值、明确调用某个对象,或执行权威玩法命令时,使用对应领域接口;例如 Input Handler仍直接调用移动与 GAS,不把消息总线当作输入命令的替代品。

从哪一项功能开始

  • 收发消息:蓝图收发与解绑用核心节点说明消息 Id、监听、载荷封装与解包;C++ 收发与解绑给出原生组件的声明、发送、回调和生命周期清理。
  • 消息路由:标签、时机与生命周期解释父子标签、World 与 Endpoint、Tick Group、载荷复制以及 C++ 监听所有权。
  • 项目接入:项目消息与排查列出当前标签、载荷、触发点和显式网络转发入口,按现象定位问题。

接入时先确定四件事

决定要填写或确认的内容
消息身份已注册的 Gameplay Tag,例如 Starry.Damage.Message,封装为 FAsyncMessageId
载荷约定标签对应的结构体及字段语义,例如 FStarryVerbMessage,发送和读取双方约定一致
路由范围同一个 World、同一个有效 Endpoint;项目现有发送使用默认 World Endpoint
监听寿命什么时候开始、由谁保存任务或句柄、何时停止,避免每次刷新界面重复登记

项目已经启用插件,不需要为普通玩法蓝图手工创建消息子系统。蓝图直接使用 Start Listening for Async Message 和 Queue Async Message for Broadcast。新增 C++ 模块需要使用插件公开接口时,再在自己的 Build.cs 中加入 AsyncMessageSystem。

默认行为与边界

蓝图监听默认在游戏线程的 TG_PostUpdateWork 接收。入队不会同步执行接收蓝图,实际回调发生在对应队列下一次被处理时;可能在当前帧,也可能在后续帧,不以固定延迟毫秒数或“必定下一帧”作为契约。C++ 可以显式选择其他 Tick Group、命名线程或任务优先级,后台线程绑定需要自行遵守线程约束。

每个 World 拥有独立消息系统。PIE 的服务器世界和客户端世界不会因标签相同就互通,插件也不会把消息自动变成 RPC。联网转发必须由项目现有网络入口或状态复制完成,再在接收端的本地 World 内发布。

系统不保存可供后来订阅者回放的业务历史;没有相关监听时,消息不会成为离线收件箱。界面打开后应先登记监听,再从领域接口读取当前状态,用后续消息更新显示。

本机 UE 5.8 的插件描述仍标为 Experimental。这里记录当前源码与 Starry 接入,升级引擎时需复核接口和行为;网页节点展示与站点构建不等于运行过 UE 功能验收。

实现入口:引擎 Engine/Plugins/Experimental/AsyncMessageSystem,项目 Starry.uproject、Source/StarryGame/StarryGame.Build.cs 与 Framework/Messages。工程分工见工程分层。

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