using UnityEngine; using UnityEngine.UIElements; namespace DanieleMarotta.RiversongCodeShowcase { public class DraggableManipulator : PointerManipulator { private const string DraggedUssClassName = "dragged"; private Vector2 _startMousePosition; private Vector2 _startElementPosition; private VisualElement _draggedElement; public DraggableManipulator(VisualElement draggedElement) { _draggedElement = draggedElement; } protected override void RegisterCallbacksOnTarget() { target.RegisterCallback(OnPointerDown); target.RegisterCallback(OnPointerMove); target.RegisterCallback(OnPointerUp); } protected override void UnregisterCallbacksFromTarget() { target.UnregisterCallback(OnPointerDown); target.UnregisterCallback(OnPointerMove); target.UnregisterCallback(OnPointerUp); } private void OnPointerDown(PointerDownEvent evt) { if (evt.button != 0) return; target.CapturePointer(evt.pointerId); evt.StopPropagation(); _startMousePosition = evt.position; _startElementPosition = new Vector2(_draggedElement.resolvedStyle.left, _draggedElement.resolvedStyle.top); _draggedElement.AddToClassList(DraggedUssClassName); } private void OnPointerMove(PointerMoveEvent evt) { if (!target.HasPointerCapture(evt.pointerId)) return; var delta = (Vector2)evt.position - _startMousePosition; _draggedElement.style.left = _startElementPosition.x + delta.x; _draggedElement.style.top = _startElementPosition.y + delta.y; } private void OnPointerUp(PointerUpEvent evt) { if (!target.HasPointerCapture(evt.pointerId)) return; target.ReleasePointer(evt.pointerId); _draggedElement.RemoveFromClassList(DraggedUssClassName); } } }