docs.unity3d.com
Search Results for

    Show / Hide Table of Contents

    Interface IDragHandler

    Interface to implement if you wish to receive OnDrag callbacks.

    Namespace: UnityEngine.EventSystems
    Assembly: UnityEngine.UI.dll
    Syntax
    public interface IDragHandler : IEventSystemHandler
    Remarks

    Criteria for this event is implementation dependent. For example see StandAloneInputModule.

    Examples
    using UnityEngine;
    using UnityEngine.EventSystems;
    using UnityEngine.UI;
    
    [RequireComponent(typeof(Image))]
    public class DragMe : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
    {
        public bool dragOnSurfaces = true;
    
        private GameObject m_DraggingIcon;
        private RectTransform m_DraggingPlane;
    
        public void OnBeginDrag(PointerEventData eventData)
        {
            var canvas = FindInParents<Canvas>(gameObject);
            if (canvas == null)
                return;
    
            // We have clicked something that can be dragged.
            // What we want to do is create an icon for this.
            m_DraggingIcon = new GameObject("icon");
    
            m_DraggingIcon.transform.SetParent(canvas.transform, false);
            m_DraggingIcon.transform.SetAsLastSibling();
    
            var image = m_DraggingIcon.AddComponent<Image>();
    
            image.sprite = GetComponent<Image>().sprite;
            image.SetNativeSize();
    
            if (dragOnSurfaces)
                m_DraggingPlane = transform as RectTransform;
            else
                m_DraggingPlane = canvas.transform as RectTransform;
    
            SetDraggedPosition(eventData);
        }
    
        public void OnDrag(PointerEventData data)
        {
            if (m_DraggingIcon != null)
                SetDraggedPosition(data);
        }
    
        private void SetDraggedPosition(PointerEventData data)
        {
            if (dragOnSurfaces && data.pointerEnter != null && data.pointerEnter.transform as RectTransform != null)
                m_DraggingPlane = data.pointerEnter.transform as RectTransform;
    
            var rt = m_DraggingIcon.GetComponent<RectTransform>();
            Vector3 globalMousePos;
            if (RectTransformUtility.ScreenPointToWorldPointInRectangle(m_DraggingPlane, data.position, data.pressEventCamera, out globalMousePos))
            {
                rt.position = globalMousePos;
                rt.rotation = m_DraggingPlane.rotation;
            }
        }
    
        public void OnEndDrag(PointerEventData eventData)
        {
            if (m_DraggingIcon != null)
                Destroy(m_DraggingIcon);
        }
    
        static public T FindInParents<T>(GameObject go) where T : Component
        {
            if (go == null) return null;
            var comp = go.GetComponent<T>();
    
            if (comp != null)
                return comp;
    
            Transform t = go.transform.parent;
            while (t != null && comp == null)
            {
                comp = t.gameObject.GetComponent<T>();
                t = t.parent;
            }
            return comp;
        }
    }

    Methods

    OnDrag(PointerEventData)

    When dragging is occurring this will be called every time the cursor is moved.

    Declaration
    void OnDrag(PointerEventData eventData)
    Parameters
    Type Name Description
    PointerEventData eventData
    In This Article
    Back to top
    Copyright © 2024 Unity Technologies — Trademarks and terms of use
    • Legal
    • Privacy Policy
    • Cookie Policy
    • Do Not Sell or Share My Personal Information
    • Your Privacy Choices (Cookie Settings)