博客

技术思考、排障与开发记录。

博客/UE开发

在 UE 中创建独立多窗口界面

用 Slate 原生窗口承载 UMG,提供窗口生命周期、位置尺寸、显隐与 DPI 控制。

返回
本页目录

主画面之外的控制界面

UE 工具或仿真程序有时需要把参数面板、调试信息或操作界面放到独立窗口,减少它们对主画面的占用。这类需求除了制作 UMG,还涉及原生窗口的创建、输入转交、尺寸变化和关闭流程。

该项目 项目配置启用了 Marketplace 的 MultiWindow 插件。窗口底层实现来自该插件,源码文件头署名为 YWT20。插件可以用 Slate 创建原生窗口并承载 UMG,为接入独立控制面板提供基础。

创建窗口与管理生命周期

创建参数如何变成窗口

CreateMultiWindow 接收 UMG 内容、窗口位置、客户区尺寸、标题、边距和尺寸调整相关选项。插件创建 Slate 窗口,通过 UMG 的 TakeWidget 取得 Slate 内容,再装入新窗口。窗口框架与 UMG 内容由此分别承担职责:前者处理原生窗口行为,后者组织控件和业务交互。

接入项影响的行为
UMG 内容窗口里显示与交互的控件
位置与客户区尺寸初始摆放位置和可用内容区域
标题与边距窗口标识与内容周边留白
尺寸调整等选项原生窗口允许的外观和操作方式

创建路径会取第一个可见 Slate 窗口作为原生父窗口。这个选择适合已有主窗口的程序接入,但多窗口关系复杂时,需要明确它实际关联到哪个主窗口,而不能只根据 UMG 层级判断。

一个窗口对应一个管理 Actor

MultiWindowActor 保存窗口相关对象,并提供位置、尺寸、标题、显隐、最大化、最小化和关闭等操作。窗口创建后,业务可以通过对应 Actor 管理它,不必在每次按钮操作时重新查找原生窗口。

插件还提供激活与关闭事件,并将键盘回调转交给 UMG。对于参数面板,这些入口可用于组织打开、聚焦与关闭时的业务行为。窗口是否接收输入与控件如何处理输入是两个环节,接入时仍需结合实际焦点和控件设置检查。

自动缩放的实际含义

插件的自动 DPI 处理会根据原始客户区与当前客户区的尺寸比例计算缩放,再对 UMG 使用 SetRenderScale。窗口变大或变小时,内容的显示尺寸可以随之按比例变化。

这种缩放作用于控件渲染尺寸,不会自动重新安排每个控件的布局。它也不等于完整的系统 DPI 适配:操作系统缩放、不同显示器与 UMG 自身布局仍是接入时需要分别考虑的条件。如果希望宽窗口改成两列、窄窗口折叠操作区,需要在界面层另外组织布局规则。

显式关闭与原生关闭

通过插件显式关闭窗口时,流程会清理相关引用与绑定,再请求关闭。用户直接操作原生窗口关闭按钮,则走另一条路径,现有回调主要广播关闭事件。两条路径的清理职责并不完全相同,UMG 指针的生命周期也存在需要留意的环节。

因此,接入方应明确关闭事件之后如何处理对应 Actor、控件引用和业务状态,避免把“窗口已经消失”当作“所有相关对象已完成释放”。如果面板需要反复打开,还要决定每次重建还是保留状态后再显示。

适用范围

现有插件面向独立工具窗口和控制面板。可以确认 该项目 配置中已启用该插件,项目两个 C++ 模块没有直接调用 MultiWindow 的记录;蓝图调用和实际运行情况尚未确认。目前可说明的是插件的接入能力,不能将其视为个人原创插件或现场运行交付。

原生窗口承载 UMG,也不意味着它拥有独立 UWorld 或独立相机渲染。需要在不同窗口展示多路视角时,应继续评估视口、画面来源和渲染资源;普通参数面板则可以先围绕窗口关系、焦点、缩放和关闭生命周期确定范围。