using System.Collections.Generic; using UnityEngine; /// /// 拆家版固定八卡组、四张手牌轮转管理器。 /// public class BattleDeckCycle : MonoBehaviour { public static BattleDeckCycle Instance { get; private set; } [SerializeField] private Transform cardRoot; [SerializeField] private int visibleSlotCount = 4; [SerializeField] private string[] deckDataNames = { "人类士兵Data", "弓箭手Data", "盾卫Data", "精锐士兵Data", "法师Data", "狂暴狼人Data", "石巨人Data", "弓箭猎人Data" }; private readonly List deck = new List(); private readonly List hand = new List(); private readonly Queue drawQueue = new Queue(); private SummonCardButton[] buttons; private void Awake() { if (Instance != null && Instance != this) { Destroy(gameObject); return; } Instance = this; BuildDeck(); } private void Start() { if (cardRoot == null) cardRoot = GameObject.Find("角色卡片")?.transform; buttons = cardRoot != null ? cardRoot.GetComponentsInChildren(true) : FindObjectsOfType(true); System.Array.Sort(buttons, (a, b) => a.summonSlot.CompareTo(b.summonSlot)); HideExtraSlots(); hand.Clear(); drawQueue.Clear(); for (int i = 0; i < visibleSlotCount && i < deck.Count; i++) hand.Add(deck[i]); for (int i = visibleSlotCount; i < deck.Count; i++) drawQueue.Enqueue(deck[i]); RefreshAllCards(); } public CharacterData GetCard(int slot) { int index = slot - 1; return index >= 0 && index < hand.Count ? hand[index] : null; } public bool TryPlay(int slot) { CharacterData card = GetCard(slot); if (card == null || card.unitPrefab == null || CastleSpawnManager.Instance == null) return false; if (!CastleSpawnManager.Instance.TrySpawn(card, 0)) return false; int index = slot - 1; CharacterData played = hand[index]; hand[index] = drawQueue.Dequeue(); drawQueue.Enqueue(played); RefreshAllCards(); return true; } private void BuildDeck() { deck.Clear(); foreach (string dataName in deckDataNames) { CharacterData data = Resources.Load("Data/" + dataName); if (data == null) { Debug.LogWarning($"卡组缺少角色数据: Resources/Data/{dataName}.asset"); continue; } deck.Add(data); } } private void HideExtraSlots() { foreach (var button in buttons) { if (button != null && button.summonSlot > visibleSlotCount) button.gameObject.SetActive(false); } } private void RefreshAllCards() { if (buttons == null) return; foreach (var button in buttons) { if (button == null || button.summonSlot > visibleSlotCount) continue; button.SetDeckCharacter(GetCard(button.summonSlot)); } } }