49 lines
1.6 KiB
C#
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);
|
|
}
|
|
} |