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

122 lines
4.4 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 Data;
using Item;
using UnityEngine;
namespace Managers
{
public class ItemResourceManager : Utils.Singleton<ItemResourceManager>,ILaunchManager
{
private readonly Dictionary<string, Item.ItemResource> _items = new();
private readonly Dictionary<string, List<Item.ItemResource>> _itemsByName = new(); // 保持按显示名称查找的字典
public string StepDescription => "加载物品定义中";
public void Init()
{
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;
}
var itemIcon = Managers.PackagesImageManager.Instance.GetSprite(def.texture);
if (!itemIcon)
{
Debug.LogWarning(
$"ItemResourceManager: Failed to load sprite for texture '{def.texture}' for item '{def.defName}'. Icon will be null.");
}
var itemName = string.IsNullOrEmpty(def.label) ? def.defName : def.label;
if (string.IsNullOrEmpty(def.label))
{
Debug.LogWarning(
$"ItemResourceManager: ItemDef '{def.defName}' has an empty label. Using defName as item name.");
}
var itemDescription = def.description ?? string.Empty;
Item.ItemResource itemResource;
if (def is WeaponDef currentWeaponDef)
{
itemResource = new Item.WeaponResource(
def.defName, // 传递 defName
itemName,
itemDescription,
itemIcon,
currentWeaponDef.rarity,
currentWeaponDef.maxStack,
currentWeaponDef.ssEquippable,
currentWeaponDef.attributes
);
}
else
{
itemResource = new Item.ItemResource(
def.defName, // 传递 defName
itemName,
itemDescription,
itemIcon,
def.rarity,
def.maxStack,
def.ssEquippable
);
}
_items.Add(def.defName, itemResource);
// 将物品添加到按显示名称查找的字典 (这里仍然使用 itemResource.Name因为字典的目的是按显示名称查找)
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);
}
// FindItemByName 和 FindAllItemsByName 保持不变,因为它们是按显示名称查找的
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();
}
}
}