mirror of
http://47.107.252.169:3000/Roguelite-Game-Developing-Team/Gen_Hack-and-Slash-Roguelite.git
synced 2025-11-20 00:57:14 +08:00
Co-authored-by: m0_75251201 <m0_75251201@noreply.gitcode.com> Reviewed-on: http://47.107.252.169:3000/Roguelite-Game-Developing-Team/Gen_Hack-and-Slash-Roguelite/pulls/60
135 lines
5.5 KiB
C#
135 lines
5.5 KiB
C#
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);
|
||
}
|
||
}
|
||
}
|