using UnityEngine; using BaseGames.Equipment; namespace BaseGames.World.Shop { // ─── 商品效果基类及子类 ────────────────────────────────────────────────── // 使用 [SerializeReference] 多态序列化:Inspector 中右键可选择具体效果类型, // 只显示该类型所需字段,消除原平铺字段方案中大量空字段的噪音。 [System.Serializable] public abstract class ShopItemEffect { public abstract ShopItemType Type { get; } } [System.Serializable] public class HealthRestorationEffect : ShopItemEffect { public override ShopItemType Type => ShopItemType.HealthRestoration; /// 恢复的 HP 量。 public int Amount; } [System.Serializable] public class CharmItemEffect : ShopItemEffect { public override ShopItemType Type => ShopItemType.CharmItem; /// 购买后解锁/获得的护符。 public CharmSO CharmReference; } [System.Serializable] public class KeyItemEffect : ShopItemEffect { public override ShopItemType Type => ShopItemType.KeyItem; /// 授予玩家的关键道具 ID(对应 GameIds.Collectible)。 public string KeyItemId; } [System.Serializable] public class ConsumableBuffEffect : ShopItemEffect { public override ShopItemType Type => ShopItemType.ConsumableBuff; // 可按需在此扩展 BuffId、Duration、Magnitude 等字段 } [System.Serializable] public class MapFragmentEffect : ShopItemEffect { public override ShopItemType Type => ShopItemType.MapFragment; /// 购买后揭示的房间 ID(对应 MapManager.SetMapped)。 public string RoomId; } // ─── 商品 SO ────────────────────────────────────────────────────────────── /// /// 商店单品 SO(架构 15_MapShopModule §2.1)。 /// 资产路径: Assets/ScriptableObjects/Shop/Item_{ItemId}.asset /// [CreateAssetMenu(menuName = "World/Shop/ShopItem")] public class ShopItemSO : ScriptableObject { [Header("标识")] public string ItemId; public string DisplayName; [TextArea(2, 5)] public string Description; public Sprite Icon; [Header("价格")] public int BasePrice; public bool IsUnique; // 购买一次后永久从库存移除 public int MaxPurchaseCount = -1; // -1 = 无限次 [Header("商品效果")] [SerializeReference] public ShopItemEffect Effect; /// /// 便捷属性:从 Effect 类型推导商品分类,供 ShopPanel/UI 按类型渲染图标或提示文字。 /// Effect 为 null 时回退到 HealthRestoration(Inspector 未配置的保护值)。 /// public ShopItemType ItemType => Effect?.Type ?? ShopItemType.HealthRestoration; } public enum ShopItemType { HealthRestoration, CharmItem, KeyItem, ConsumableBuff, MapFragment, } }