using System; using System.Collections; using System.Collections.Generic; using System.Linq; using DG.Tweening; using Unity.VisualScripting; using UnityEngine; public class TurnManager : MonoBehaviour { // ======== serializeField ======== [SerializeField] private List playerCharacterGo; // 玩家队伍列表(应该传入5个角色), 暂时只传3个 [SerializeField] private int defaultHandCardNumber = 5; // 默认手牌数量 [SerializeField] private float cardDealDuration = 0.25f; // 系统发牌动画时间 [SerializeField] private float cardDragDuration = 0.25f; // 每张卡牌拖拽动画时间 [SerializeField] private float cardDropDuration = 0.25f; // 系统弃牌动画时间 [SerializeField] private Transform cardDeckContainer; [SerializeField] private Transform cardHandContainer; [SerializeField] private Transform characterContainer; [SerializeField] private Transform dropCardContainer; // ======== private ======== private TurnManagerSingleton turnManagerSingleton; [SerializeField] private List cardDeckList; // 牌组 private readonly List cardPileList = new(); // 弃牌堆 private TurnManagerStateEnum turnManagerState; // 状态机 private TurnCharacterManager characterManager; private TurnCardManager cardManager; private TurnUIManager uiManager; private TurnEnemyManager enemyManager; public enum TurnManagerStateEnum { WAIT = 0, SETUP_STATE = 1, START_SELF_TURN = 2, STAY_SELF_TURN = 3, END_SELF_TURN = 4, START_ENEMY_TURN = 5, END_ENEMY_TURN = 6, SHUFFLE_CARD = 7, } private void Start() { turnManagerSingleton = TurnManagerSingleton.Instance; cardManager = GetComponent(); characterManager = GetComponent(); uiManager = GetComponent(); enemyManager = GetComponent(); TurnManagerEvent.OnTurnManagerStaySelfTurn += TurnManagerStaySelfTurn; TurnManagerEvent.OnTurnManagerEndSelfTurn += TurnManagerEndSelfTurn; TurnManagerEvent.OnTurnManagerEnterEnemyTurn += TurnManagerShuffleCard; // 弃牌以后判断是否需要洗牌再进入敌方回合 TurnManagerEvent.OnTurnManagerExitEnemyTurn += TurnManagerEndEnemyTurn; SetupTurnManager(); } public TurnManagerStateEnum GetTurnManagerState() => turnManagerState; private void SetupTurnManager() // 进入设置状态 { turnManagerState = TurnManagerStateEnum.SETUP_STATE; if (turnManagerSingleton.GetNeedDebugLog()) turnManagerSingleton.PrintMsg("TurnManager", "状态切换", "进入设置状态"); cardDeckList?.Clear(); cardPileList?.Clear(); characterManager.SetupCharacterManager(playerCharacterGo, cardDeckContainer, characterContainer); cardDeckList = characterManager.RenderCharacterSpriteReturnCardList(); cardManager.SetupCardManager(cardDealDuration, cardHandContainer, cardDragDuration, cardDropDuration); // cardManager.PlayAnimationShuffleCardToDeck(cardDealDuration); TurnManagerEnterSelfTurn(6); } public Card TakeOutOneCard() { Card card = cardDeckList[UnityEngine.Random.Range(0, cardDeckList.Count)]; cardDeckList.Remove(card); uiManager.UpdateUI_SetCardDeckNumberU(cardDeckContainer, cardDeckList.Count); return card; } public void DropOutOneCard(Card card) { cardPileList.Add(card); uiManager.UpdateUI_SetDropCardNumberU(dropCardContainer, cardPileList.Count); } private bool GetNowTurnManagerIsTargetState(List targetStateList) { if (targetStateList.Contains(GetTurnManagerState())) return true; string errorMsg = ""; if (targetStateList.Count == 1) errorMsg = $"[TurnManager][Error]: State Is [{GetTurnManagerState()}], Target Is [{targetStateList[0]}]"; if (targetStateList.Count == 2) errorMsg = $"[TurnManager][Error]: State Is [{GetTurnManagerState()}], Target Is [{targetStateList[0]}, {targetStateList[1]}]"; if (errorMsg != "") Debug.LogError(errorMsg); return false; } private void TurnManagerEnterSelfTurn(int cardNumber = 0) // 进入我方回合并抽卡, 必须传入抽卡数量才能进入 { if (!GetNowTurnManagerIsTargetState(new List() { TurnManagerStateEnum.SETUP_STATE, TurnManagerStateEnum.END_ENEMY_TURN })) return; if (turnManagerSingleton.GetNeedDebugLog()) turnManagerSingleton.PrintMsg("TurnManager", "状态切换", "进入我方回合"); turnManagerState = TurnManagerStateEnum.START_SELF_TURN; cardManager.TakeCard(cardNumber); } private void TurnManagerStaySelfTurn() // 停留我方回合 { if (!GetNowTurnManagerIsTargetState(new List() { TurnManagerStateEnum.START_SELF_TURN })) return; if (turnManagerSingleton.GetNeedDebugLog()) turnManagerSingleton.PrintMsg("TurnManager", "状态切换", "停留我方回合"); turnManagerState = TurnManagerStateEnum.STAY_SELF_TURN; } private void TurnManagerEndSelfTurn() // 结束我方回合 { if (!GetNowTurnManagerIsTargetState(new List() { TurnManagerStateEnum.STAY_SELF_TURN })) return; if (!cardManager.GetCardManagerStateIsWait()) return; if (turnManagerSingleton.GetNeedDebugLog()) turnManagerSingleton.PrintMsg("TurnManager", "状态切换", "结束我方回合"); turnManagerState = TurnManagerStateEnum.END_SELF_TURN; cardManager.DropCardAllFromHand(dropCardContainer); } private void TurnManagerEnterEnemyTurn() // 进入对方回合 { if (!GetNowTurnManagerIsTargetState(new List() { TurnManagerStateEnum.END_SELF_TURN, TurnManagerStateEnum.SHUFFLE_CARD })) return; if (turnManagerSingleton.GetNeedDebugLog()) turnManagerSingleton.PrintMsg("TurnManager", "状态切换", "进入对方回合"); turnManagerState = TurnManagerStateEnum.START_ENEMY_TURN; uiManager.EnterEnemyTurn(); enemyManager.SetupEnemyManager(); enemyManager.SetDebugEnemyTurn(); } private void TurnManagerEndEnemyTurn() // 结束对方回合 { if (!GetNowTurnManagerIsTargetState(new List() { TurnManagerStateEnum.START_ENEMY_TURN })) return; if (turnManagerSingleton.GetNeedDebugLog()) turnManagerSingleton.PrintMsg("TurnManager", "状态切换", "结束对方回合"); turnManagerState = TurnManagerStateEnum.END_ENEMY_TURN; uiManager.ExitEnemyTurn(); TurnManagerEnterSelfTurn(cardPileList.Count == 0 ? 6 : 5); } private void TurnManagerShuffleCard() { if (cardDeckList.Count != 0) { TurnManagerEnterEnemyTurn(); return; } if (turnManagerSingleton.GetNeedDebugLog()) turnManagerSingleton.PrintMsg("TurnManager", "状态切换", "开始洗牌"); turnManagerState = TurnManagerStateEnum.SHUFFLE_CARD; cardDeckList = new List(cardPileList); cardPileList.Clear(); uiManager.UpdateUI_SetCardDeckNumberU(cardDeckContainer, cardDeckList.Count); uiManager.UpdateUI_SetDropCardNumberU(dropCardContainer, cardPileList.Count); cardManager.MoveAllCardToDeckTransform(dropCardContainer, cardDeckContainer); StartCoroutine(enumerator()); IEnumerator enumerator() { for (var i = 0; i <= 3; i++) { yield return new WaitForSeconds(1); } TurnManagerEnterEnemyTurn(); } } }