119 lines
4.4 KiB
C#
119 lines
4.4 KiB
C#
using Data;
|
||
using Managers;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using UnityEngine;
|
||
|
||
namespace Item
|
||
{
|
||
/// <summary>
|
||
/// 表示游戏中的一个物品资源,包含了物品的各项基本属性和数据。
|
||
/// 这是一个只读的数据结构,用于存储物品的定义信息。
|
||
/// </summary>
|
||
public class ItemResource
|
||
{
|
||
/// <summary>
|
||
/// 构造函数:通过 ItemDef 对象初始化 ItemResource。
|
||
/// </summary>
|
||
/// <param name="def">物品的定义对象。</param>
|
||
/// <exception cref="ArgumentNullException">如果传入的 ItemDef 为 null,则抛出此异常。</exception>
|
||
public ItemResource(ItemDef def)
|
||
{
|
||
// 参数校验:在构造函数中进行参数非空检查至关重要,避免空引用异常。
|
||
if (def == null) throw new ArgumentNullException(nameof(def), "创建 ItemResource 时,ItemDef 不能为 null。");
|
||
|
||
// 从 ItemDef 对象中直接赋值 ItemResource 的所有属性。
|
||
// 这将创建 ItemResource 的逻辑完全封装在类内部,外部调用方无需关心具体属性的提取过程。
|
||
DefName = def.defName;
|
||
Name = def.label;
|
||
Description = def.description;
|
||
Rarity = def.rarity;
|
||
MaxStack = def.maxStack;
|
||
IsEquippable = def.ssEquippable;
|
||
FPS = def.FPS;
|
||
|
||
var sprites = new List<Sprite>();
|
||
var packID = def.packID;
|
||
|
||
// 逻辑修改:添加对 def.textures 的非空检查,避免 NullReferenceException
|
||
if (def.textures != null)
|
||
{
|
||
foreach (var texture in def.textures)
|
||
{
|
||
var spr = PackagesImageManager.Instance.GetSprite(packID, texture);
|
||
if (spr)
|
||
sprites.Add(spr);
|
||
else
|
||
// 统一日志信息,说明哪个纹理加载失败
|
||
Debug.LogWarning(
|
||
$"ItemResource: Failed to load sprite for texture '{texture}' for item '{def.defName}'.");
|
||
}
|
||
}
|
||
else
|
||
{
|
||
// 仅当 textures 为 null 时警告,因为它可能是预期的数据状态(无图标)
|
||
Debug.LogWarning(
|
||
$"ItemResource: ItemDef '{def.defName}' has a null textures array. No icons will be loaded.");
|
||
}
|
||
|
||
// 逻辑修改:Icon 属性现在是 IReadOnlyList<Sprite> 类型,确保外部只读访问
|
||
Icon = sprites.AsReadOnly(); // 使用 AsReadOnly() 获得一个只读包装器
|
||
}
|
||
|
||
/// <summary>
|
||
/// 物品的定义名称,通常作为其唯一标识符。
|
||
/// </summary>
|
||
public string DefName { get; protected set; }
|
||
|
||
/// <summary>
|
||
/// 物品的显示名称(例如,在UI中显示的名称)。
|
||
/// </summary>
|
||
public string Name { get; protected set; }
|
||
|
||
/// <summary>
|
||
/// 物品的描述文本。
|
||
/// </summary>
|
||
public string Description { get; protected set; }
|
||
|
||
/// <summary>
|
||
/// 物品的图标精灵集合。提供只读访问以保持数据结构不变性。
|
||
/// </summary>
|
||
// 逻辑修改:Icon 属性更改为 IReadOnlyList<Sprite>
|
||
public IReadOnlyList<Sprite> Icon { get; protected set; }
|
||
|
||
/// <summary>
|
||
/// 物品的稀有度。
|
||
/// </summary>
|
||
public ItemRarity Rarity { get; protected set; }
|
||
|
||
/// <summary>
|
||
/// 物品的最大堆叠数量。
|
||
/// </summary>
|
||
public int MaxStack { get; protected set; }
|
||
|
||
/// <summary>
|
||
/// 指示物品是否可以被装备。
|
||
/// </summary>
|
||
public bool IsEquippable { get; protected set; }
|
||
|
||
/// <summary>
|
||
/// 物品的帧率(如果适用)。
|
||
/// </summary>
|
||
public float FPS { get; protected set; }
|
||
|
||
public static ItemResource GetDefault()
|
||
{
|
||
ItemDef defaultDef = new()
|
||
{
|
||
defName = "default",
|
||
label = "错误物品",
|
||
description = "你看到这个物品表示加载出错了",
|
||
rarity = ItemRarity.Uncommon,
|
||
maxStack = 1,
|
||
ssEquippable = false
|
||
};
|
||
return new ItemResource(defaultDef);
|
||
}
|
||
}
|
||
}
|