5.4 KiB
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& ItemContainer)* → FItemView: 从完整的物品数据构造视图。这是最常用的方法。
- 调用内部 PopulateCommon 填充 ItemID、ItemType、ItemName、ItemDescription、Icon、Location。
- 遍历 Instance.ItemData 中的所有属性描述。
- 对每个属性,通过 Registry->GetViewStrategy 查找策略。
- 调用 PropertyValueToString 将属性值转为字符串(bool→是/否,int/float→数字,FName/FString→原值)。
- 调用 Strategy->GetPropertyText(ValueString) 获取格式化文本。
- 将所有非空行用换行符拼接为 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):
Results.Add(FItemViewFactory::CreateView(Registry, Def, *Item,
TScriptInterface<const IItemContainer>(this)));
典型用法 -- GetItemViewByID(DefaultContainer.cpp:78):
return FItemViewFactory::CreateView(Registry, Def, *Item,
TScriptInterface<const IItemContainer>(this));
CreateView 内部流程(ItemViewFactory.cpp:57-85):
- 创建空 FItemView。
- PopulateCommon 填充通用字段:ItemID、ItemType、ItemName、ItemDescription、Icon、Location。
- 遍历 Instance.ItemData 中的每个属性描述:
- 通过 Registry->GetViewStrategy(Desc.Name) 查找策略。
- 策略不存在则跳过该属性。
- PropertyValueToString 将属性值转为字符串。
- 字符串为空则跳过。
- Strategy->GetPropertyText(ValueString) 获取格式化文本。
- 非空则追加到 ResultText(换行分隔)。
- 将 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 为查找到的物品创建视图。