1. 程式人生 > >基於UGUI的點選拖拽(2D和3D)

基於UGUI的點選拖拽(2D和3D)

在UGUI的點選以及拖拽實現都有介面,在unity中有封裝好的類EventTrigger,在這個類中在這裡插入圖片描述 封裝好了我們常用的一些方法,為了操作方便我對這個類進行了延伸:

在這裡插入程式碼片
using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
public class EventTriggerListener : UnityEngine.EventSystems.EventTrigger
{
    public delegate void VoidDelegate(GameObject go);
    public VoidDelegate onClick;
    public VoidDelegate onDown;
    public VoidDelegate onEnter;
    public VoidDelegate onExit;
    public VoidDelegate onUp;
    public VoidDelegate onSelect;
    public VoidDelegate onUpdateSelect;

    public VoidDelegate onBeginDrag;
    public VoidDelegate onCancel;
    public VoidDelegate onDeselect;
    public VoidDelegate onDrag;
    public VoidDelegate onDrop;
    public VoidDelegate onEndDrag;
    public VoidDelegate onInitializePoteneialDrag;


    static public EventTriggerListener Get(GameObject go)
    {
        EventTriggerListener listener = go.GetComponent<EventTriggerListener>();
        if (listener == null) listener = go.AddComponent<EventTriggerListener>();
        return listener;
    }

    public override void OnBeginDrag(PointerEventData eventData)
    {
        Debug.Log("**OnBeginDrag**");
        if (onBeginDrag != null) onBeginDrag(gameObject);
    }
    public override void OnCancel(BaseEventData eventData)
    {
        Debug.Log("**OnCancel**");
        if (onCancel != null) onCancel(gameObject);
    }
    public override void OnDeselect(BaseEventData eventData)
    {
        Debug.Log("**OnDeselect**");
        if (onDeselect != null) onDeselect(gameObject);
    }
    public override void OnDrag(PointerEventData eventData)
    {
        Debug.Log("**OnDrag**");
        if (onDrag != null) onDrag(gameObject);
    }
    public override void OnDrop(PointerEventData eventData)
    {
        Debug.Log("**OnDrop**");
        if (onDrop != null) onDrop(gameObject);
    }
    public override void OnEndDrag(PointerEventData eventData)
    {
        Debug.Log("**OnEndDrag**");
        if (onEndDrag != null) onEndDrag(gameObject);
    }
    public override void OnInitializePotentialDrag(PointerEventData eventData)
    {
        Debug.Log("**OnInitializePotentialDrag**");
        if (onInitializePoteneialDrag != null) onInitializePoteneialDrag(gameObject);
    }


    public override void OnPointerClick(PointerEventData eventData)
    {
        Debug.Log("**OnPointerClick**");
        if (onClick != null) onClick(gameObject);
    }
    public override void OnPointerDown(PointerEventData eventData)
    {
        Debug.Log("**OnPointerDown**");
        if (onDown != null) onDown(gameObject);
    }
    public override void OnPointerEnter(PointerEventData eventData)
    {
        Debug.Log("**OnPointerEnter**");
        if (onEnter != null) onEnter(gameObject);
    }
    public override void OnPointerExit(PointerEventData eventData)
    {
        Debug.Log("**OnPointerExit**");
        if (onExit != null) onExit(gameObject);
    }
    public override void OnPointerUp(PointerEventData eventData)
    {
        Debug.Log("**OnPointerUp**");
        if (onUp != null) onUp(gameObject);
    }
    public override void OnSelect(BaseEventData eventData)
    {
        Debug.Log("**OnSelect**");
        if (onSelect != null) onSelect(gameObject);
    }
    public override void OnUpdateSelected(BaseEventData eventData)
    {
        Debug.Log("**OnUpdateSelected**");
        if (onUpdateSelect != null) onUpdateSelect(gameObject);
    }
}

當需要給按鈕或者物體新增點選或者拖拽委託的時候只需要:


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using UnityEngine.Events;

public class Drag : MonoBehaviour
{

    void Start()
    {
        EventTriggerListener.Get(gameObject).onClick = OnButtonClick;
    }

    public void OnButtonClick(GameObject go)
    {
        //在這裡監聽按鈕的點選事件

        Debug.Log("DoSomeThings");
    }
}

只需要呼叫EventTriggerListener進行相應委託事件的註冊就可以了

2D和3D物體的區別: 2D物體上 在UGUI的2D物體中主要把上述Drag指令碼掛在對應的物體上就可以了。 場景中需要一個EventSystem

3D物體上 需要在攝像機上加入 Physics RayCaster 元件 另外物體上需要有Collider 場景中需要一個EventSystem 將上面指令碼拖到需要拖動的物體物件上即可

上述委託的執行順序: 在這裡插入圖片描述