4.7 KiB
UItemRegistrySettings
基本信息
- 类型: UCLASS(Config=Game, DefaultConfig)
- 父类: UDeveloperSettings
- 源文件: Plugins/Item/Source/Item/Public/ItemRegistrySettings.h
- 模块: Item
功能概述
Item插件的项目设置类。可在编辑器中的 Project Settings > Game > Item Registry Settings 下配置。包含DataTable软引用和视图策略类软引用的TMap。软引用避免启动时急切加载。
设计用意
设计时配置的契约。UDeveloperSettings将配置存储在DefaultGame.ini中。软引用避免在启动时加载所有内容。标准的UE项目设置模式。
职责范围
配置数据容器。将名称映射到DataTable/策略类资产。由UItemRegistrySubsystem::Initialize在游戏启动时读取。无运行时逻辑。
项目内依赖
(无项目内依赖)
对外接口
UItemRegistrySettings 是 UDeveloperSettings 子类(Config=Game, DefaultConfig),作为项目配置容器,本身没有可调用的方法(仅有默认构造函数)。外部通过以下两个 UPROPERTY 读取配置:
- ItemDataTables (TMap<FName, TSoftObjectPtr>): 物品 DataTable 的映射表。键为逻辑名称(如 "Default"),值为 DataTable 资产的软引用路径。在编辑器中通过 Project Settings > Game > Item Registry Settings 配置。
- ViewStrategies (TMap<FName, TSoftClassPtr>): 视图策略类的映射表。键为属性名称(对应 IItemViewStrategy::GetPropertyName),值为实现了 ItemViewStrategy 接口的 Blueprint 类软引用。
读取方式: 由 UItemRegistrySubsystem::Initialize 通过 GetDefault() 获取单例,遍历两个 TMap 调用 LoadSynchronous 加载软引用并注册(ItemRegistrySubsystem.cpp:58-80)。
配置存储: 标记 Config=Game 使这些字段存储在 DefaultGame.ini 中。设计师不需要修改代码,只需在项目设置编辑器中配置 DataTable 和策略类的映射关系即可。软引用(TSoftObjectPtr / TSoftClassPtr)避免在游戏启动时急切加载所有资产。
使用方法
UItemRegistrySettings 是纯配置数据容器,由研发人员在项目设置中配置。
配置路径: 编辑器中:Project Settings > Game > Item Registry Settings(由 meta = (DisplayName = "Item Registry Settings") 定义)。
配置 ItemDataTables: 在 "General" 分类下,添加键值对:
- 键:DataTable 的逻辑名称(如 "Items"、"Equipment")。
- 值:指向 DataTable 资产(其行结构体为 FItemDef)的软引用。
配置 ViewStrategies: 在 "Strategies" 分类下,添加键值对:
- 键:属性名称(与 IItemViewStrategy::GetPropertyName() 返回值一致,如 "Attribute_Health")。
- 值:指向实现了 ItemViewStrategy 接口的 Blueprint 类的软引用。
运行时加载(ItemRegistrySubsystem.cpp:58-80):
void UItemRegistrySubsystem::Initialize(FSubsystemCollectionBase& Collection)
{
Super::Initialize(Collection);
const UItemRegistrySettings* Settings =
GetDefault<UItemRegistrySettings>();
for (const auto& Pair : Settings->ItemDataTables)
{
if (UDataTable* LoadedTable = Pair.Value.LoadSynchronous())
RegisterDataTable(Pair.Key, LoadedTable);
}
for (const auto& Pair : Settings->ViewStrategies)
{
if (UClass* StrategyClass = Pair.Value.LoadSynchronous())
{
TScriptInterface<IItemViewStrategy> NewStrategy =
NewObject<UObject>(this, StrategyClass);
RegisterViewStrategy(Pair.Key, NewStrategy);
}
}
}
配置存储位置: 标记 Config=Game 使配置写入 DefaultGame.ini。多个平台可共享同一配置,也可按平台覆写。
用例
Plugins/Item/Source/Item/Public/ItemRegistrySettings.h:13-23-- UItemRegistrySettings 类声明(ItemDataTables + ViewStrategies 两个 UPROPERTY + 构造函数)。Plugins/Item/Source/Item/Private/ItemRegistrySettings.cpp:6-8-- 构造函数实现(空实现,所有工作在 UPROPERTY 初始化器中完成)。Plugins/Item/Source/Item/Private/ItemRegistrySubsystem.cpp:59-- Initialize 中通过 GetDefault() 获取配置单例。Plugins/Item/Source/Item/Private/ItemRegistrySubsystem.cpp:62-68-- Initialize 中遍历 Settings->ItemDataTables,LoadSynchronous 每个软引用并注册。Plugins/Item/Source/Item/Private/ItemRegistrySubsystem.cpp:70-78-- Initialize 中遍历 Settings->ViewStrategies,LoadSynchronous 每个类,NewObject 实例化策略并注册。Plugins/Item/Source/Item/Private/ItemRegistrySubsystem.cpp:79-80-- Initialize 完成后通过 UE_LOG 输出注册的 DataTable 和策略数量。