Advertisement
Learning000001

Untitled

Feb 12th, 2025
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.08 KB | None | 0 0
  1. using UnityEngine;
  2. using UnityEngine.EventSystems;
  3. using UnityEngine.Events;
  4.  
  5. public class DraggableHandler : MonoBehaviour, IBeginDragHandler, IEndDragHandler, IDragHandler
  6. {
  7.     [SerializeField] private RectTransform objectHolder;
  8.     [SerializeField] private UnityEvent onDragComplete;
  9.     [SerializeField] private UnityEvent onExitScreen;
  10.  
  11.     private Vector2 startingPosition;
  12.     private bool isDragging;
  13.     private Canvas parentCanvas;
  14.     private RectTransform canvasRectTransform;
  15.     private Vector2 dragOffset;
  16.     private Vector2 lastPointerPosition;
  17.  
  18.     private void Awake()
  19.     {
  20.         InitializeComponents();
  21.     }
  22.  
  23.     private void InitializeComponents()
  24.     {
  25.         startingPosition = objectHolder.anchoredPosition;
  26.         parentCanvas = GetComponentInParent<Canvas>();
  27.         canvasRectTransform = parentCanvas.GetComponent<RectTransform>();
  28.     }
  29.  
  30.     public void OnBeginDrag(PointerEventData _eventData)
  31.     {
  32.         isDragging = true;
  33.         lastPointerPosition = GetLocalPoint(_eventData);
  34.         dragOffset = objectHolder.anchoredPosition - lastPointerPosition;
  35.     }
  36.  
  37.     public void OnEndDrag(PointerEventData _eventData)
  38.     {
  39.         if (!isDragging)
  40.         {
  41.             return;
  42.         }
  43.  
  44.         isDragging = false;
  45.         onDragComplete?.Invoke();
  46.     }
  47.  
  48.     public void OnDrag(PointerEventData _eventData)
  49.     {
  50.         if (!isDragging)
  51.         {
  52.             return;
  53.         }
  54.  
  55.         SetNewPosition(_eventData);
  56.         CheckScreenVisibility();
  57.     }
  58.  
  59.     private void SetNewPosition(PointerEventData _eventData)
  60.     {
  61.         Vector2 _localPoint = GetLocalPoint(_eventData);
  62.         lastPointerPosition = _localPoint;
  63.  
  64.         float _newY = Mathf.Min((_localPoint + dragOffset).y, startingPosition.y);
  65.         objectHolder.anchoredPosition = new Vector2(objectHolder.anchoredPosition.x, _newY);
  66.     }
  67.  
  68.     private Vector2 GetLocalPoint(PointerEventData _eventData)
  69.     {
  70.         Camera _camera = parentCanvas.renderMode == RenderMode.ScreenSpaceOverlay ? null : parentCanvas.worldCamera;
  71.         RectTransformUtility.ScreenPointToLocalPointInRectangle(canvasRectTransform, _eventData.position, _camera, out Vector2 _localPoint);
  72.  
  73.         return _localPoint;
  74.     }
  75.  
  76.     private void CheckScreenVisibility()
  77.     {
  78.         if (IsObjectVisible())
  79.         {
  80.             return;
  81.         }
  82.  
  83.         isDragging = false;
  84.         onExitScreen?.Invoke();
  85.     }
  86.  
  87.     private bool IsObjectVisible()
  88.     {
  89.         Vector3[] _corners = new Vector3[4];
  90.         objectHolder.GetWorldCorners(_corners);
  91.  
  92.         Camera _camera = parentCanvas.renderMode == RenderMode.ScreenSpaceOverlay ? null : parentCanvas.worldCamera;
  93.         Rect _screenRect = new Rect(0, 0, Screen.width, Screen.height);
  94.  
  95.         foreach (var _corner in _corners)
  96.         {
  97.             Vector3 _screenPoint = _camera ? _camera.WorldToScreenPoint(_corner) : _corner;
  98.             if (_screenRect.Contains(new Vector2(_screenPoint.x, _screenPoint.y)))
  99.             {
  100.                 return true;
  101.             }
  102.         }
  103.  
  104.         return false;
  105.     }
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement