163 lines
6.1 KiB
C#
163 lines
6.1 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 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<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()
|
|
{
|
|
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;
|
|
});
|
|
}
|
|
} |