Files
Gen_Hack-and-Slash-Roguelite/Client/Assets/Scripts/Managers/ItemResourceManager.cs

135 lines
5.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
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;
}
}
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);
}
}
}