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

90 lines
3.0 KiB
C#

using Data;
using Item;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace Managers
{
public class ItemResourceManager : Utils.Singleton<ItemResourceManager>, ILaunchManager
{
private ItemResource defaultItem;
private readonly Dictionary<string, Item.ItemResource> _items = new();
private readonly Dictionary<string, List<Item.ItemResource>> _itemsByName = new(); // 保持按显示名称查找的字典
public string StepDescription => "加载物品定义中";
public void Init()
{
defaultItem = ItemResource.GetDefault();
var baseItemDefs = Managers.DefineManager.Instance.QueryDefinesByType<ItemDef>();
var weaponDefs = Managers.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.");
return;
}
foreach (var def in allDefs)
{
if (_items.ContainsKey(def.defName))
{
Debug.LogError(
$"ItemResourceManager: Duplicate itemDef.defName found: {def.defName}. Skipping this item.");
continue;
}
Item.ItemResource itemResource;
if (def is WeaponDef currentWeaponDef)
{
itemResource = new Item.WeaponResource(
currentWeaponDef
);
}
else
{
itemResource = new Item.ItemResource(
def
);
}
_items.Add(def.defName, itemResource);
if (!_itemsByName.ContainsKey(itemResource.Name))
{
_itemsByName.Add(itemResource.Name, new List<Item.ItemResource>());
}
_itemsByName[itemResource.Name].Add(itemResource);
}
}
public Item.ItemResource GetItem(string defName)
{
return _items.GetValueOrDefault(defName, null);
}
public Item.ItemResource FindItemByName(string itemName)
{
if (string.IsNullOrEmpty(itemName)) return null;
return _itemsByName.GetValueOrDefault(itemName)?.FirstOrDefault();
}
public List<Item.ItemResource> FindAllItemsByName(string itemName)
{
if (string.IsNullOrEmpty(itemName)) return new List<Item.ItemResource>();
return _itemsByName.GetValueOrDefault(itemName, new List<Item.ItemResource>());
}
public void Clear()
{
_items.Clear();
_itemsByName.Clear();
}
}
}