# 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: 从完整的物品数据构造视图。这是最常用的方法。 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(this))); ``` **典型用法 -- GetItemViewByID(DefaultContainer.cpp:78):** ```cpp return FItemViewFactory::CreateView(Registry, Def, *Item, TScriptInterface(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 为查找到的物品创建视图。