82 lines
5.1 KiB
Markdown
82 lines
5.1 KiB
Markdown
# 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<IItemViewStrategy> NewStrategy =
|
||
NewObject<UObject>(this, StrategyClass);
|
||
RegisterViewStrategy(Pair.Key, NewStrategy);
|
||
}
|
||
}
|
||
```
|
||
2. **运行时手动注册**:调用 UItemRegistrySubsystem::RegisterViewStrategy(PropertyName, Strategy)。
|
||
|
||
**调用链(FItemViewFactory 中,ItemViewFactory.cpp:70-79):**
|
||
```cpp
|
||
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<IItemViewStrategy> 参数。
|
||
- `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<IItemViewStrategy>。
|
||
- `Plugins/Item/Source/Item/Private/ItemRegistrySubsystem.cpp:75` -- Initialize 中 NewObject 创建策略实例,注册到 ViewStrategyMap。
|