主要的是通过实现Unity提供的接口,这里继承UnityEngine.EventSystems.EventTrigger,直接继承接口也是一样的.
using UnityEngine;
using UnityEngine.EventSystems;
class UGUIEventTriggerListener : UnityEngine.EventSystems.EventTrigger
{
public delegate void VoidDelegate_New(GameObject go, PointerEventData eventData);
public delegate void VoidDelegate(GameObject go);
public VoidDelegate onClick;
public VoidDelegate_New onDrag;
public VoidDelegate_New onBeginDrag;
public VoidDelegate_New onEndDrag;
public VoidDelegate_New onDown;
public VoidDelegate onEnter;
public VoidDelegate onExit;
public VoidDelegate_New onUp;
public VoidDelegate onSelect;
public VoidDelegate onUpdateSelect;
public VoidDelegate onLongClick; // 长按事件
public object parameter;
public byte testLongClickFlag = 0; // 用于长按检测,当长按过程中同时进行了拖动,我们将取消长按事件 0:未进行长按检测或长按已经取消 1:正在测 2:长按已触发
static public UGUIEventTriggerListener Get(GameObject go)
{
UGUIEventTriggerListener listener = go.GetComponent<UGUIEventTriggerListener>();
if (listener == null) listener = go.AddComponent<UGUIEventTriggerListener>();
return listener;
}
public override void OnPointerClick(PointerEventData eventData)
{
if (testLongClickFlag == 2) return; // 长按已经触发,则取消单击事件
if (onClick != null) onClick(gameObject);
}
public override void OnPointerDown(PointerEventData eventData)
{
if (onDown != null) onDown(gameObject, eventData);
if (onLongClick != null)
{
testLongClickFlag = 1;
Invoke("LongClickFunc", 0.5f); // 长按0.5秒钟
}
}
private void LongClickFunc()
{
testLongClickFlag = 2;
if (onLongClick != null) onLongClick(gameObject);
}
public override void OnPointerUp(PointerEventData eventData)
{
if (onUp != null) onUp(gameObject, eventData);
if (testLongClickFlag == 1)
{
testLongClickFlag = 0;
CancelInvoke("LongClickFunc");
}
}
public override void OnPointerEnter(PointerEventData eventData)
{
if (onEnter != null) onEnter(gameObject);
}
public override void OnPointerExit(PointerEventData eventData)
{
if (onExit != null) onExit(gameObject);
}
public override void OnSelect(BaseEventData eventData)
{
if (onSelect != null) onSelect(gameObject);
}
public override void OnUpdateSelected(BaseEventData eventData)
{
if (onUpdateSelect != null) onUpdateSelect(gameObject);
}
public override void OnDrag(PointerEventData eventData)
{
//Core.Log.Trace("OnEndDrag: " + eventData.pressPosition.x + "," + eventData.position.x);
if (onDrag != null) onDrag(gameObject, eventData);
if (testLongClickFlag == 1)
{
float dx = Mathf.Abs(eventData.position.x - eventData.pressPosition.x);
float dy = Mathf.Abs(eventData.position.y - eventData.pressPosition.y);
if (dx > 5 || dy > 5) // 如果只是手指抖动,我们不当拖动处理
{
testLongClickFlag = 0;
CancelInvoke("LongClickFunc");
}
}
}
public override void OnBeginDrag(PointerEventData eventData)
{
if (onBeginDrag != null) onBeginDrag(gameObject, eventData);
}
public override void OnEndDrag(PointerEventData eventData)
{
if (onEndDrag != null) onEndDrag(gameObject, eventData);
}
}
使用方法
GameObject go = transform.Find("Test").gameObject;//对象
UGUIEventTriggerListener.Get(go).parameter = index;//额外的参数,有没有都行
UGUIEventTriggerListener.Get(go).onClick = OnClickCallBack;//回调方法