【Unity3D / UI】 快速处理鼠标事件的方法

版权声明:本文为 ls9512 原创文章,转载请注明出处! https://blog.csdn.net/ls9512/article/details/70789239

    Unity的UGUI,处理鼠标事件,需要自行实现IPointerClickHandler,IPointerDownHandler等接口,很不方便。

    我们可以把常用接口封装起来,让需要实现鼠标事件的类,继承已经封装好的类即可。


using System;
using UnityEngine;
using UnityEngine.EventSystems;

public class ClickOnListener : MonoBehaviour, IPointerClickHandler, IPointerDownHandler, IPointerUpHandler {

	#region Action
	public Action ActClick = delegate {};
	public Action ActPress = delegate { };
	public Action ActRelease = delegate { };
	#endregion

	#region Click Event
	/// <summary>
	/// 当鼠标点击时
	/// </summary>
	/// <param name="eventData"></param>
	public void OnPointerClick(PointerEventData eventData) {
		ActClick();
	}

	/// <summary>
	/// 当鼠标按下时
	/// </summary>
	/// <param name="eventData"></param>
	public void OnPointerDown(PointerEventData eventData) {
		ActPress();
	}

	/// <summary>
	/// 当鼠标抬起时
	/// </summary>
	/// <param name="eventData"></param>
	public void OnPointerUp(PointerEventData eventData) {
		ActRelease();
	}

	/// <summary>
	/// 清除
	/// </summary>
	public void Clear() {
		ActClick = null;
		ActPress = null;
		ActRelease = null;
	}

	#endregion
}


    如此一来,只需要让UI类继承  ClickOnListener 类,然后注册 ActClick 等已经封装好的事件即可,比每次都重复实现接口的效率要高不少。

    本例封装了三个接口,有需要可以把UI事件接口全部封装起来(见下文)。不过需要注意一个问题,由于这些接口都是空实现,但是只要写了这个方法,哪怕没有实现,Unity的UI消息机制,也会每次将消息发送到这个方法上,会有一定性能开销。


还可以增加一个静态接口,用于发送鼠标事件:

	#region Static
	/// <summary>
	/// 向指定对象发送点击事件
	/// </summary>
	/// <param name="target">目标</param>
	public static void SendOnClick(GameObject target) {
		PointerEventData eventData = new PointerEventData(null);
		target.SendMessage("OnPointerClick", eventData);
	} 
	#endregion


最后附上一个比较完整的UI事件监听器类,有需要同时处理较多UI事件的情况可以直接使用。

using UnityEngine;
using UnityEngine.EventSystems;

public class UIEventListener : MonoBehaviour, IPointerClickHandler, IPointerDownHandler, IPointerEnterHandler,
	IPointerExitHandler,
	IPointerUpHandler, ISelectHandler, IUpdateSelectedHandler, IDeselectHandler, IDragHandler,
	IEndDragHandler, IDropHandler, IScrollHandler, IMoveHandler
{

	public delegate void UIPointerEventDelegate(GameObject go, PointerEventData data);

	public delegate void UIBaseEventDelegate(GameObject go, BaseEventData data);

	public delegate void UIAxisEventDelegate(GameObject go, AxisEventData data);

	public UIPointerEventDelegate onClick = delegate { };
	public UIPointerEventDelegate onDown = delegate { };
	public UIPointerEventDelegate onEnter = delegate { };
	public UIPointerEventDelegate onExit = delegate { };
	public UIPointerEventDelegate onUp = delegate { };
	public UIBaseEventDelegate onSelect = delegate { };
	public UIBaseEventDelegate onUpdateSelect = delegate { };
	public UIBaseEventDelegate onDeSelect = delegate { };
	public UIPointerEventDelegate onDrag = delegate { };
	public UIPointerEventDelegate onEndDrag = delegate { };
	public UIPointerEventDelegate onDrop = delegate { };
	public UIPointerEventDelegate onScroll = delegate { };
	public UIAxisEventDelegate onMove = delegate { };

	/// <summary>
	/// 用于对任意UI对象快速获取UI事件监听器
	/// </summary>
	/// <param name="go">对象</param>
	/// <returns>结果</returns>
	public static UIEventListener Get(GameObject go)
	{
		return go.GetOrAddComponent<UIEventListener>();
	}

	public void OnPointerClick(PointerEventData eventData)
	{
		onClick(gameObject, eventData);
	}

	public void OnPointerDown(PointerEventData eventData)
	{
		onDown(gameObject, eventData);
	}

	public void OnPointerEnter(PointerEventData eventData)
	{
		onEnter(gameObject, eventData);
	}

	public void OnPointerExit(PointerEventData eventData)
	{
		onExit(gameObject, eventData);
	}

	public void OnPointerUp(PointerEventData eventData)
	{
		onUp(gameObject, eventData);
	}

	public void OnSelect(BaseEventData eventData)
	{
		onSelect(gameObject, eventData);
	}

	public void OnUpdateSelected(BaseEventData eventData)
	{
		onUpdateSelect(gameObject, eventData);
	}

	public void OnDeselect(BaseEventData eventData)
	{
		onDeSelect(gameObject, eventData);
	}

	public void OnDrag(PointerEventData eventData)
	{
		onDrag(gameObject, eventData);
	}

	public void OnEndDrag(PointerEventData eventData)
	{
		onEndDrag(gameObject, eventData);
	}

	public void OnDrop(PointerEventData eventData)
	{
		onDrop(gameObject, eventData);
	}

	public void OnScroll(PointerEventData eventData)
	{
		onScroll(gameObject, eventData);
	}

	public void OnMove(AxisEventData eventData)
	{
		onMove(gameObject, eventData);
	}
}


猜你喜欢

转载自blog.csdn.net/ls9512/article/details/70789239