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

5.1 KiB
Raw Permalink Blame History

IItemViewStrategy

基本信息

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

功能概述

物品属性显示格式化的策略接口。每个策略处理一个属性名称。方法GetPropertyName、GetPropertyText将值字符串转换为显示文本、GetPriority排序顺序。全部为BlueprintNativeEvent。

设计用意

属性显示的策略模式。不同属性需要不同的格式化方式(例如"15 ATK" vs "Defense: 10"。设计师创建Blueprint策略在UItemRegistrySubsystem中按属性名称注册。

职责范围

为单个属性的值进行格式化以供显示。在构建FItemView::ItemDataText时由FItemViewFactory调用。不了解物品或容器。

项目内依赖

(无项目内依赖)

对外接口

IItemViewStrategy 是物品属性显示格式化的策略接口BlueprintNativeEvent通常在 Blueprint 中实现。每个策略对象处理一个特定的属性名称。

BlueprintNativeEvent 方法(在 Blueprint 中覆写):

  • GetPropertyName() → FName: 返回此策略处理的属性名称。注册表按此名称将策略注册到 UItemRegistrySubsystemRegisterViewStrategy 的 PropertyName 参数。运行时FItemViewFactory 用物品属性的 Desc.Name 去注册表查找对应策略。
  • GetPropertyText(const FString& ValueString) → FText: 将属性的原始值字符串转换为显示文本。ValueString 是 FItemViewFactory 通过 PropertyValueToString 从属性包中提取的字符串bool→"是/否"int/float→数字字符串FName→名称字符串FString→原值。策略可返回任何格式的 FText如 "攻击力: 15" 或 "+10 DEF"。返回空文本时FItemViewFactory 跳过该属性行。
  • GetPriority() → int32: 返回显示优先级。数值越大排在越前面。(注意:当前实现中 FItemViewFactory::CreateView 按属性包遍历顺序迭代,未按优先级排序——需要验证是否在蓝图侧实现排序,或者此方法为预留接口。)

注册方式: 策略实现为 Blueprint 类后,通过 UItemRegistrySubsystem::RegisterViewStrategy 按属性名称注册,或在 UItemRegistrySettings::ViewStrategies 中配置自动注册。

调用链: FItemViewFactory::CreateView → Registry->GetViewStrategy(Desc.Name) → Strategy->GetPropertyText(ValueStr)。

使用方法

IItemViewStrategy 在 Blueprint 中实现,在项目设置或代码中注册。

Blueprint 实现模式: 创建继承 ItemViewStrategy 接口的 Blueprint 类,覆写三个方法:

  • GetPropertyName: 返回此策略处理的属性名(如 "Attribute_Health")。
  • GetPropertyText: 接收 ValueString如 "100"),返回格式化文本(如 "生命值: 100")。
  • GetPriority: 返回排序优先级(数值越大排在越前面)。

注册策略(两种方式):

  1. 项目设置自动注册:在 Project Settings > Game > Item Registry Settings 的 ViewStrategies 映射中,以属性名为键、策略 Blueprint 类为值配置ItemRegistrySubsystem.cpp:70-78 在 Initialize 中自动加载并实例化)。
// ItemRegistrySubsystem.cpp:70-78
for (const auto& Pair : Settings->ViewStrategies)
{
    if (UClass* StrategyClass = Pair.Value.LoadSynchronous())
    {
        TScriptInterface<IItemViewStrategy> NewStrategy =
            NewObject<UObject>(this, StrategyClass);
        RegisterViewStrategy(Pair.Key, NewStrategy);
    }
}
  1. 运行时手动注册:调用 UItemRegistrySubsystem::RegisterViewStrategy(PropertyName, Strategy)。

调用链FItemViewFactory 中ItemViewFactory.cpp:70-79

TScriptInterface<IItemViewStrategy> Strategy =
    Registry->GetViewStrategy(Desc.Name);
if (!Strategy.GetInterface()) continue;
FString ValueStr = PropertyValueToString(Bag, Desc);
if (ValueStr.IsEmpty()) continue;
FText Line = Strategy->GetPropertyText(ValueStr);
if (!Line.IsEmpty())
{
    if (!ResultText.IsEmpty()) ResultText += TEXT("\n");
    ResultText += Line.ToString();
}

用例

  • Plugins/Item/Source/Item/Public/ItemViewStrategy.h:19-34 -- IItemViewStrategy 接口声明GetPropertyName、GetPropertyText、GetPriority 三个 BlueprintNativeEvent
  • Plugins/Item/Source/Item/Private/ItemViewFactory.cpp:70-79 -- CreateView 中通过 Registry->GetViewStrategy(Desc.Name) 获取策略,调用 Strategy->GetPropertyText(ValueString) 格式化显示文本。
  • Plugins/Item/Source/Item/Public/ItemRegistrySubsystem.h:28 -- RegisterViewStrategy 的方法声明,接收 TScriptInterface 参数。
  • Plugins/Item/Source/Item/Private/ItemRegistrySubsystem.cpp:20-25 -- RegisterViewStrategy 实现:将 (PropertyName, Strategy) 添加到 ViewStrategyMap。
  • Plugins/Item/Source/Item/Private/ItemRegistrySubsystem.cpp:45-52 -- GetViewStrategy 实现:从 ViewStrategyMap 查找并返回 TScriptInterface。
  • Plugins/Item/Source/Item/Private/ItemRegistrySubsystem.cpp:75 -- Initialize 中 NewObject 创建策略实例,注册到 ViewStrategyMap。