using System; using System.Collections; using System.Collections.Generic; using DG.Tweening; using UnityEngine; public class Card : MonoBehaviour { // ========= serializeField ======== [SerializeField] private int ID; [SerializeField] private int instanceID; // ========= private ========= private Collider2D areaCollider2D; private TurnManagerSingleton turnSingleton; private SpriteRenderer spriteRender; private Canvas canvas; private SpriteRenderer cardBackgroundUI; private CardTransformFromHand cardTransformFromHand = new CardTransformFromHand(); private CardHandleState cardState; private bool isSetup = false; private Camera mainCamera; private float cardAnimationDuration; private bool isCardDragAnimationPlayed = false; private readonly Vector3 dropScale = new Vector3(0.05f, 0.05f, 0.05f); private struct CardTransformFromHand // 存储卡牌处于手中时的位置信息 { public Vector3 POSITION; public Quaternion ROTATION; public Vector3 SCALE; public int LAYER_SORT_ORDER; } private enum CardHandleState { WAIT = 0, DRAG = 3 } public int GetID(bool isInstance) => isInstance ? instanceID : ID; public void SetAreaCollider2D(Collider2D collider2, float dragDuration) { areaCollider2D = collider2; cardAnimationDuration = dragDuration; } private void UnSetAreaCollider2D() => areaCollider2D = null; public void SetupCard(int id, Camera camera1) { if (isSetup) return; if (!turnSingleton) turnSingleton = TurnManagerSingleton.Instance; if (!spriteRender) spriteRender = GetComponent(); if (!cardBackgroundUI) cardBackgroundUI = transform.GetChild(0).GetComponent(); if (!canvas) canvas = transform.GetChild(1).GetComponent(); cardTransformFromHand.SCALE = transform.localScale; transform.localScale = Vector3.zero; instanceID = id; cardState = CardHandleState.WAIT; mainCamera = camera1; isSetup = true; } private void OnMouseDown() { cardState = CardHandleState.DRAG; turnSingleton.SetCardManagerLockOneCardBeingUsed(true); } private void OnMouseUp() { Sequence seq = DOTween.Sequence(); seq.Join(transform.DOMove(cardTransformFromHand.POSITION, cardAnimationDuration)); seq.Join(transform.DOScale(cardTransformFromHand.SCALE, cardAnimationDuration)); seq.Join(transform.DORotateQuaternion(cardTransformFromHand.ROTATION, cardAnimationDuration)); seq.onComplete = reset_card_status; return; void reset_card_status() { cardState = CardHandleState.WAIT; // isCardDragAnimationPlayed = false; turnSingleton.SetCardManagerLockOneCardBeingUsed(false); // 解锁 if (turnSingleton.GetNeedDebugLog()) turnSingleton.PrintMsg("Card", instanceID.ToString(), "卡牌已返回手牌"); } } private void OnMouseDrag() { if (cardState != CardHandleState.DRAG) return; if (!turnSingleton.CompareManagerState(TurnManager.TurnManagerStateEnum.STAY_SELF_TURN)) return; Vector3 mousePosition = mainCamera.ScreenToWorldPoint(Input.mousePosition); bool isInsideHandCardArea = areaCollider2D.OverlapPoint(mousePosition); if (isInsideHandCardArea) { transform.localScale = cardTransformFromHand.SCALE; transform.rotation = cardTransformFromHand.ROTATION; transform.position = cardTransformFromHand.POSITION; } else { transform.localScale = cardTransformFromHand.SCALE / 3f; transform.rotation = Quaternion.identity; mousePosition.z = 0f; transform.position = mousePosition; if (turnSingleton.GetNeedDebugLog()) turnSingleton.PrintMsg("Card", instanceID.ToString(), "卡牌正在被拖拽"); } } public Sequence GetTweenMoveCardGoDeck(Vector3 doGoPosition, Quaternion doGoRotation, Vector3 doGoScale, float doGoDuration) { transform.localScale = Vector3.zero; gameObject.SetActive(true); Sequence seq = DOTween.Sequence(); seq.Pause(); seq.Join(transform.DOMove(doGoPosition, doGoDuration)); seq.Join(transform.DOScale(doGoScale, doGoDuration)); seq.Join(transform.DORotateQuaternion(doGoRotation, doGoDuration)); return seq; } public Sequence CardGotoDrop(Transform dropCardContainer, float animationDuration, Transform dropCardChildContainer) { Sequence seq = DOTween.Sequence(); seq.Join(transform.DOScale(dropScale, animationDuration)); seq.Join(transform.DOMove(dropCardContainer.position, animationDuration)); seq.Join(transform.DORotateQuaternion(Quaternion.identity, animationDuration)); seq.OnComplete(() => { UnSetAreaCollider2D(); transform.parent = dropCardChildContainer; transform.localPosition = Vector3.zero; gameObject.SetActive(false); }); return seq; } public void GetTweenMoveCardGoHand(Vector3 movePosition, Quaternion doRotation, float doDuration, int doLayerSortOrder, Transform cardContainer) { transform.SetParent(cardContainer); gameObject.SetActive(true); movePosition.z = -doLayerSortOrder * 0.5f; spriteRender.sortingOrder = doLayerSortOrder * 3; cardBackgroundUI.sortingOrder = doLayerSortOrder * 3 - 1; canvas.sortingOrder = doLayerSortOrder * 3 + 1; Sequence seq = DOTween.Sequence(); seq.Join(transform.DOMove(movePosition, doDuration)); seq.Join(transform.DOScale(cardTransformFromHand.SCALE, doDuration)); seq.Join(transform.DORotateQuaternion(doRotation, doDuration)); seq.OnComplete(() => // 记录默认数值 { cardTransformFromHand.POSITION = movePosition; cardTransformFromHand.ROTATION = doRotation; cardTransformFromHand.LAYER_SORT_ORDER = doLayerSortOrder * 3; }); } }