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

86 lines
5.4 KiB
Markdown
Raw Permalink 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.
# 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 调用,不对外部开放。
**典型用法 -- GetItemViewsDefaultContainer.cpp:64**
```cpp
Results.Add(FItemViewFactory::CreateView(Registry, Def, *Item,
TScriptInterface<const IItemContainer>(this)));
```
**典型用法 -- GetItemViewByIDDefaultContainer.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 为查找到的物品创建视图。