HaloDebug · 窗口扩展与属性绘制

复用窗口生命周期、反射 Inspector 和场景绘制,避免为每个调试页重做基础设施。

本页内容5 节

新窗口先复用基类

窗口继承 FHaloDebugWindow,由 Subsystem 注册并拥有。以下是窗口主体片段;它应放在项目的非 Shipping 调试代码中,实际类名与文件按所属功能命名。

#include "HaloDebugCommon.h"

#if ENABLE_HALODEBUG
#include "HaloDebugWindow.h"

/** 展示所选对象的调试摘要。 */
class FStarryExampleDebugWindow : public FHaloDebugWindow
{
protected:
    virtual void RenderContent() override
    {
        ImGui::TextUnformatted("Starry debug window");
    }
};
#endif

在项目已有的窗口注册处使用 Subsystem->AddWindow<FStarryExampleDebugWindow>("Engine.Actor.Example")。点分路径同时决定菜单和窗口/布局身份,应使用稳定、有语义的名字。

Subsystem 管理窗口内存,不手动 delete。RenderContent 的顶层 Begin/End 已由基类处理,不要再套一个同名顶层窗口。

把初始化和清理放对位置

时机合适职责
构造默认参数,不依赖 ImGui/Slate 上下文
Initialize先调用基类,再建立窗口所需资源与订阅
RenderContent当帧面板内容
RenderHelp操作说明与约束
RenderViewport游戏视口里的调试绘制
Shutdown解除订阅、释放所拥有资源

不要让通用插件硬编码 Starry 的菜单或 Gameplay 依赖。项目功能窗口在项目注册,公共控件才沉到共享层。

反射属性不用再写一套递归

使用 HaloDebugEngine 的 FHaloDebugPropertyInspector:

// 仅在游戏线程的有效 ImGui 绘制帧内调用,对象须在调用期间有效。
FHaloDebugPropertyInspector::DrawReadOnly("SelectedObject", Object);

// 结构体可传 UStruct 与当帧有效内存,也适用于 FInstancedStruct 的内容。
FHaloDebugPropertyInspector::DrawReadOnly("ExecutionData", StructType, StructMemory);

Id 在宿主窗口内唯一。绘制不复制对象、不持有 GC 引用、不缓存属性地址,也不采集历史快照。历史查看需要在发生时独立采样,不能把实时 Inspector 当成录像。

FHaloDebugPropertyInspectorOptions 可控制过滤、Category、排序与默认展开。UObject 引用默认不展开;允许后由用户逐层打开,过滤器不会顺着所有引用递归搜索。

可编辑不等于自动应用业务

DrawEditable 返回本帧是否发生修改。它支持常用标量、枚举、字符串、结构体、数组成员与 Map Value;Set 元素、Map Key 及其嵌套字段保持只读,避免破坏哈希。

编辑器不会自动补 Undo、PostEditChange、资产保存或业务刷新。调用者必须按领域要求处理变更;会触发网络权限、重建或复杂副作用的值,应使用已有业务接口操作。

短文本输入复用 FHaloDebugWidgets::InputText,其缓冲为 256 字节且包含终止符。其他控件、图表优先用现有 ImGui/ImPlot 与共享 Widgets,不复制一份文本框或 tooltip 实现。

场景绘制按本次调用指定参数

FHaloDebugPaintDraw 提供点、线、形状、骨骼与碰撞结果绘制。分类入口受日志级别控制,Draw 前缀入口供主动绘制的面板使用;按所需入口设置颜色、线宽与寿命。

三维线框默认单帧,正 LifeTime 持续指定游戏秒,Persistent 持续到清理;世界位置与尺寸沿用 UE 单位,2D 屏幕绘制使用像素。不要依赖一套隐式全局尺寸让不同窗口互相影响。

绘制留在本进程,不自动复制到其他玩家。日志使用 UE_LOG,通知可用 LogHaloDebugNotify;蓝图曲线入口为 UHaloDebugPaintPlotBlueprint::Plot,不要依赖已移除的旧 Draw/Log 蓝图库。

构建中保持 HaloDebugCommon 可用,具体面板依赖和实现按 ENABLE_HALODEBUG/非 Shipping 条件组织。调试工具入门解释模块分工,远程面板解释 UI 传输边界。

实现入口:HaloDebugWindow.h、HaloDebugSubsystem.h、HaloDebugWidgets.h、HaloDebugPropertyInspector.h 与 HaloDebugPaintDraw.h,均在 HaloDebug 插件对应模块中。

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