Files
Gen_Hack-and-Slash-Roguelite/Client/Assets/Scripts/Item/ItemResource.cs

119 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 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);
}
}
}