2025-11-27 00:48:12 +08:00

160 lines
6.2 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
using DG.Tweening;
using UnityEngine;
using UnityEngine.Splines;
public class TurnCardManager : MonoBehaviour
{
[SerializeField] private Collider2D areaCollider2D;
[SerializeField] private SplineContainer splineContainer;
private Camera mainCamera;
private TurnManagerSingleton turnSingleton;
private CardManagerStateEnum cardManagerState;
private readonly List<Card> handCardList = new List<Card>();
private float moveAnimationDuration;
private float dragAnimationDuration;
private float dropAnimationDuration;
private Transform handCardContainer;
private bool isSetup;
private bool lockOneCardBeingUsed = false; // 是否锁定一个卡牌正在使用
private CardManagerStateEnum actionRecordState;
private enum CardManagerStateEnum
{
WAIT,
DEAL_CARD,
DROP_CARD,
DRAG_CARD,
}
public void SetupCardManager(float moveDuration, Transform parentContainer, float dragDuration, float dropCardDuration)
{
if (isSetup) return;
if (turnSingleton == null) turnSingleton = TurnManagerSingleton.Instance;
if (mainCamera == null) mainCamera = Camera.main;
moveAnimationDuration = moveDuration;
handCardContainer = parentContainer;
dragAnimationDuration = dragDuration;
dropAnimationDuration = dropCardDuration;
isSetup = true;
}
public void SetLockOneCardBeingUsed(bool isLock) => lockOneCardBeingUsed = isLock;
public bool GetLockOneCardBeingUsed() => lockOneCardBeingUsed;
private CardManagerStateEnum GetCardManagerState() => cardManagerState;
public bool GetCardManagerStateIsWait()
{
if (GetCardManagerState() != CardManagerStateEnum.WAIT)
{
turnSingleton.PrintErrorMsg("CardManager", "Error", $"CardManagerState = [{GetCardManagerState()}], Need State = [Wait]");
return false;
}
if (GetLockOneCardBeingUsed())
{
turnSingleton.PrintErrorMsg("CardManager", "Error", "One Card is being used");
return false;
}
return true;
}
private void SetCardManagerState(CardManagerStateEnum state) => cardManagerState = state;
public void DropCardAllFromHand(Transform dropCardContainer)
{
if (turnSingleton.GetNeedDebugLog()) turnSingleton.PrintMsg("CardManager", "动作切换", "开始弃牌");
Transform dropCardChildContainer = dropCardContainer.Find("CardContainer");
StartCoroutine(coroutine());
return;
IEnumerator coroutine()
{
SetCardManagerState(CardManagerStateEnum.DROP_CARD);
foreach (var card in handCardList)
{
Sequence tweenAnimation = card.CardGotoDrop(dropCardContainer, dropAnimationDuration, dropCardChildContainer);
turnSingleton.DropOutOneCard(card);
yield return tweenAnimation.WaitForCompletion();
}
handCardList.Clear();
SetCardManagerState(CardManagerStateEnum.WAIT);
TurnManagerEvent.CallTurnManagerEnterEnemyTurn();
}
}
public void MoveAllCardToDeckTransform(Transform dropCardinTransform, Transform deckTransform)
{
const string container_name = "CardContainer";
Transform dropCardContainer = dropCardinTransform.Find(container_name);
Transform cardDeckContainer = deckTransform.Find(container_name);
for (int i = dropCardContainer.childCount - 1; i >= 0; i--)
{
Transform card = dropCardContainer.GetChild(i);
card.SetParent(cardDeckContainer);
card.localPosition = Vector3.zero;
card.gameObject.SetActive(false);
}
}
public void TakeCard(int number)
{
if (turnSingleton.GetNeedDebugLog()) turnSingleton.PrintMsg("CardManager", "动作切换", $"开始抽卡:{number}");
SetCardManagerState(CardManagerStateEnum.DEAL_CARD);
StartCoroutine(enumerator());
return;
IEnumerator enumerator()
{
for (int i = 0; i < number; i++)
{
Card card = turnSingleton.TakeOutOneCard();
card.SetAreaCollider2D(areaCollider2D, dragAnimationDuration);
handCardList.Add(card);
if (turnSingleton.GetNeedDebugLog()) print($"[CardManager][抽卡ID]: {card.GetID(isInstance: true)}");
ReadjustCardPosition();
yield return new WaitForSeconds(moveAnimationDuration);
}
SetCardManagerState(CardManagerStateEnum.WAIT);
TurnManagerEvent.CallTurnManagerStaySelfTurn();
}
}
private void ReadjustCardPosition() // 重新调整卡牌位置
{
int handCardListCount = handCardList.Count;
if (handCardListCount == 0) return;
float cardSpacing = handCardListCount switch // 动态调整卡牌间距
{
<= 4 => 0.5f / (handCardListCount + 1),
<= 5 => 0.75f / (handCardListCount + 1),
_ => 1f / (handCardListCount + 1)
};
float firstCardPosition = 0.5f - (handCardListCount - 1) * cardSpacing / 2; // 获取第一个卡牌的位置
Spline spline = splineContainer.Spline; // 获取曲线
for (int i = 0; i < handCardList.Count; i++)
{
float position = firstCardPosition + i * cardSpacing;
Vector3 cardWorldPosition = spline.EvaluatePosition(position); // 获取曲线指定位置的坐标
cardWorldPosition += handCardContainer.position;
Vector3 forward = spline.EvaluateTangent(position); // 获取曲线指定的切线方向
Vector3 up = spline.EvaluateUpVector(position); // 获取曲线指定的UP向量
Vector3 upwards = Vector3.Cross(up, forward).normalized; // 切线和向上的夹角计算方向
Quaternion rotation = Quaternion.LookRotation(up, upwards);
Card handCard = handCardList[i];
handCard.GetTweenMoveCardGoHand(movePosition: cardWorldPosition, doRotation: rotation,
doDuration: moveAnimationDuration, doLayerSortOrder: i + 1, cardContainer: handCardContainer);
}
}
}