2025-11-23 16:29:58 +08:00

160 lines
5.9 KiB
C#

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 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;
}
public void UnSetAreaCollider2D() => areaCollider2D = null;
public void SetupCard(int id, Camera camera1)
{
if (isSetup) return;
if (!turnSingleton) turnSingleton = TurnManagerSingleton.Instance;
if (!spriteRender) spriteRender = GetComponent<SpriteRenderer>();
if (!cardBackgroundUI) cardBackgroundUI = transform.GetChild(0).GetComponent<SpriteRenderer>();
if (!canvas) canvas = transform.GetChild(1).GetComponent<Canvas>();
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()
{
if (!isCardDragAnimationPlayed)
reset_card_status();
else
{
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;
Vector3 mousePosition = mainCamera.ScreenToWorldPoint(Input.mousePosition);
bool isInsideHandCardArea = areaCollider2D.OverlapPoint(mousePosition);
if (isInsideHandCardArea)
{
if (!isCardDragAnimationPlayed) return;
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));
isCardDragAnimationPlayed = false;
}
else
{
if (!isCardDragAnimationPlayed)
{
Sequence seq = DOTween.Sequence();
seq.Join(transform.DOScale(cardTransformFromHand.SCALE / 3f, cardAnimationDuration));
seq.Join(transform.DORotateQuaternion(Quaternion.identity, cardAnimationDuration));
isCardDragAnimationPlayed = true;
}
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 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;
});
}
}