# 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: 返回此策略处理的属性名称。注册表按此名称将策略注册到 UItemRegistrySubsystem(RegisterViewStrategy 的 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 中自动加载并实例化)。 ```cpp // ItemRegistrySubsystem.cpp:70-78 for (const auto& Pair : Settings->ViewStrategies) { if (UClass* StrategyClass = Pair.Value.LoadSynchronous()) { TScriptInterface NewStrategy = NewObject(this, StrategyClass); RegisterViewStrategy(Pair.Key, NewStrategy); } } ``` 2. **运行时手动注册**:调用 UItemRegistrySubsystem::RegisterViewStrategy(PropertyName, Strategy)。 **调用链(FItemViewFactory 中,ItemViewFactory.cpp:70-79):** ```cpp TScriptInterface 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。