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

82 lines
5.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 中自动加载并实例化)。
```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。