# 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>): 物品 DataTable 的映射表。键为逻辑名称(如 "Default"),值为 DataTable 资产的软引用路径。在编辑器中通过 Project Settings > Game > Item Registry Settings 配置。 - **ViewStrategies** (TMap>): 视图策略类的映射表。键为属性名称(对应 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):** ```cpp void UItemRegistrySubsystem::Initialize(FSubsystemCollectionBase& Collection) { Super::Initialize(Collection); const UItemRegistrySettings* Settings = GetDefault(); 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 NewStrategy = NewObject(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 和策略数量。