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

5.4 KiB
Raw Permalink Blame History

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 调用,不对外部开放。

典型用法 -- GetItemViewsDefaultContainer.cpp:64

Results.Add(FItemViewFactory::CreateView(Registry, Def, *Item,
    TScriptInterface<const IItemContainer>(this)));

典型用法 -- GetItemViewByIDDefaultContainer.cpp:78

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 为查找到的物品创建视图。