5.1 KiB
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: 返回排序优先级(数值越大排在越前面)。
注册策略(两种方式):
- 项目设置自动注册:在 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);
}
}
- 运行时手动注册:调用 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。