参考博客 : http://gad.qq.com/article/detail/7210813
由于代码比较简单易懂,就不写注释了
/*************************************************************************
* FileName: UGUIListener.cs
* Author: LaiZhangYin(Eagle) Version: 1.0 Date: 6/3/2017
* if you have some question, please call
* QQ/Wechat : 782966734
*************************************************************************/
using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
using System;
public class UGUIListener : EventTrigger
{
public delegate void VoidDelegate(GameObject go);
public delegate void DelegatePointer(GameObject go, PointerEventData eventData);
public VoidDelegate onClick;
public DelegatePointer onClickData;
public VoidDelegate onDown;
public DelegatePointer onDownData;
public VoidDelegate onUp;
public DelegatePointer onUpData;
public VoidDelegate onEnter;
public DelegatePointer onEnterData;
public VoidDelegate onExit;
public DelegatePointer onExitData;
public VoidDelegate onLongPress;
public DelegatePointer onLongPressData;
public VoidDelegate onLongPressUp;
public DelegatePointer onLongPressUpData;
private float delay = 0.5f;
private bool isDown = false;
private bool isHolding = false;
private float lastIsDownTime;
private PointerEventData mTmpLongPressEventData;
public DelegatePointer onBeginDragData;
public DelegatePointer onDragData;
public DelegatePointer onEndDragData;
void Update()
{
if(isDown && !isHolding)
{
if(Time.time - lastIsDownTime > delay)
{
if (onLongPress != null) onLongPress(gameObject);
if (onLongPressData != null) onLongPressData(gameObject, mTmpLongPressEventData);
lastIsDownTime = Time.time;
isHolding = true;
}
}
}
public static UGUIListener Get(GameObject go)
{
UGUIListener listener = go.GetComponent<UGUIListener>();
if (listener == null) listener = go.AddComponent<UGUIListener>();
return listener;
}
public override void OnPointerClick(PointerEventData eventData)
{
//base.OnPointerClick(eventData);
if (onClick != null) onClick(gameObject);
if (onClickData != null) onClickData(gameObject, eventData);
}
public override void OnPointerDown(PointerEventData eventData)
{
//base.OnPointerDown(eventData);
isDown = true;
lastIsDownTime = Time.time;
mTmpLongPressEventData = eventData;
if (onDown != null) onDown(gameObject);
if (onDownData != null) onDownData(gameObject, eventData);
}
public override void OnPointerEnter(PointerEventData eventData)
{
//base.OnPointerEnter(eventData);
if (onEnter != null) onEnter(gameObject);
if (onEnterData != null) onEnterData(gameObject, eventData);
}
public override void OnPointerExit(PointerEventData eventData)
{
//base.OnPointerExit(eventData);
if (onExit != null) onExit(gameObject);
if (onExitData != null) onExitData(gameObject, eventData);
}
public override void OnPointerUp(PointerEventData eventData)
{
//base.OnPointerUp(eventData);
if(isDown)
{
if (onLongPressUp != null) onLongPressUp(gameObject);
if (onLongPressUpData != null) onLongPressUpData(gameObject, eventData);
isDown = false;
isHolding = false;
}
if (onUp != null) onUp(gameObject);
if (onUpData != null) onUpData(gameObject, eventData);
}
public override void OnBeginDrag(PointerEventData eventData)
{
//base.OnBeginDrag(eventData);
if (onBeginDragData != null) onBeginDragData(gameObject, eventData);
}
public override void OnDrag(PointerEventData eventData)
{
//base.OnDrag(eventData);
if (onDragData != null) onDragData(gameObject, eventData);
}
public override void OnEndDrag(PointerEventData eventData)
{
//base.OnEndDrag(eventData);
if (onEndDragData != null) onEndDragData(gameObject, eventData);
}
}
/*************************************************************************
* FileName: ImageTest.cs
* Author: LaiZhangYin(Eagle) Version: 1.0 Date: 6/3/2017
* if you have some question, please call
* QQ/Wechat : 782966734
*************************************************************************/
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
public class ImageTest : MonoBehaviour
{
public Image image;
void Awake()
{
UGUIListener.Get(image.gameObject).onClick = OnImageClickEvent;
}
private void OnImageClickEvent(GameObject go)
{
Debug.Log("click me");
//image = GetComponent<Image>();
if (image.color == Color.yellow)
image.color = Color.red;
else
image.color = Color.yellow;
}
void OnDestroy()
{
UGUIListener.Get(image.gameObject).onClick = null;
}
}
运行效果图: