Files
loneseDocument/Plugins/Dialog/IPresentationScriptExecutor.md
meishibiezb 29a3f77908 init
2026-06-04 21:44:13 +08:00

3.9 KiB
Raw Blame History

IPresentationScriptExecutor

基本信息

  • 类型: UINTERFACE + C++ 接口
  • 父类: UInterface
  • 源文件: Plugins/Dialog/Source/Dialog/Public/PresentationScriptExecutor.h
  • 模块: Dialog

功能概述

对话表现系统的协调器接口。方法ExecutePresentationScript运行脚本、PlugStrategyIn/UnplugStrategy按名称管理策略注册表。所有方法均为 BlueprintNativeEvent。

设计用意

门面/协调器模式。将"执行什么"FDialogPresentationScriptData与"谁执行"(策略插件)分离。作为接口与框架无关——可与任何 UI 系统配合使用。UDialogPresentationSubsystem 在脚本查找后调用 ExecutePresentationScript。

职责范围

编排对话脚本执行。管理策略插件注册表。由 UDialogPresentationSubsystem::ShowDialog 调用。不存储对话数据,也不解析 JSON。

项目内依赖

依赖项 关系 源文件
FDialogPresentationScriptData 前向声明(参数) Plugins/Dialog/Source/Dialog/Public/PresentationScriptExecutor.h:26
IPresentationStrategyPlugin 前向声明(参数) Plugins/Dialog/Source/Dialog/Public/PresentationScriptExecutor.h:28

对外接口

UInterface / C++ 接口,供蓝图或 C++ 类实现。作为对话表现系统的协调器/门面,负责编排脚本执行和管理策略插件注册表。所有方法均为 BlueprintNativeEvent可蓝图重写

三个方法:

  • ExecutePresentationScript (BlueprintNativeEvent, BlueprintCallable): 接收 const FDialogPresentationScriptData& ScriptStruct(无返回值)。

    • UDialogPresentationSubsystem::ShowDialog 调用。
    • 实现者应解析 ScriptStruct 中的脚本数据,按顺序执行命令,将每条命令通过 CommandName 路由到已注册的 IPresentationStrategyPlugin。
  • PlugStrategyIn (BlueprintNativeEvent, BlueprintCallable): 接收 FName StrategyNameconst TScriptInterface<IPresentationStrategyPlugin>& NewStrategy

    • 按名称注册一个策略插件。后续执行脚本时根据 CommandName 查找对应策略并调用其 PerformCommand。
  • UnplugStrategy (BlueprintNativeEvent, BlueprintCallable): 接收 FName StrategyName

    • 按名称注销一个策略插件。

典型实现者UI Widget如 WBP_TestUI它既是显示层也是执行协调器。

使用方法

在蓝图中实现此接口。典型调用链:

// Plugins/Dialog/Source/Dialog/Private/DialogPresentationSubsystem.cpp:8-17
void UDialogPresentationSubsystem::ShowDialog(const TScriptInterface<IPresentationScriptExecutor> Executor, const FName StructID)
{
    UObject* ExecutorObject = Executor.GetObject();
    if (!ExecutorObject)
    {
        UE_LOG(LogTemp, Warning, TEXT("ShowDialog failed: Executor does not implement IPresentationScriptExecutor interface."));
        return;
    }
    IPresentationScriptExecutor::Execute_ExecutePresentationScript(ExecutorObject, GetDialogPresentationScriptData(StructID));
}

子系统查找脚本数据、注入 ScriptID 后,通过 Execute_ExecutePresentationScript 静态方法调用蓝图实现的接口函数。

用例

文件 行号 用途
Plugins/Dialog/Source/Dialog/Public/PresentationScriptExecutor.h 19-31 接口定义UInterface 包装类 + C++ 接口类含三个方法声明
Plugins/Dialog/Source/Dialog/Public/DialogPresentationSubsystem.h 32 UDialogPresentationSubsystem::ShowDialog 以此接口的 TScriptInterface 为参数
Plugins/Dialog/Source/Dialog/Private/DialogPresentationSubsystem.cpp 8-17 ShowDialog 实现:先校验接口,再调用 Execute_ExecutePresentationScript
Plugins/Dialog/Source/Dialog/Private/PresentationScriptExecutor.cpp 6 接口默认实现占位文件
Document/Content/Blueprints/WBP_TestUI.md 10 WBP_TestUI蓝图 Widget实现此接口接收并执行脚本