2023-08-17 08:43:02 +08:00
|
|
|
|
using System;
|
|
|
|
|
using UnityEngine;
|
2022-06-09 00:50:36 +08:00
|
|
|
|
using UnityEngine.EventSystems;
|
2023-08-17 08:43:02 +08:00
|
|
|
|
using UnityEngine.Serialization;
|
2022-06-09 00:50:36 +08:00
|
|
|
|
|
|
|
|
|
public class UIElementDragger : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
|
|
|
|
|
{
|
2023-08-17 08:43:02 +08:00
|
|
|
|
[SerializeField]
|
|
|
|
|
private Target m_Target;
|
2022-06-09 00:50:36 +08:00
|
|
|
|
|
2023-08-17 08:43:02 +08:00
|
|
|
|
[SerializeField]
|
|
|
|
|
private Transform m_CustomTarget;
|
|
|
|
|
|
|
|
|
|
[FormerlySerializedAs("ex2")]
|
|
|
|
|
[SerializeField]
|
|
|
|
|
private bool m_UseCanvasScale;
|
|
|
|
|
|
|
|
|
|
private Canvas _canvas;
|
|
|
|
|
private RectTransform _rectTransform;
|
2022-06-09 00:50:36 +08:00
|
|
|
|
|
|
|
|
|
private void OnEnable()
|
|
|
|
|
{
|
2023-08-17 08:43:02 +08:00
|
|
|
|
_rectTransform = GetComponent<RectTransform>();
|
|
|
|
|
_canvas = GetComponentInParent<Canvas>();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void OnBeginDrag(PointerEventData eventData)
|
|
|
|
|
{
|
2022-06-09 00:50:36 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void OnDrag(PointerEventData eventData)
|
|
|
|
|
{
|
|
|
|
|
var delta = (Vector3)GetLocalDelta(eventData.delta);
|
|
|
|
|
|
|
|
|
|
switch (m_Target)
|
|
|
|
|
{
|
|
|
|
|
case Target.Self:
|
2023-08-17 08:43:02 +08:00
|
|
|
|
_rectTransform.localPosition += delta;
|
2022-06-09 00:50:36 +08:00
|
|
|
|
break;
|
|
|
|
|
case Target.Parent:
|
2023-08-17 08:43:02 +08:00
|
|
|
|
_rectTransform.parent.localPosition += delta;
|
2022-06-09 00:50:36 +08:00
|
|
|
|
break;
|
|
|
|
|
case Target.Custom:
|
2023-08-17 08:43:02 +08:00
|
|
|
|
_rectTransform.localPosition += delta;
|
2022-06-09 00:50:36 +08:00
|
|
|
|
if (m_CustomTarget)
|
|
|
|
|
{
|
2023-08-17 08:43:02 +08:00
|
|
|
|
if (m_UseCanvasScale)
|
|
|
|
|
{
|
|
|
|
|
delta.Scale(_canvas.rootCanvas.transform.localScale);
|
|
|
|
|
}
|
|
|
|
|
|
2022-06-09 00:50:36 +08:00
|
|
|
|
m_CustomTarget.localPosition += delta;
|
|
|
|
|
}
|
2023-08-17 08:43:02 +08:00
|
|
|
|
|
2022-06-09 00:50:36 +08:00
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void OnEndDrag(PointerEventData eventData)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private Vector2 GetLocalDelta(Vector2 evDelta)
|
|
|
|
|
{
|
2023-08-17 08:43:02 +08:00
|
|
|
|
switch (_canvas.renderMode)
|
2022-06-09 00:50:36 +08:00
|
|
|
|
{
|
|
|
|
|
case RenderMode.ScreenSpaceOverlay:
|
2023-08-17 08:43:02 +08:00
|
|
|
|
{
|
|
|
|
|
var zero = transform.InverseTransformPoint(Vector2.zero);
|
|
|
|
|
var delta = transform.InverseTransformPoint(evDelta);
|
|
|
|
|
return delta - zero;
|
|
|
|
|
}
|
2022-06-09 00:50:36 +08:00
|
|
|
|
case RenderMode.ScreenSpaceCamera:
|
|
|
|
|
case RenderMode.WorldSpace:
|
2023-08-17 08:43:02 +08:00
|
|
|
|
{
|
|
|
|
|
RectTransformUtility.ScreenPointToLocalPointInRectangle(_rectTransform, Vector2.zero,
|
|
|
|
|
_canvas.worldCamera, out var zero);
|
|
|
|
|
RectTransformUtility.ScreenPointToLocalPointInRectangle(_rectTransform, evDelta,
|
|
|
|
|
_canvas.worldCamera, out var delta);
|
|
|
|
|
return delta - zero;
|
|
|
|
|
}
|
2022-06-09 00:50:36 +08:00
|
|
|
|
default:
|
2023-08-17 08:43:02 +08:00
|
|
|
|
throw new NotSupportedException();
|
2022-06-09 00:50:36 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
2023-08-17 08:43:02 +08:00
|
|
|
|
|
|
|
|
|
private enum Target
|
|
|
|
|
{
|
|
|
|
|
Self,
|
|
|
|
|
Parent,
|
|
|
|
|
Custom
|
|
|
|
|
}
|
|
|
|
|
}
|