173 lines
7.7 KiB
C#
173 lines
7.7 KiB
C#
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<GameObject> 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<Card> cardDeckList; // 牌组
|
|
private readonly List<Card> 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<TurnCardManager>();
|
|
characterManager = GetComponent<TurnCharacterManager>();
|
|
uiManager = GetComponent<TurnUIManager>();
|
|
enemyManager = GetComponent<TurnEnemyManager>();
|
|
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<TurnManagerStateEnum> 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>()
|
|
{ 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>() { TurnManagerStateEnum.START_SELF_TURN })) return;
|
|
if (turnManagerSingleton.GetNeedDebugLog()) turnManagerSingleton.PrintMsg("TurnManager", "状态切换", "停留我方回合");
|
|
turnManagerState = TurnManagerStateEnum.STAY_SELF_TURN;
|
|
}
|
|
|
|
private void TurnManagerEndSelfTurn() // 结束我方回合
|
|
{
|
|
if (!GetNowTurnManagerIsTargetState(new List<TurnManagerStateEnum>() { 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>()
|
|
{ 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>() { 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<Card>(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();
|
|
}
|
|
}
|
|
} |