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

5.0 KiB
Raw Blame History

FItemDef

基本信息

  • 类型: USTRUCT, 继承 FTableRowBase
  • 父类: FTableRowBase
  • 源文件: Plugins/Item/Source/Item/Public/ItemFactory.h
  • 模块: Item

功能概述

物品类型的DataTable行定义。存储设计师创作元数据显示名称、图标、描述、掉落Actor类、编辑器注释、默认动态属性TArray以及bHasTracer标记。

设计用意

设计时数据契约。每行代表一种物品类型(如"Sword"、"Apple"。运行时由ItemFactory读取以创建FItemInstance。FTableRowBase继承支持UDataTable::FindRow查找。

职责范围

定义某种物品类型的模板/蓝图。不包含运行时状态运行时状态由FItemInstance持有。由设计师在DataTable资产中编辑。

项目内依赖

依赖项 关系 源文件
FItemPropertyEntry 包含 (UPROPERTY成员) Plugins/Item/Source/Item/Public/ItemFactory.h

对外接口

FItemDef 继承自 FTableRowBase作为 DataTable 的行结构体,由设计师在 DataTable 资产中编辑。运行时通过 UItemRegistrySubsystem::GetItemDef(FName ItemType) 获取。

可编辑字段:

  • ItemName (FText): 物品显示名称。复制到 FItemView::ItemName。
  • DefaultIcon (TObjectPtr): 物品默认图标。复制到 FItemView::Icon。
  • ItemDescription (FText): 物品描述文本。复制到 FItemView::ItemDescription。
  • DropActorClass (TSoftClassPtr): 物品掉落时生成的 Actor 类(软引用,不强制加载)。
  • EditorComment (FString): 编辑器注释,仅供设计时参考,不影响运行时行为。
  • DefaultItemProps (TArray): 物品类型的默认动态属性数组。由 ItemFactory::ConvertDefaultProps 在物品创建时转换并写入 FItemInstance::ItemData。
  • bHasTracer (bool): 是否为此类型的物品创建 UItemTracer。为 true 时ItemFactory 会在属性包中添加 Internal_ItemTracer 对象,用于追踪物品位置和广播移动事件。

运行时读取方式: 调用 UItemRegistrySubsystem::GetItemDef(ItemType) 返回 FItemDef 的副本(值语义)。在使用前应检查 ItemName 是否为空来判断查找是否成功(参见 DefaultContainer.cpp:118 的检查逻辑)。

使用方法

FItemDef 作为 DataTable 行结构体使用。设计师在 DataTable 中为每种物品类型创建一行。

从注册表获取物品定义:

// ItemRegistrySubsystem.cpp:32-42
FItemDef UItemRegistrySubsystem::GetItemDef(FName ItemType) const
{
    for (const auto& Pair : ItemDefMap)
    {
        if (Pair.Value)
        {
            const FItemDef* Found = Pair.Value->FindRow<FItemDef>(
                ItemType, TEXT("GetItemDef"));
            if (Found) return *Found;  // 返回副本
        }
    }
    return FItemDef();  // 空定义ItemName 为空)
}

在物品创建前验证定义有效性:

// DefaultContainer.cpp:117-118
FItemDef Def = Registry->GetItemDef(ItemType);
if (Def.ItemName.IsEmpty()) return false;  // 检查 ItemName 非空

传递给 ItemFactory 创建实例:

// DefaultContainer.cpp:121
TUniquePtr<FItemInstance> NewItem =
    ItemFactory::CreateItemInstance(Def, ItemType);

构建视图时使用: FItemViewFactory::CreateView 从 FItemDef 复制 ItemName、ItemDescription、DefaultIcon 到 FItemViewItemViewFactory.cpp:11-19

static void PopulateCommon(FItemView& View, const FItemDef& Def,
    const FItemInstance& Instance,
    const TScriptInterface<const IItemContainer>& ItemContainer)
{
    View.ItemID = Instance.ItemID;
    View.ItemType = Instance.ItemType;
    View.ItemName = Def.ItemName;
    View.ItemDescription = Def.ItemDescription;
    View.Icon = Def.DefaultIcon;
    View.Location = ItemContainer;
}

用例

  • Plugins/Item/Source/Item/Public/ItemFactory.h:103-122 -- FItemDef 结构体定义(所有 UPROPERTY 字段 + FTableRowBase 继承)。
  • Plugins/Item/Source/Item/Private/ItemRegistrySubsystem.cpp:32-42 -- GetItemDef() 遍历所有已注册 DataTable通过 FindRow 查找并返回物品定义。
  • Plugins/Item/Source/Item/Private/DefaultContainer.cpp:63 -- GetItemViews 中通过 Registry->GetItemDef(Item->ItemType) 获取物品的 FItemDef传递给 FItemViewFactory。
  • Plugins/Item/Source/Item/Private/DefaultContainer.cpp:77 -- GetItemViewByID 中获取物品定义并传递给工厂。
  • Plugins/Item/Source/Item/Private/DefaultContainer.cpp:117 -- CreateItem 中获取 FItemDef检查 ItemName 非空后将 Def 传递给 ItemFactory::CreateItemInstance。
  • Plugins/Item/Source/Item/Private/ItemFactory.cpp:6-24 -- CreateItemInstance 接收 FItemDef 参数,读取 DefaultItemProps 和 bHasTracer 来构造物品。
  • Plugins/Item/Source/Item/Private/ItemViewFactory.cpp:11-19 -- PopulateCommon 从 FItemDef 复制 ItemName、ItemDescription、DefaultIcon 到 FItemView。
  • Plugins/Item/Source/Item/Private/ItemViewFactory.cpp:87-93 -- CreatePreviewView 仅使用 FItemDef 构造预览视图(无运行时数据)。