unity3d gameobject拖拽事件

`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>();
    // The icon will be under the cursor.
    // We want it to be ignored by the event system.
    CanvasGroup group = m_DraggingIcon.AddComponent<CanvasGroup>();
    group.blocksRaycasts = false;

    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;
}

}
`

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值