using System; using UnityEngine; using UnityEngine.EventSystems; /// /// 打孔带在 UI 中的拖拽与点击交互。 /// namespace AibisDream.FixSystem { public class PunchTapeInteraction : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, IPointerClickHandler, IBeginDragHandler, IDragHandler, IEndDragHandler { private Canvas canvas; [HideInInspector] public bool isFavorited = false; private RectTransform rectTransform; private CursorMode cursorMode = CursorMode.Auto; private bool isLocked = false; private bool _favoriteDragActive; private void Awake() { rectTransform = GetComponent(); } private void OnEnable() { canvas = GetComponentInParent(); } private void OnDisable() { if (_favoriteDragActive) { _favoriteDragActive = false; PunchTapeFavoritesDragEvents.NotifyDragEnded(); } } public void OnPointerEnter(PointerEventData eventData) { } public void OnPointerExit(PointerEventData eventData) { Cursor.SetCursor(null, Vector2.zero, cursorMode); } public void OnPointerClick(PointerEventData eventData) { } public void OnBeginDrag(PointerEventData eventData) { if (!isFavorited || isLocked) return; transform.SetParent(canvas.transform, true); transform.localScale = Vector3.one; transform.SetAsLastSibling(); var cg = GetComponent(); if (cg != null) cg.blocksRaycasts = false; _favoriteDragActive = true; PunchTapeFavoritesDragEvents.NotifyDragStarted(); } public void OnDrag(PointerEventData eventData) { if (!isFavorited || isLocked) return; if (RectTransformUtility.ScreenPointToLocalPointInRectangle( canvas.transform as RectTransform, eventData.position, eventData.pressEventCamera, out Vector2 localPoint)) { rectTransform.localPosition = new Vector3(localPoint.x, localPoint.y + 200f, 0f); } transform.rotation = Quaternion.Euler(0, 0, -90f); } public void OnEndDrag(PointerEventData eventData) { if (!isFavorited || isLocked) return; var cg = GetComponent(); if (cg != null) cg.blocksRaycasts = true; var slot = eventData.pointerEnter? .GetComponentInParent(); var item = GetComponent(); bool accepted = slot != null && slot.TryAcceptDrop(item); if (_favoriteDragActive) { _favoriteDragActive = false; PunchTapeFavoritesDragEvents.NotifyDragEnded(); } if (accepted) { Destroy(gameObject); } else { var manager = PunchTapeManager.Instance; if (manager != null && manager.FavoritesPanel != null) manager.FavoritesPanel.ReturnToSlot(this); } } public void SetIsFavorited(bool favorited) { isFavorited = favorited; } public void SetIsLock(bool locked) { isLocked = locked; } } }