This commit is contained in:
meishibiezb
2026-06-05 03:01:15 +08:00
parent 29a3f77908
commit a8bdf281ff
41 changed files with 1935 additions and 779 deletions

View File

@@ -1,10 +1,10 @@
# WBP_TestUI
## 基本信息
- **类型**: Widget Blueprint (UserWidget)
- **类型**: WidgetBlueprint (UserWidget)
- **父类**: UserWidget
- **源文件**: /Game/Blueprints/UI/Dialog/WBP_TestUI.WBP_TestUI
- **模块**: Content
- **模块**: Content/Blueprints/UI/Dialog
## 功能概述
WBP_TestUI 是对话演示脚本的显示/执行 Widget实现了 IPresentationScriptExecutor 接口。它接收 FDialogPresentationScriptData解析其中的 JSON 命令,构建 UI 选择按钮,驱动演示脚本的执行流。同时持有 Ultra Dynamic Sky 引用以支持环境变化命令。
@@ -23,35 +23,49 @@ WBP_TestUI 负责演示脚本的接收和执行、对话 UI 的生成和更新
| IPresentationScriptExecutor | 实现接口 | Dialog 插件 |
| UDialogPresentationSubsystem | 调用 | Dialog 插件 |
## 对外接口
- **蓝图函数**
- `ExecuteScript(FDialogPresentationScriptData InScript)` -- 启动演示脚本,接收脚本数据并开始执行流程
- `ProcessScript(FDialogPresentationScriptCommand Presentation)` -- 处理单条脚本命令,逐条执行演示命令
- `ExecuteNextScript(FName Name)` -- 跳转到指定名称的下一个脚本,实现脚本流程控制
- `SummonChoiceButtons(FDialogPresentationScriptData Data)` -- 根据脚本数据中的 Choices 字段动态生成选择按钮 UI
- `SetNextScritp(FDialogPresentationScriptData Data)` -- 设置下一个要执行的脚本(通过 NextScriptName 变量)
- `Get_MainText_Text() -> FText` -- 数据绑定函数,返回主文本框的对话文本内容
- **蓝图变量**(均为 is_instance_editable
- `NextScriptName` (FName) -- 存储下一个脚本的名称,用于流程跳转
- `Sky` (Ultra_Dynamic_Sky_C*) -- Ultra Dynamic Sky 引用,用于执行环境变化命令(如改变天气、时间)
- **IPresentationScriptExecutor 接口实现**BlueprintNativeEvent
- `ExecutePresentationScript(const FDialogPresentationScriptData& ScriptStruct)` -- 执行演示脚本
- `PlugStrategyIn(FName StrategyName, const TScriptInterface<IPresentationStrategyPlugin>& NewStrategy)` -- 插件式注入策略
- `UnplugStrategy(FName StrategyName)` -- 移除策略插件
- **EventGraph**:含 5 个事件和 8 个节点
## 外部视角
WBP_TestUI 是 UserWidget 的子类,实现 IPresentationScriptExecutor 接口,从外部调用者视角:
**公开属性(蓝图可读写)**
- `NextScriptName`FName— 下一条要执行的脚本名称
- `Sky`Ultra_Dynamic_Sky_C*)— 超动态天空引用,用于环境变化命令
**实现接口IPresentationScriptExecutor**
- `ExecuteScript(FDialogPresentationScriptData InScript)` — 启动一条演示脚本
- `ProcessScript(FDialogPresentationScriptCommand Presentation)` — 逐条解析并执行脚本命令
- `ExecuteNextScript(FName Name)` — 跳转到指定名称的脚本段
**UI 管理函数**
- `SummonChoiceButtons(FDialogPresentationScriptData Data)` — 动态生成对话选项按钮WBP_ChoiceButton
- `SetNextScritp(FDialogPresentationScriptData Data)` — 设置下一条脚本的目标
- `Get_MainText_Text()``FText` — 绑定主文本显示
**EventGraph 事件**
| 事件 | 类型 | 触发时机 | 行为 |
|------|------|----------|------|
| `事件预构造` | 原生覆盖 (PreConstruct) | Widget 在蓝图编辑器中放置或运行时创建时 | 预留(当前无连线逻辑) |
| `事件构造` | 原生覆盖 (Construct) | Widget 创建完成后 | 预留(当前无连线逻辑) |
| `事件Tick` | 原生覆盖 | 每帧 | 预留(当前无连线逻辑) |
| `事件ExecutePresentationScript` | 接口事件 (IPresentationScriptExecutor) | UDialogPresentationSubsystem 调用时 | 接收 FDialogPresentationScriptData → 调用 ExecuteScript 启动脚本执行 |
| `On Clicked (Next)` | 组件绑定事件 | 用户点击"下一步"按钮时 | 读取 NextScriptName → 调用 ExecuteNextScript 跳转脚本 |
**外部交互方式**
- 由 UDialogPresentationSubsystem 创建并调用 ExecuteScript
- 通过 IPresentationScriptExecutor 接口与 Dialog 插件通信
- 通过 WBP_ChoiceButton 动态生成选项按钮
## 使用方法
- 作为 UserWidget 创建并添加到视口,通常由 UDialogPresentationSubsystem 管理
- 实现 IPresentationScriptExecutor 接口,作为 Dialog 插件的脚本执行器
- UDialogPresentationSubsystem 调用 `ExecutePresentationScript` 投递脚本,本 Widget 通过 `ExecuteScript` 启动执行
- `ProcessScript` 逐条解析脚本命令:通过 UPresentationJsonLibrary 解析 JSON 命令字符串,识别 CommandName 和 Params
- `SummonChoiceButtons` 根据 Choices 数据动态创建选项按钮列表,按钮绑定 `ExecuteNextScript` 处理选择
- `SetNextScritp` / `ExecuteNextScript` 控制脚本流程的线性或分支推进
- `Get_MainText_Text` 作为 UMG 数据绑定函数,连接 UI 文本框显示对话内容
- `Sky` 变量用于连接到场景中的 Ultra Dynamic Sky Actor脚本命令可改变天气/时间等环境效果
- 策略插件通过 `PlugStrategyIn` / `UnplugStrategy` 动态注入,支持在运行时扩展脚本命令的处理策略
WBP_TestUI 在项目中的典型调用流程:
- **对话脚本执行流程** — UDialogPresentationSubsystem 加载 DataTable → 收到对话触发信号 → 调用 ExecuteScript通过接口事件 `ExecutePresentationScript`)→ WBP_TestUI 的 ProcessScript 逐条解析 JSON 命令 → 更新 MainText 显示文本
- **选项分支流程** — ProcessScript 遇到选项命令 → 调用 SummonChoiceButtons → 动态生成 WBP_ChoiceButton 并挂接到面板 → 用户选择一个选项 → 更新 NextScriptName
- **下一步跳转流程** — 用户点击"下一步"按钮 → 触发 `On Clicked (Next)` → 读取 NextScriptName → 调用 ExecuteNextScript → 跳转到 FDialogPresentationScriptData 中对应名称的脚本段
## 用例
- Dialog 系统的 UI 执行器,实现 IPresentationScriptExecutor 接口
- 由 UDialogPresentationSubsystem 调用,作为对话脚本的显示和交互界面
- 通过 `Sky` 变量连接 Ultra Dynamic Sky支持演示脚本中的环境效果命令
| 引用方 | 路径 | 用途 |
|--------|------|------|
| DialogTest | `/Game/地图关卡/DialogTest` | 在该关卡中执行对话演示脚本 |