evershade/Assets/DraggableUIPanel.cs

49 lines
1.6 KiB
C#

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<RectTransform>();
canvas = GetComponentInParent<Canvas>();
}
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<RectTransform>(),
eventData.position,
eventData.pressEventCamera);
}
}