2025-08-28 16:20:24 +08:00
using System.Collections.Generic ;
using System.Linq ;
2025-10-10 14:08:23 +08:00
using System.Threading.Tasks ; // 引入 Task for async/await
using Data ;
using Item ;
2025-08-27 19:56:49 +08:00
using UnityEngine ;
2025-10-10 14:08:23 +08:00
using Utils ;
2025-08-19 20:22:10 +08:00
namespace Managers
{
2025-10-10 14:08:23 +08:00
public class ItemResourceManager : Singleton < ItemResourceManager > , ILaunchManager
2025-08-19 20:22:10 +08:00
{
2025-09-19 08:26:54 +08:00
private readonly Dictionary < string , ItemResource > _items = new ( ) ;
private readonly Dictionary < string , List < ItemResource > > _itemsByName = new ( ) ; // 保持按显示名称查找的字典
2025-10-10 14:08:23 +08:00
private int _anonymousItemCounter ;
private ItemResource defaultItem ;
/// <summary>
/// 指示管理器是否已完成初始化。
/// </summary>
public bool Completed { get ; set ; } // 接口变更: Loaded 变为 Completed
2025-08-27 19:56:49 +08:00
public string StepDescription = > "加载物品定义中" ;
2025-10-10 14:08:23 +08:00
/// <summary>
/// 初始化物品资源管理器。
/// </summary>
/// <returns>一个表示异步操作完成的 Task。</returns>
public async Task Init ( ) // 接口变更:方法签名变为 async Task
2025-08-19 20:22:10 +08:00
{
2025-10-10 14:08:23 +08:00
// 在每次 Init 前,最好检查是否已经 Completed, 避免重复初始化
if ( Completed ) return ;
2025-08-28 16:20:24 +08:00
defaultItem = ItemResource . GetDefault ( ) ;
2025-10-10 14:08:23 +08:00
// 遵循不检查单例的原则,假定 DefineManager.Instance 始终可用。
var baseItemDefs = DefineManager . Instance . QueryDefinesByType < ItemDef > ( ) ;
var weaponDefs = DefineManager . Instance . QueryDefinesByType < WeaponDef > ( ) ;
2025-08-27 19:56:49 +08:00
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." ) ;
2025-10-10 14:08:23 +08:00
// 即使没有定义,也认为初始化流程已完成,但 Completed 依然设为 true
// 如果认为没有定义不应该算作 Completed, 则需要根据具体业务逻辑调整此处
Completed = true ;
2025-08-19 20:22:10 +08:00
return ;
2025-08-27 19:56:49 +08:00
}
foreach ( var def in allDefs )
2025-08-19 20:22:10 +08:00
{
2025-10-10 14:08:23 +08:00
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
2025-08-27 19:56:49 +08:00
{
2025-10-10 14:08:23 +08:00
effectiveDefName = def . defName ;
// 逻辑: 对于具名物品, 检查是否存在重复的defName。如果存在, 则跳过。
if ( _items . ContainsKey ( effectiveDefName ) )
{
Debug . LogWarning (
$"ItemResourceManager: Duplicate item definition found for named item: {effectiveDefName}. Skipping this item." ) ;
continue ;
}
2025-08-27 19:56:49 +08:00
}
2025-08-28 16:20:24 +08:00
2025-09-19 08:26:54 +08:00
ItemResource itemResource ;
2025-08-19 20:22:10 +08:00
2025-08-27 19:56:49 +08:00
if ( def is WeaponDef currentWeaponDef )
2025-09-19 08:26:54 +08:00
itemResource = new WeaponResource (
2025-08-27 19:56:49 +08:00
currentWeaponDef
) ;
else
2025-09-19 08:26:54 +08:00
itemResource = new ItemResource (
2025-08-27 19:56:49 +08:00
def
) ;
2025-10-10 14:08:23 +08:00
// 逻辑: 使用有效defName( 可能是原始的, 也可能是生成的匿名ID) 作为_items字典的键
_items . Add ( effectiveDefName , itemResource ) ;
2025-08-27 19:56:49 +08:00
if ( ! _itemsByName . ContainsKey ( itemResource . Name ) )
2025-09-19 08:26:54 +08:00
_itemsByName . Add ( itemResource . Name , new List < ItemResource > ( ) ) ;
2025-08-27 19:56:49 +08:00
_itemsByName [ itemResource . Name ] . Add ( itemResource ) ;
2025-08-19 20:22:10 +08:00
}
2025-10-10 14:08:23 +08:00
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
2025-08-19 20:22:10 +08:00
}
2025-09-19 08:26:54 +08:00
public ItemResource GetItem ( string defName )
2025-08-19 20:22:10 +08:00
{
2025-10-03 00:31:34 +08:00
return string . IsNullOrEmpty ( defName ) ? defaultItem : _items . GetValueOrDefault ( defName , defaultItem ) ;
2025-08-19 20:22:10 +08:00
}
2025-10-10 14:08:23 +08:00
2025-09-19 08:26:54 +08:00
public ItemResource FindItemByName ( string itemName )
2025-08-19 20:22:10 +08:00
{
2025-10-10 14:08:23 +08:00
return string . IsNullOrEmpty ( itemName )
? defaultItem
: _itemsByName . GetValueOrDefault ( itemName ) ? . FirstOrDefault ( ) ;
2025-08-27 19:56:49 +08:00
}
2025-09-19 08:26:54 +08:00
public List < ItemResource > FindAllItemsByName ( string itemName )
2025-08-27 19:56:49 +08:00
{
2025-10-10 14:08:23 +08:00
return string . IsNullOrEmpty ( itemName )
? new List < ItemResource > ( )
: _itemsByName . GetValueOrDefault ( itemName , new List < ItemResource > ( ) ) ;
2025-08-27 19:56:49 +08:00
}
2025-10-10 14:08:23 +08:00
public ItemResource GetItem ( ItemDef def )
2025-08-27 19:56:49 +08:00
{
2025-10-10 14:08:23 +08:00
return GetItem ( def ? . defName ) ;
2025-08-19 20:22:10 +08:00
}
}
2025-10-10 14:08:23 +08:00
}