using System; using System.Collections; using System.Collections.Generic; using DG.Tweening; using UnityEngine; public class Card : MonoBehaviour { // ========= serializeField ======== [SerializeField] private int coast = 9; // ========= private ========= // *************************** private int ID; private Canvas canvas; private SpriteRenderer sprite_renderer; private bool is_drag = false; // ========= Hover Message ========= private readonly Vector3 hover_position = Vector3.zero; private readonly Quaternion hover_rotation = Quaternion.identity; private const int hover_layer_sort_order = 100; private readonly float hover_duration = 0.15f; private struct CardStatus { public Vector3 POSITION; public Quaternion ROTATION; public Vector3 SCALE; public int SORTING_ORDER; } private CardStatus card_status = new CardStatus(); // ========= debug ========= private readonly Vector3 debug_draw_position = Vector3.zero; // **************************** // ========= private ========= private void Awake() { sprite_renderer = GetComponent(); canvas = transform.Find("Canvas").GetComponent(); if (canvas.renderMode == RenderMode.WorldSpace && canvas.worldCamera == null) { canvas.worldCamera = Camera.main; } card_status.SCALE = transform.localScale; transform.localScale = Vector3.zero; REGISTER_EVENT(); } private void OnDestroy() { UNREGISTER_EVENT(); } public void SetID(int id) => ID = id; private void REGISTER_EVENT() { register_draw_card(); register_drop_card(); } private void UNREGISTER_EVENT() { register_drop_card(false); register_draw_card(false); } // ******* Mouse *********** private void OnMouseDrag() { if (is_drag) return; if (CardOS.Instance.LOCK_GET(CardOSData.LOCK_EXCLUSIVE_CARD_ENUM.LOCK_OS_DEAL_CARD)) return; if (CardOS.Instance.LOCK_GET(CardOSData.LOCK_EXCLUSIVE_CARD_ENUM.LOCK_I_DRAG_CARD) && !is_drag) return; if (!CardOS.Instance.LOCK_APPLY(CardOSData.LOCK_EXCLUSIVE_CARD_ENUM.LOCK_I_DRAG_CARD)) return; Sequence seq = DOTween.Sequence(); seq.Join(transform.DOMove(hover_position, hover_duration)); seq.Join(transform.DOScale(card_status.SCALE * 2f, hover_duration)); seq.Join(transform.DORotateQuaternion(hover_rotation, hover_duration)); sprite_renderer.sortingOrder = hover_layer_sort_order; canvas.sortingOrder = hover_layer_sort_order + 1; is_drag = true; } private void OnMouseUp() { Sequence seq = DOTween.Sequence(); seq.Join(transform.DOMove(card_status.POSITION, hover_duration)); seq.Join(transform.DOScale(card_status.SCALE, hover_duration)); seq.Join(transform.DORotateQuaternion(card_status.ROTATION, hover_duration)); seq.OnComplete(() => { CardOS.Instance.LOCK_RELEASE(CardOSData.LOCK_EXCLUSIVE_CARD_ENUM.LOCK_I_DRAG_CARD); is_drag = false; }); sprite_renderer.sortingOrder = card_status.SORTING_ORDER; canvas.sortingOrder = card_status.SORTING_ORDER + 1; } // ************************** private void register_draw_card(bool is_register = true) { if (is_register) { CardOS.Instance.EVENT_REGISTER( CardOSData.EVENT_REGISTER_CARD_ENUM.EVENT_LET_ME_DRAW_CARD, callback); } else { CardOS.Instance.EVENT_UNREGISTER( CardOSData.EVENT_REGISTER_CARD_ENUM.EVENT_LET_ME_DRAW_CARD, callback); } void callback(CardOSData.STRUCT_EVENT_DRAW_CARD args) { // CardOS.Instance.LOCK_APPLY(CardOSData.LOCK_EXCLUSIVE_CARD_ENUM.SORRY_PLEASE_LOCK_I_MOVE_CARD); // 不接受其他ID的卡牌以及其他消息 if (args.ID != ID) return; Vector3 move_position = args.POSITION; Quaternion rotation = args.ROTATION; float duration = args.DURATION; int layer_sort_order = args.LAYER_SORT_ORDER; move_position.z = -layer_sort_order * 0.5f; sprite_renderer.sortingOrder = layer_sort_order * 2; canvas.sortingOrder = layer_sort_order * 2 + 1; Sequence seq = DOTween.Sequence(); seq.Join(transform.DOMove(move_position, duration)); seq.Join(transform.DOScale(card_status.SCALE, duration)); seq.Join(transform.DORotateQuaternion(rotation, duration)); seq.OnComplete(() => { // 记录默认数值 card_status.POSITION = move_position; card_status.ROTATION = rotation; card_status.SORTING_ORDER = layer_sort_order * 2; CardOS.Instance.EVENT_TRIGGER(CardOSData.EVENT_REGISTER_CARD_ENUM.EVENT_LET_OS_DEAL_CARD_FINISH, ID); // CardOS.Instance.LOCK_RELEASE(CardOSData.LOCK_EXCLUSIVE_CARD_ENUM.SORRY_PLEASE_LOCK_I_MOVE_CARD); }); } } private void register_drop_card(bool is_register = true) { if (is_register) { CardOS.Instance.EVENT_REGISTER( CardOSData.EVENT_REGISTER_CARD_ENUM.EVENT_LET_ME_DROP_CARD, callback); } else { CardOS.Instance.EVENT_UNREGISTER( CardOSData.EVENT_REGISTER_CARD_ENUM.EVENT_LET_ME_DROP_CARD, callback); } void callback(CardOSData.STRUCT_EVENT_DROP_CARD args) { // 不接受其他ID的卡牌以及其他消息 // if (args.ID != ID) return; Sequence seq = DOTween.Sequence(); seq.Append(transform.DOScale(new Vector3(0.05f, 0.05f, 0.05f), args.DURATION)); seq.Append( DOTween.Sequence() .Join(transform.DOMove(args.POSITION, args.DURATION)) .Join(transform.DORotateQuaternion(Quaternion.identity, args.DURATION)) ); seq.OnComplete(() => { Destroy(gameObject); }); } } }