| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- 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<int,Vector3> OnBeginDragEvent;
- public UnityEvent<int,Vector3> OnEndDragEvent;
- public UnityEvent<int, Vector3> 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);
- }
- }
|