基于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
将上面脚本拖到需要拖动的物体对象上即可

上述委托的执行顺序:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/sinat_37102348/article/details/82984136