跳转到正文

道具定义

在 GIS 中创建道具定义,使用 Fragment 组织静态数据,并通过 Schema 验证物品配置。

创建时间: 2025年6月22日更新时间: 2026年10月27日

介绍

本文介绍如何在GIS中创建和管理道具定义。

创建和管理道具定义

在编辑器中创建类型为GIS_ItemDefinition的数据资产,即可创建一个新的道具。在定义中你可以:

  1. DisplayName/Description/Icon:你可以指定该道具用于UI的显示信息。
  2. ItemTags:通过ItemTags为道具关联一组GameplayTags,可用于道具查询,分类,数据验证等。
  3. Unique:表示道具的唯一性,唯一的道具不可堆叠。
  4. Fragments:可以添加不同类型的数据片段,以构成复杂的道具数据结构。

About Unique Item

对于非唯一道具,如苹果,当你通过道具定义添加10个苹果到集合中,那么会产生一个道具栈,只生成一个道具实例,同时数量是10.

对于唯一道具,如武器,当你添加10个武器到集合中,会产生10个道具栈,每个栈包含一个带有不同的guid的道具实例,每个栈的数量是1。

提示

建议使用ID_分类_名称_后缀作为道具定义的命名规则。

道具数据片段

你可以通过添加Fragements来扩充道具的数据,GIS内置了一些常见的道具片段:

  1. GIS_ItemFragment_DynamicAttributes:允许你为道具添加初始属性,在道具实例创建时,会将指定的属性添加到道具实例中。
  2. GIS_ItemFragment_Equippable:允许你为道具配置装备实例及表现,在道具被添加到“用于装备的集合”时,装备组件会根据这个信息创建对应的装备实例。
  3. Fragment_Shoppable:允许你定义该道具通过商店买卖时,所需的货币类型及其数量。(10个石头,3个木头。)

添加新的道具片段

用户可以通过蓝图/C++创建GIS_ItemFragment的子类以新增片段类型,新增的片段类型会自动出现在Fragments数组的选项中。

道具实例创建时,C++ Fragment 可覆写 OnInstanceCreated;蓝图子类可实现 On Instance Created 事件来执行初始化。

通过C++

下面是GIS_ItemFragment_DynamicAttributes的实现案例。

cpp
/**
 * An item fragment which adding attributes to item instance.
 */
UCLASS(DisplayName="ItemGIS_ItemFragment_DynamicAttributes")
class GENERICINVENTORYSYSTEM_API UGIS_ItemFragment_SetAttributes : public UGIS_ItemFragment
{
	GENERATED_BODY()

protected:
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category=Attribute, meta=(TitleProperty="{Tag} -> {Value}"))
	TArray<FGIS_GameplayTagFloat> InitialFloatAttributes;
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category=Attribute, meta=(TitleProperty="{Tag} -> {Value}"))
	TArray<FGIS_GameplayTagBool> InitialBoolAttributes;
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category=Attribute, meta=(TitleProperty="{Tag} -> {Value}"))
	TArray<FGIS_GameplayTagInteger> InitialIntegerAttributes;

public:
	virtual void OnInstanceCreated(UGIS_ItemInstance* Instance) const override;

	float GetFloatAttributeByTag(FGameplayTag Tag) const;
	bool GetBoolAttributeByTag(FGameplayTag Tag) const;
	int32 GetIntegerAttributeByTag(FGameplayTag Tag) const;
};
cpp
void UGIS_ItemFragment_SetAttributes::OnInstanceCreated(UGIS_ItemInstance* Instance) const
{
	for (int32 i=0;i<InitialFloatAttributes.Num();i++)
	{
		Instance->SetFloatAttribute(InitialFloatAttributes[i].Tag,InitialFloatAttributes[i].Value);
	}
	for (int32 i=0;i<InitialIntegerAttributes.Num();i++)
	{
		Instance->SetIntegerAttribute(InitialIntegerAttributes[i].Tag,InitialIntegerAttributes[i].Value);
	}
	for (int32 i=0;i<InitialBoolAttributes.Num();i++)
	{
		Instance->SetBoolAttribute(InitialBoolAttributes[i].Tag,InitialBoolAttributes[i].Value);
	}
}

通过蓝图

访问道具定义数据

每一个道具实例创建时,都会持有对Definition的引用,并通过网络复制。Definition的数据都是只读的!

当你拿到了道具实例的引用,你可以通过GetDefinition获取道具的所有静态信息,GIS也提供了便捷的函数供你访问各种Fragment数据。

Loading Blueprint

Initializing BlueprintUE renderer...

管理大量道具定义

由于道具定义是数据资产,每一个文件代表着一个道具。在项目中道具数量非常庞大时,一个良好的文件夹结构将非常有助于对数据进行管理。

你应该将同类型的,即数据结构布局一致的道具定义放置在相同的文件夹内,这样你可以借助UE编辑器提供的属性矩阵编辑器来对文件夹内的所有道具进行批量编辑。

数据验证

ItemDefinition 和 ItemFragment 的组合为通用库存系统(GIS)提供了极大的灵活性。然而,随着项目中道具数量的增长和道具数据结构设计的逐渐固定,可能需要以统一的方式约束某些类型道具的数据结构布局,以减少人为错误,并便于通过属性矩阵编辑器批量管理数据。

道具定义模式

GIS 提供“道具定义模式”(ItemDefinitionSchema),一种数据资产,包含一组基于 ItemTags 的验证规则,用于约束道具定义的配置形式。你可以:

  • 指定道具定义必须包含的数据片段类型,在保存定义时自动添加缺失的片段。
  • 指定数据片段的排列顺序,在保存定义时自动排序。
  • 针对具有特定 ItemTags 的定义,指定必须包含或禁止包含的数据片段。

启用数据验证

在项目设置的 Generic Inventory System 部分,你可以:

  • 按项目路径指定不同的道具定义模式。
  • 仅指定一个默认模式。如果基于路径的模式未找到匹配,则回退到默认模式。

启用 ItemDefinitionSchema 后,每次保存 ItemDefinition 时,系统会根据模式查询匹配的验证规则。若数据不满足规则,编辑器会弹出警告,提示用户修正错误。

当前接口提示

内置类型包括 UGIS_ItemFragment_DynamicAttributes、UGIS_ItemFragment_Equippable 和 UGIS_ItemFragment_Shoppable。项目设置由 UGIS_DeveloperSettings 提供,可配置默认 Schema 与路径映射。配方片段对应的制作功能仍在开发中。