using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
namespace FrameCore.Asset.UI.Ext
{
public class OnDragStart : UnityEvent<GameObject>
{
}
public class OnDrag : UnityEvent<GameObject>
{
}
public class OnDragEnd : UnityEvent<GameObject>
{
}
public interface IUIDrag
{
OnDragStart OnDragStart { get; set; }
OnDragStart OnDrag { get; set; }
OnDragStart OnDragEnd { get; set; }
}
public class UIDrag : MonoBehaviour, IUIDrag, IDragHandler, IBeginDragHandler, IEndDragHandler
{
public OnDragStart OnDragStart { get; set; }
public OnDragStart OnDrag { get; set; }
public OnDragStart OnDragEnd { get; set; }
private Vector3 _mousePos;
private RectTransform _rect;
private void Awake()
{
OnDragStart = new OnDragStart();
OnDrag = new OnDragStart();
OnDragEnd = new OnDragStart();
_rect = GetComponent<RectTransform>();
}
public void OnBeginDrag(PointerEventData eventData)
{
_mousePos = Input.mousePosition;
OnDragStart?.Invoke(this.gameObject);
}
void IDragHandler.OnDrag(PointerEventData eventData)
{
_rect.anchoredPosition += (Vector2)(Input.mousePosition - _mousePos);
_mousePos = Input.mousePosition;
OnDrag?.Invoke(gameObject);
}
public void OnEndDrag(PointerEventData eventData)
{
OnDragEnd?.Invoke(this.gameObject);
}
}
}