UNITY3D UGUI按钮的监听事件系统
在Unity3D开发中,有时我们希望UGUI的监听方式能和NGUI相似。下面为大家提供一种实现思路,将以下代码添加到你的项目中。
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;
static public EventTriggerListener Get(GameObject go)
{
EventTriggerListener listener = go.GetComponent<EventTriggerListener>();
if (listener == null)
{
listener = go.AddComponent<EventTriggerListener>();
}
return listener;
}
public override void OnPointerClick(PointerEventData eventData)
{
if (onClick != null)
{
onClick(gameObject);
}
}
public override void OnPointerDown(PointerEventData eventData)
{
if (onDown != null)
{
onDown(gameObject);
}
}
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 OnPointerUp(PointerEventData eventData)
{
if (onUp != null)
{
onUp(gameObject);
}
}
public override void OnSelect(BaseEventData eventData)
{
if (onSelect != null)
{
onSelect(gameObject);
}
}
public override void OnUpdateSelected(BaseEventData eventData)
{
if (onUpdateSelect != null)
{
onUpdateSelect(gameObject);
}
}
}
上述代码定义了一个EventTriggerListener类,它继承自UnityEngine.EventSystems.EventTrigger。该类中定义了一系列委托和对应的事件处理方法,用于监听按钮的各种交互事件,如点击、按下、进入、退出等。通过静态方法Get可以方便地获取或添加EventTriggerListener组件到指定的GameObject上。
接下来,在界面脚本中编写监听按钮的代码:
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using UnityEngine.Events;
public class UIMain : MonoBehaviour
{
Button button;
Image image;
void Start()
{
button = transform.Find("Button").GetComponent<Button>();
image = transform.Find("Image").GetComponent<Image>();
EventTriggerListener.Get(button.gameObject).onClick = OnButtonClick;
EventTriggerListener.Get(image.gameObject).onClick = OnButtonClick;
}
private void OnButtonClick(GameObject go)
{
// 在这里监听按钮的点击事件
if (go == button.gameObject)
{
Debug.Log("DoSomeThings");
}
}
}
在UIMain类的Start方法中,我们通过transform.Find方法获取了名为Button和Image的组件,并为它们添加了点击事件的监听。当按钮或图片被点击时,会调用OnButtonClick方法,在该方法中可以根据点击的对象执行相应的逻辑。
虽然Unity中还有其他的监听方式,但这种方式较为科学和灵活。开发者可以根据自己项目的需求继续拓展EventTriggerListener类,以实现更多的功能。