using UnityEngine; using UnityEngine.Events; using UnityEngine.EventSystems; public class DraggablePolygonPoint : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler { //操作对应的下标 [SerializeField] int index = 0; [SerializeField] RectTransform parent; private bool dragging = false; private bool useCenterDrag = false; public UnityEvent OnBeginDragEvent; public UnityEvent OnEndDragEvent; public UnityEvent OnDragEvent; Vector2 pointerOffset; RectTransform rect; void Awake() { rect = parent != null ? parent : (RectTransform)(transform); } public void SetUseCenterDrag(bool value) { useCenterDrag = value; } Vector2 GetDragAnchorWorldPosition() { if (!useCenterDrag) return rect.position; return rect.TransformPoint(rect.rect.center); } void MoveToDragAnchor(Vector2 targetWorldPosition) { if (!useCenterDrag) { rect.position = targetWorldPosition; return; } Vector2 delta = targetWorldPosition - (Vector2)rect.TransformPoint(rect.rect.center); rect.position += (Vector3)delta; } public void OnBeginDrag(PointerEventData eventData) { dragging = true; pointerOffset = eventData.position - GetDragAnchorWorldPosition(); OnBeginDragEvent.Invoke(index, rect.localPosition); } public void OnDrag(PointerEventData eventData) { if (dragging) { MoveToDragAnchor(eventData.position - pointerOffset); OnDragEvent.Invoke(index, rect.localPosition); } } public void OnEndDrag(PointerEventData eventData) { dragging = false; // 更新多边形的顶点等操作... pointerOffset = Vector2.zero; OnEndDragEvent.Invoke(index, rect.localPosition); } }