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 (CombatScenarioEventOS.Instance.LOCK_GET(EVENT_EXCLUSIVE_LOCK.LOCK_I_DRAG_CARD) && !is_drag) return; if (!CombatScenarioEventOS.Instance.LOCK_APPLY(EVENT_EXCLUSIVE_LOCK.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(() => { CombatScenarioEventOS.Instance.LOCK_RELEASE(EVENT_EXCLUSIVE_LOCK.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) CombatScenarioEventOS.Instance.EVENT_REGISTER (EVENT_ENUM.EVENT_LET_CARD_DRAW_CARD, callback); else CombatScenarioEventOS.Instance.EVENT_UNREGISTER (EVENT_ENUM.EVENT_LET_CARD_DRAW_CARD, callback); return; void callback(EVENT_STRUCT.STRUCT_EVENT_CARD_DRAW_CARD args) { if (args.METHOD != EVENT_METHODS.POST) { Debug.LogError($"消息回调失败: [{args.GetType()}], 不允许的消息类型: {args.METHOD}"); return; } if (args.ID != ID) return; // 不接受其他ID的卡牌以及其他消息 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; }); } } private void register_drop_card(bool is_register = true) // 注册弃牌事件 { if (is_register) CombatScenarioEventOS.Instance.EVENT_REGISTER (EVENT_ENUM.EVENT_LET_CARD_DROP_SELF, callback); else CombatScenarioEventOS.Instance.EVENT_UNREGISTER (EVENT_ENUM.EVENT_LET_CARD_DROP_SELF, callback); return; void callback(EVENT_STRUCT.STRUCT_EVENT_CARD_DROP_CARD args) { if (args.METHOD != EVENT_METHODS.DELETE) { Debug.LogError($"消息回调失败: [{args.GetType()}], 不允许的消息类型: {args.METHOD}"); return; } if (args.ID != ID) return; // 不接受其他ID的卡牌以及其他消息 float duration_scale = args.DURATION / 3f; float duration_move = args.DURATION - duration_scale; Sequence seq = DOTween.Sequence(); seq.Append(transform.DOScale(new Vector3(0.05f, 0.05f, 0.05f), duration_scale)); seq.Append(DOTween.Sequence() .Join(transform.DOMove(args.POSITION, duration_move)) .Join(transform.DORotateQuaternion(Quaternion.identity, duration_move))); seq.OnComplete(() => { Destroy(gameObject); }); } } }