mirror of
http://47.107.252.169:3000/Roguelite-Game-Developing-Team/Gen_Hack-and-Slash-Roguelite.git
synced 2025-11-20 05:37:11 +08:00
(client) feat:健康给予,路径优化,结算界面,商店界面 (#60)
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
This commit is contained in:
@@ -1,24 +1,40 @@
|
||||
using Data;
|
||||
using Item;
|
||||
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 : Utils.Singleton<ItemResourceManager>, ILaunchManager
|
||||
public class ItemResourceManager : Singleton<ItemResourceManager>, ILaunchManager
|
||||
{
|
||||
private ItemResource defaultItem;
|
||||
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 => "加载物品定义中";
|
||||
|
||||
public void Init()
|
||||
/// <summary>
|
||||
/// 初始化物品资源管理器。
|
||||
/// </summary>
|
||||
/// <returns>一个表示异步操作完成的 Task。</returns>
|
||||
public async Task Init() // 接口变更:方法签名变为 async Task
|
||||
{
|
||||
// 在每次 Init 前,最好检查是否已经 Completed,避免重复初始化
|
||||
if (Completed) return;
|
||||
|
||||
defaultItem = ItemResource.GetDefault();
|
||||
var baseItemDefs = Managers.DefineManager.Instance.QueryDefinesByType<ItemDef>();
|
||||
var weaponDefs = Managers.DefineManager.Instance.QueryDefinesByType<WeaponDef>();
|
||||
// 遵循不检查单例的原则,假定 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);
|
||||
@@ -27,62 +43,92 @@ namespace Managers
|
||||
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)
|
||||
{
|
||||
if (_items.ContainsKey(def.defName))
|
||||
string effectiveDefName; // 用于字典索引的有效defName
|
||||
var isAnonymous = string.IsNullOrEmpty(def.defName);
|
||||
|
||||
if (isAnonymous)
|
||||
{
|
||||
Debug.LogError(
|
||||
$"ItemResourceManager: Duplicate itemDef.defName found: {def.defName}. Skipping this item.");
|
||||
continue;
|
||||
// 逻辑:如果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
|
||||
);
|
||||
}
|
||||
|
||||
_items.Add(def.defName, itemResource);
|
||||
// 逻辑:使用有效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();
|
||||
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>());
|
||||
return string.IsNullOrEmpty(itemName)
|
||||
? new List<ItemResource>()
|
||||
: _itemsByName.GetValueOrDefault(itemName, new List<ItemResource>());
|
||||
}
|
||||
|
||||
public void Clear()
|
||||
public ItemResource GetItem(ItemDef def)
|
||||
{
|
||||
_items.Clear();
|
||||
_itemsByName.Clear();
|
||||
return GetItem(def?.defName);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user