DraggablePolygonPoint.cs 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. using UnityEngine;
  2. using UnityEngine.Events;
  3. using UnityEngine.EventSystems;
  4. public class DraggablePolygonPoint : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
  5. {
  6. //操作对应的下标
  7. [SerializeField]
  8. int index = 0;
  9. [SerializeField]
  10. RectTransform parent;
  11. private bool dragging = false;
  12. private bool useCenterDrag = false;
  13. public UnityEvent<int,Vector3> OnBeginDragEvent;
  14. public UnityEvent<int,Vector3> OnEndDragEvent;
  15. public UnityEvent<int, Vector3> OnDragEvent;
  16. Vector2 pointerOffset;
  17. RectTransform rect;
  18. void Awake() {
  19. rect = parent != null ? parent : (RectTransform)(transform);
  20. }
  21. public void SetUseCenterDrag(bool value)
  22. {
  23. useCenterDrag = value;
  24. }
  25. Vector2 GetDragAnchorWorldPosition()
  26. {
  27. if (!useCenterDrag)
  28. return rect.position;
  29. return rect.TransformPoint(rect.rect.center);
  30. }
  31. void MoveToDragAnchor(Vector2 targetWorldPosition)
  32. {
  33. if (!useCenterDrag)
  34. {
  35. rect.position = targetWorldPosition;
  36. return;
  37. }
  38. Vector2 delta = targetWorldPosition - (Vector2)rect.TransformPoint(rect.rect.center);
  39. rect.position += (Vector3)delta;
  40. }
  41. public void OnBeginDrag(PointerEventData eventData)
  42. {
  43. dragging = true;
  44. pointerOffset = eventData.position - GetDragAnchorWorldPosition();
  45. OnBeginDragEvent.Invoke(index, rect.localPosition);
  46. }
  47. public void OnDrag(PointerEventData eventData)
  48. {
  49. if (dragging)
  50. {
  51. MoveToDragAnchor(eventData.position - pointerOffset);
  52. OnDragEvent.Invoke(index, rect.localPosition);
  53. }
  54. }
  55. public void OnEndDrag(PointerEventData eventData)
  56. {
  57. dragging = false;
  58. // 更新多边形的顶点等操作...
  59. pointerOffset = Vector2.zero;
  60. OnEndDragEvent.Invoke(index, rect.localPosition);
  61. }
  62. }