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 readonly int zoomInLayerSortOrder = 100; private float zoomInAnimationDuration; private float dragTimer = 0f; private readonly float dragTriggerTimer = 0.3f; private struct CardTransformFromHand // 存储卡牌处于手中时的位置信息 { public Vector3 POSITION; public Quaternion ROTATION; public Vector3 SCALE; public int LAYER_SORT_ORDER; } private enum CardHandleState { WAIT = 0, DRAG_BASIC = 1, DRAG_OUTSIDE_HAND = 2, DRAG_INSIDE_HAND = 3 } public int GetID(bool isInstance) => isInstance ? instanceID : ID; public void SetAreaCollider2D(Collider2D collider2, float dragDuration) { areaCollider2D = collider2; zoomInAnimationDuration = dragDuration; } public 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() { if (turnSingleton.GetCardManagerLockOneCardBeingUsed()) return; cardState = CardHandleState.DRAG_BASIC; turnSingleton.SetCardManagerLockOneCardBeingUsed(true); dragTimer = 0f; } private void OnMouseUp() { dragTimer = 0f; Sequence seq = DOTween.Sequence(); seq.Join(transform.DOMove(cardTransformFromHand.POSITION, zoomInAnimationDuration)); seq.Join(transform.DOScale(cardTransformFromHand.SCALE, zoomInAnimationDuration)); seq.Join(transform.DORotateQuaternion(cardTransformFromHand.ROTATION, zoomInAnimationDuration)); seq.OnComplete(() => turnSingleton.SetCardManagerLockOneCardBeingUsed(false)); spriteRender.sortingOrder = cardTransformFromHand.LAYER_SORT_ORDER; cardBackgroundUI.sortingOrder = cardTransformFromHand.LAYER_SORT_ORDER - 1; canvas.sortingOrder = cardTransformFromHand.LAYER_SORT_ORDER + 1; cardState = CardHandleState.WAIT; } private void OnMouseDrag() { if (cardState == CardHandleState.WAIT) return; Vector3 mousePosition = mainCamera.ScreenToWorldPoint(Input.mousePosition); mousePosition.z = 0f; bool isInsideHandCardArea = areaCollider2D.OverlapPoint(mousePosition); if (isInsideHandCardArea) OnMouseDragInsideHandCardArea(); else OnMouseDragOutsizeHandCardArea(mousePosition); } private void OnMouseDragInsideHandCardArea() { if (cardState == CardHandleState.DRAG_INSIDE_HAND) return; dragTimer += Time.deltaTime; if (dragTimer >= dragTriggerTimer) { cardState = CardHandleState.DRAG_INSIDE_HAND; Sequence seq = DOTween.Sequence(); seq.Join(transform.DOMove(Vector3.zero, zoomInAnimationDuration)); seq.Join(transform.DOScale(cardTransformFromHand.SCALE * 2f, zoomInAnimationDuration)); seq.Join(transform.DORotateQuaternion(Quaternion.identity, zoomInAnimationDuration)); spriteRender.sortingOrder = zoomInLayerSortOrder; cardBackgroundUI.sortingOrder = zoomInLayerSortOrder - 1; canvas.sortingOrder = zoomInLayerSortOrder + 1; } } private void OnMouseDragOutsizeHandCardArea(Vector3 mousePosition) { dragTimer = 0f; cardState = CardHandleState.DRAG_OUTSIDE_HAND; transform.localScale = cardTransformFromHand.SCALE / 3f; transform.position = mousePosition; } 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 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; }); } }