UNITY3D UGUI按钮的监听事件系统

2015年01月17日 13:00 0 点赞 1 评论 更新于 2025-11-21 14:36

在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方法获取了名为ButtonImage的组件,并为它们添加了点击事件的监听。当按钮或图片被点击时,会调用OnButtonClick方法,在该方法中可以根据点击的对象执行相应的逻辑。

虽然Unity中还有其他的监听方式,但这种方式较为科学和灵活。开发者可以根据自己项目的需求继续拓展EventTriggerListener类,以实现更多的功能。

作者信息

feifeila

feifeila

共发布了 3994 篇文章