using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; // 引入 Task for async/await using Data; using Item; using UnityEngine; using Utils; namespace Managers { public class ItemResourceManager : Singleton, ILaunchManager { private readonly Dictionary _items = new(); private readonly Dictionary> _itemsByName = new(); // 保持按显示名称查找的字典 private int _anonymousItemCounter; private ItemResource defaultItem; /// /// 指示管理器是否已完成初始化。 /// public bool Completed { get; set; } // 接口变更:Loaded 变为 Completed public string StepDescription => "加载物品定义中"; /// /// 初始化物品资源管理器。 /// /// 一个表示异步操作完成的 Task。 public async Task Init() // 接口变更:方法签名变为 async Task { // 在每次 Init 前,最好检查是否已经 Completed,避免重复初始化 if (Completed) return; defaultItem = ItemResource.GetDefault(); // 遵循不检查单例的原则,假定 DefineManager.Instance 始终可用。 var baseItemDefs = DefineManager.Instance.QueryDefinesByType(); var weaponDefs = DefineManager.Instance.QueryDefinesByType(); var allDefs = new List(); if (baseItemDefs != null) allDefs.AddRange(baseItemDefs); if (weaponDefs != null) allDefs.AddRange(weaponDefs); if (allDefs.Count == 0) { Debug.LogWarning("ItemResourceManager: No ItemDef or WeaponDef found to initialize."); // 即使没有定义,也认为初始化流程已完成,但 Completed 依然设为 true // 如果认为没有定义不应该算作 Completed,则需要根据具体业务逻辑调整此处 Completed = true; return; } foreach (var def in allDefs) { string effectiveDefName; // 用于字典索引的有效defName var isAnonymous = string.IsNullOrEmpty(def.defName); if (isAnonymous) { // 逻辑:如果def.defName为空,则生成一个唯一的匿名defName effectiveDefName = $"AnonItemDef_{_anonymousItemCounter++}"; Debug.LogWarning( $"ItemResourceManager: Loading anonymous item of type {def.GetType().Name} with display name '{def.label}'. It will be indexed as: {effectiveDefName}"); } else { effectiveDefName = def.defName; // 逻辑:对于具名物品,检查是否存在重复的defName。如果存在,则跳过。 if (_items.ContainsKey(effectiveDefName)) { Debug.LogWarning( $"ItemResourceManager: Duplicate item definition found for named item: {effectiveDefName}. Skipping this item."); continue; } } ItemResource itemResource; if (def is WeaponDef currentWeaponDef) itemResource = new WeaponResource( currentWeaponDef ); else itemResource = new ItemResource( def ); // 逻辑:使用有效defName(可能是原始的,也可能是生成的匿名ID)作为_items字典的键 _items.Add(effectiveDefName, itemResource); if (!_itemsByName.ContainsKey(itemResource.Name)) _itemsByName.Add(itemResource.Name, new List()); _itemsByName[itemResource.Name].Add(itemResource); } Completed = true; // 接口变更:设置 Completed 为 true // 由于 Init 方法内部没有真正的异步操作,不需要显式 await Task.CompletedTask; // 编译器会为同步的 async Task 方法自动生成一个已完成的 Task。 } /// /// 清理物品资源管理器,移除所有加载的物品定义。 /// public void Clear() { _items.Clear(); _itemsByName.Clear(); _anonymousItemCounter = 0; // 清理时重置匿名计数器 Completed = false; // 清理后将 Completed 置为 false } public ItemResource GetItem(string defName) { return string.IsNullOrEmpty(defName) ? defaultItem : _items.GetValueOrDefault(defName, defaultItem); } public ItemResource FindItemByName(string itemName) { return string.IsNullOrEmpty(itemName) ? defaultItem : _itemsByName.GetValueOrDefault(itemName)?.FirstOrDefault(); } public List FindAllItemsByName(string itemName) { return string.IsNullOrEmpty(itemName) ? new List() : _itemsByName.GetValueOrDefault(itemName, new List()); } public ItemResource GetItem(ItemDef def) { return GetItem(def?.defName); } } }