using UnityEngine; using UnityEngine.EventSystems; public class DraggablePanel : MonoBehaviour, IDragHandler, IBeginDragHandler, IEndDragHandler { public GameObject dragHandle; public RectTransform rectTransform; public Canvas canvas; public Vector2 offset; public bool isDragging; private void Awake() { // rectTransform = GetComponent(); canvas = GetComponentInParent(); } public void OnBeginDrag(PointerEventData eventData) { if (IsPointerOverDragHandle(eventData)) { isDragging = true; RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas.transform as RectTransform, eventData.position, eventData.pressEventCamera, out var localCursorPoint); offset = rectTransform.anchoredPosition - localCursorPoint; } } public void OnDrag(PointerEventData eventData) { if (isDragging) if (RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas.transform as RectTransform, eventData.position, eventData.pressEventCamera, out var localCursorPoint)) rectTransform.anchoredPosition = localCursorPoint + offset; } public void OnEndDrag(PointerEventData eventData) { isDragging = false; } private bool IsPointerOverDragHandle(PointerEventData eventData) { return dragHandle != null && RectTransformUtility.RectangleContainsScreenPoint( dragHandle.GetComponent(), eventData.position, eventData.pressEventCamera); } }