Files

135 lines
5.5 KiB
C#
Raw Permalink Normal View History

2025-08-28 16:20:24 +08:00
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<ItemResourceManager>, ILaunchManager
{
private readonly Dictionary<string, ItemResource> _items = new();
private readonly Dictionary<string, List<ItemResource>> _itemsByName = new(); // 保持按显示名称查找的字典
private int _anonymousItemCounter;
private ItemResource defaultItem;
/// <summary>
/// 指示管理器是否已完成初始化。
/// </summary>
public bool Completed { get; set; } // 接口变更Loaded 变为 Completed
public string StepDescription => "加载物品定义中";
/// <summary>
/// 初始化物品资源管理器。
/// </summary>
/// <returns>一个表示异步操作完成的 Task。</returns>
public async Task Init() // 接口变更:方法签名变为 async Task
{
// 在每次 Init 前,最好检查是否已经 Completed避免重复初始化
if (Completed) return;
2025-08-28 16:20:24 +08:00
defaultItem = ItemResource.GetDefault();
// 遵循不检查单例的原则,假定 DefineManager.Instance 始终可用。
var baseItemDefs = DefineManager.Instance.QueryDefinesByType<ItemDef>();
var weaponDefs = DefineManager.Instance.QueryDefinesByType<WeaponDef>();
var allDefs = new List<ItemDef>();
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;
}
}
2025-08-28 16:20:24 +08:00
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<ItemResource>());
_itemsByName[itemResource.Name].Add(itemResource);
}
Completed = true; // 接口变更:设置 Completed 为 true
// 由于 Init 方法内部没有真正的异步操作,不需要显式 await Task.CompletedTask;
// 编译器会为同步的 async Task 方法自动生成一个已完成的 Task。
}
/// <summary>
/// 清理物品资源管理器,移除所有加载的物品定义。
/// </summary>
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<ItemResource> FindAllItemsByName(string itemName)
{
return string.IsNullOrEmpty(itemName)
? new List<ItemResource>()
: _itemsByName.GetValueOrDefault(itemName, new List<ItemResource>());
}
public ItemResource GetItem(ItemDef def)
{
return GetItem(def?.defName);
}
}
}