ngui 点击事件场景

2015年01月13日 10:43 0 点赞 0 评论 更新于 2025-11-21 14:13

NGUI 作为 Unity 界面插件之一,无疑是最实用的插件之一。从自学 Unity 至今,我的界面开发一直使用它。由于它持续更新,不断为开发者考虑新的功能需求,确实是一款非常优秀的插件。

这里分享一个我遇到的例子。大概在去年,具体版本我记不清了,当时有一个实现“无限循环”拖动的需求,而老版本的 NGUI 并没有这个功能。后来我自己实现了该功能,没过几天就发现新版本中已经自带了这个功能,也就是如今 NGUI 示例中的 Endless Scroll Views,当时我还忍不住吐槽了一下。

言归正传,下面我将总结 NGUI 点击事件的五种不同实现方法。

一、OnClick

OnClick 是传统的单击事件,使用起来简单直接。以下是示例代码:

using UnityEngine;
using System.Collections;

public class onclicktest : MonoBehaviour {
public void OnClick() {
Debug.Log("你通过 OnClick 点击了我!");
}
}

无论是界面按钮,还是添加了 BoxCollider 的 3D 物体对象,都可以使用这种方式。不过,这种方法管理起来比较麻烦,特别是在项目规模较大时,不利于代码的维护和管理。

二、SendMessage

SendMessage 是 NGUI 老版本的一种事件实现方式,下面简单介绍其相关属性:

  • Target:接收按钮消息的游戏对象。
  • Function Name:接收按钮消息的方法,拥有该方法的脚本必须绑定在上面 Target 对象身上。
  • Trigger:触发的事件。
  • Include Children:是否让该对象的所有子对象也发送这个点击事件。

这种方式的缺点是不够直观,需要进行较多的拖动操作,而且效率略低。

三、通过 UIButton 属性面板附加事件

首先,在代码中编写要执行的操作,示例代码如下:

using UnityEngine;
using System.Collections;

public class ClickTest : MonoBehaviour {
// 通过 UIButton 属性面板附加事件,该事件方法必须加 public 修饰
public void btn_Click() {
Debug.Log("你通过 UIButton 属性面板附加事件点击了我!");
}
}

然后,将该代码脚本拖动绑定到场景中的任意对象上。最后,选择要点击的按钮,把刚才绑定代码的对象拖到 UIButton 属性中的 On Click 中的 Notify 上,接着在 Method 中选择刚写的脚本里的方法即可。

这种方法可以看作是 SendMessage 的升级版,更加直观易懂,适合刚接触 NGUI 的开发者学习使用。不过,其效率略低,并且不能用于 3D 物体,例如 Cube。

四、Event Listener(推荐)

要使用 Event Listener,先选择要挂载的按钮,在 Unity 导航菜单栏中选择 Component -> NGUI -> Internal -> Event Listener。代码实现有两种方式:

using UnityEngine;
using System.Collections;

public class EventListerrnTest : MonoBehaviour {
public Transform btn01;
public Transform btn02;

// Use this for initialization
void Start() {
// 第一种
UIEventListener.Get(btn01.gameObject).onClick = (x) => {
Debug.Log("你通过 UIEventListener 第一种点击了我!");
};

// 第二种
UIEventListener.Get(btn02.gameObject).onClick = _btnClicked;
}

// 实现事件方法
private void _btnClicked(GameObject _go) {
Debug.Log("你通过 UIEventListener 第二种点击了我!");
}
}

五、EventDelegate(推荐)

EventDelegate 的代码更加简洁,方便统一管理。可以单独创建一个事件管理脚本,直接进行操作管理,而且效率较高,不需要额外的拖动操作。示例代码如下:

using UnityEngine;
using System.Collections;

public class EventUITest : MonoBehaviour {
public UIButton _btn;

private void Awake() {
// 必须为 UIButton 类型
EventDelegate.Add(this._btn.onClick, this.BtnClicked);
}

private void BtnClicked() {
Debug.Log("你通过 EventDelegate 点击了我!");
}
}

以上就是 NGUI 五种点击事件处理方式的总结,具体使用哪种方法,大家可以根据项目需求进行选择。如果有不足之处,欢迎指正。

分割线

解决 NGUI 在 3D 场景中 点透的情况

在游戏开发中,可能会遇到点击地面玩家行走,但点击界面按钮时,事件触发不了,或者同时执行了玩家点地行走事件,这些都属于点透的情况。根据我的经验,有以下两种解决方案:

1. 在 NGUI 事件代码中做一个判断

示例代码如下:

void OnClick() {
if (UICamera.hoveredObject != null) {
// 执行相应操作
}
}

这段代码的意思是,如果鼠标下面有 NGUI 物体,则执行相应操作。

2. 通过射线来检测

示例代码如下:

private RaycastHit _hit = new RaycastHit();
if (UICamera.Raycast(Input.mousePosition, out _hit) == false) {
// 执行相应操作
}

这段代码用于判断是否在 UI 界面层操作。