86 lines
5.4 KiB
Markdown
86 lines
5.4 KiB
Markdown
# FItemViewFactory
|
||
|
||
## 基本信息
|
||
- **类型**: C++ 静态类
|
||
- **父类**: (无)
|
||
- **源文件**: Plugins/Item/Source/Item/Public/ItemViewFactory.h
|
||
- **模块**: Item
|
||
|
||
## 功能概述
|
||
从FItemDef + FItemInstance + 容器构造FItemView的静态工厂。三个方法:CreateView(含通过IItemViewStrategy的动态属性文本)、CreatePreviewView(不含动态数据)、CreateEmptyView。使用UItemRegistrySubsystem获取策略。
|
||
|
||
## 设计用意
|
||
将视图构造与数据模型和容器分离。代码库中唯一调用IItemViewStrategy::GetPropertyText的地方。显示格式化流水线的单一装配点。
|
||
|
||
## 职责范围
|
||
构建FItemView结构体。遍历物品属性、从注册表查找策略、格式化值。不拥有数据。
|
||
|
||
## 项目内依赖
|
||
| 依赖项 | 关系 | 源文件 |
|
||
|--------|------|--------|
|
||
| ItemRegistrySubsystem.h | #include (在.cpp中) | Plugins/Item/Source/Item/Public/ItemRegistrySubsystem.h |
|
||
| ItemFactory.h | #include (在.cpp中) | Plugins/Item/Source/Item/Public/ItemFactory.h |
|
||
| ItemContainer.h | #include (在.cpp中) | Plugins/Item/Source/Item/Public/ItemContainer.h |
|
||
| ItemViewStrategy.h | #include (在.cpp中) | Plugins/Item/Source/Item/Public/ItemViewStrategy.h |
|
||
|
||
## 对外接口
|
||
FItemViewFactory 是纯 C++ 静态类,提供三个静态方法用于从不同数据源构造 FItemView。
|
||
|
||
- **CreateView(const UItemRegistrySubsystem* Registry, const FItemDef& Def, const FItemInstance& Instance, const TScriptInterface<const IItemContainer>& ItemContainer)** → FItemView: 从完整的物品数据构造视图。这是最常用的方法。
|
||
1. 调用内部 PopulateCommon 填充 ItemID、ItemType、ItemName、ItemDescription、Icon、Location。
|
||
2. 遍历 Instance.ItemData 中的所有属性描述。
|
||
3. 对每个属性,通过 Registry->GetViewStrategy 查找策略。
|
||
4. 调用 PropertyValueToString 将属性值转为字符串(bool→是/否,int/float→数字,FName/FString→原值)。
|
||
5. 调用 Strategy->GetPropertyText(ValueString) 获取格式化文本。
|
||
6. 将所有非空行用换行符拼接为 ItemDataText。
|
||
|
||
- **CreatePreviewView(const FItemDef& Def)** → FItemView: 构造预览视图(不带运行时数据)。使用空 FItemInstance 和空容器指针填充通用字段。ItemDataText 为空。适用于 UI 预览(如物品图鉴、Tooltip 预览),无需实际物品实例。
|
||
|
||
- **CreateEmptyView()** → FItemView: 返回默认构造的空 FItemView。所有字段为零值/空值。适用于初始化或错误返回场景。
|
||
|
||
**调用方:**
|
||
仅由 UDefaultContainer 调用(DefaultContainer.cpp:64 和 :78),在 GetItemViews 和 GetItemViewByID 中为每个物品创建视图快照。
|
||
|
||
## 使用方法
|
||
FItemViewFactory 只由 UDefaultContainer 调用,不对外部开放。
|
||
|
||
**典型用法 -- GetItemViews(DefaultContainer.cpp:64):**
|
||
```cpp
|
||
Results.Add(FItemViewFactory::CreateView(Registry, Def, *Item,
|
||
TScriptInterface<const IItemContainer>(this)));
|
||
```
|
||
|
||
**典型用法 -- GetItemViewByID(DefaultContainer.cpp:78):**
|
||
```cpp
|
||
return FItemViewFactory::CreateView(Registry, Def, *Item,
|
||
TScriptInterface<const IItemContainer>(this));
|
||
```
|
||
|
||
**CreateView 内部流程(ItemViewFactory.cpp:57-85):**
|
||
1. 创建空 FItemView。
|
||
2. PopulateCommon 填充通用字段:ItemID、ItemType、ItemName、ItemDescription、Icon、Location。
|
||
3. 遍历 Instance.ItemData 中的每个属性描述:
|
||
- 通过 Registry->GetViewStrategy(Desc.Name) 查找策略。
|
||
- 策略不存在则跳过该属性。
|
||
- PropertyValueToString 将属性值转为字符串。
|
||
- 字符串为空则跳过。
|
||
- Strategy->GetPropertyText(ValueString) 获取格式化文本。
|
||
- 非空则追加到 ResultText(换行分隔)。
|
||
4. 将 ResultText 赋值给 View.ItemDataText。
|
||
|
||
**CreatePreviewView 用法(ItemViewFactory.cpp:87-93):**
|
||
使用空实例和空容器构造视图,仅含通用字段,ItemDataText 为空。适用于无实际物品实例的预览场景。
|
||
|
||
**CreateEmptyView 用法(ItemViewFactory.cpp:96-98):**
|
||
返回默认构造的 FItemView。用于找不到物品或注册表不可用时的错误返回(如 DefaultContainer.cpp:72,81)。
|
||
|
||
## 用例
|
||
- `Plugins/Item/Source/Item/Public/ItemViewFactory.h:16-26` -- FItemViewFactory 类声明(三个静态方法:CreateView、CreatePreviewView、CreateEmptyView)。
|
||
- `Plugins/Item/Source/Item/Private/ItemViewFactory.cpp:11-19` -- PopulateCommon 静态辅助函数:填充 FItemView 的通用字段(ItemID、ItemType、ItemName、ItemDescription、Icon、Location)。
|
||
- `Plugins/Item/Source/Item/Private/ItemViewFactory.cpp:22-55` -- PropertyValueToString 静态辅助函数:将属性包值转换为字符串(支持 Bool、Int32、Float、Double、Name、String 类型)。
|
||
- `Plugins/Item/Source/Item/Private/ItemViewFactory.cpp:57-85` -- CreateView 完整实现:遍历属性包 → 查找策略 → 格式化文本 → 拼接 ItemDataText。
|
||
- `Plugins/Item/Source/Item/Private/ItemViewFactory.cpp:87-93` -- CreatePreviewView 实现:使用空实例构造仅含通用字段的视图,ItemDataText 为空。
|
||
- `Plugins/Item/Source/Item/Private/ItemViewFactory.cpp:96-98` -- CreateEmptyView 实现:返回默认构造的空 FItemView。
|
||
- `Plugins/Item/Source/Item/Private/DefaultContainer.cpp:64` -- GetItemViews 中调用 FItemViewFactory::CreateView 为每个物品创建视图。
|
||
- `Plugins/Item/Source/Item/Private/DefaultContainer.cpp:78` -- GetItemViewByID 中调用 FItemViewFactory::CreateView 为查找到的物品创建视图。
|