在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
将上面脚本拖到需要拖动的物体对象上即可
上述委托的执行顺序: