NGUI事件的种类非常多。比方点击、双击、拖动、滑动等等,他们处理事件的原理差点儿万全一样,本文仅仅用button来举例。

方法一.直接监听事件

把以下脚本直接绑定在button上。当button点击时就能够监听到。这样的方法不太好非常不灵活。

void OnClick()

{

Debug.Log(“Button is Click!!!”);

}

方法二.使用SendMessage

选择button后。在Unity导航菜单条中选择Component->Interaction->Button Message 组件。

Target:接收button消息的游戏对象。

Function Name:接收button消息的方法,拥有这种方法的脚本必须绑定在上面Target对象身上。

Trigger:触发的事件,OnClick显然是一次点击。

Include Children :是否让该对象的全部子对象也发送这个点击事件。

到UIButtonMessage.cs这个脚本中看看,事实上非常easy就是调用Unity自身的SendMessage而已。

void Send ()

     {

         if (string.IsNullOrEmpty(functionName)) return;

         if (target == null) target = gameObject;

if (includeChildren)

         {

             Transform[] transforms = target.GetComponentsInChildren<Transform>();

for (int i = , imax = transforms.Length; i < imax; ++i)

             {

                 Transform t = transforms[i];

                 t.gameObject.SendMessage(functionName, gameObject, SendMessageOptions.DontRequireReceiver);

             }

         }

         else

         {

             target.SendMessage(functionName, gameObject, SendMessageOptions.DontRequireReceiver);

         }

     }

方法三.使用UIListener

这个也是推荐大家使用的一种方法,选择button后在Unity导航菜单条中选择Component->NGUI->Internal ->Event Listener。挂在button上就能够,它没有不论什么參数。

在不论什么一个脚本或者类中就可以得到button的点击事件、把例如以下代码放在随意类中或者脚本中。

void Awake ()

    {  

                 //获取须要监听的button对象

         GameObject button = GameObject.Find("UI Root (2D)/Camera/Anchor/Panel/LoadUI/MainCommon/Button");

                 //设置这个button的监听,指向本类的ButtonClick方法中。

        UIEventListener.Get(button).onClick = ButtonClick;

    }

//计算button的点击事件

     void ButtonClick(GameObject button)

     {

         Debug.Log("GameObject " + button.name);

}

怎么样是不是非常灵活?再看看它的源代码,使用的C#的代理,将UI的场景事件通过代理传递出去了。

public class UIEventListener : MonoBehaviour

     {

         public delegate void VoidDelegate (GameObject go);

         public delegate void BoolDelegate (GameObject go, bool state);

         public delegate void FloatDelegate (GameObject go, float delta);

         public delegate void VectorDelegate (GameObject go, Vector delta);

         public delegate void StringDelegate (GameObject go, string text);

         public delegate void ObjectDelegate (GameObject go, GameObject draggedObject);

         public delegate void KeyCodeDelegate (GameObject go, KeyCode key);

public object parameter;

public VoidDelegate onSubmit;

         public VoidDelegate onClick;

         public VoidDelegate onDoubleClick;

         public BoolDelegate onHover;

         public BoolDelegate onPress;

         public BoolDelegate onSelect;

         public FloatDelegate onScroll;

         public VectorDelegate onDrag;

         public ObjectDelegate onDrop;

         public StringDelegate onInput;

         public KeyCodeDelegate onKey;

void OnSubmit ()                { if (onSubmit != null) onSubmit(gameObject); }

         void OnClick ()                 { if (onClick != null) onClick(gameObject); }

         void OnDoubleClick ()           { if (onDoubleClick != null) onDoubleClick(gameObject); }

         void OnHover (bool isOver)      { if (onHover != null) onHover(gameObject, isOver); }

         void OnPress (bool isPressed)   { if (onPress != null) onPress(gameObject, isPressed); }

         void OnSelect (bool selected)   { if (onSelect != null) onSelect(gameObject, selected); }

         void OnScroll (float delta)     { if (onScroll != null) onScroll(gameObject, delta); }

         void OnDrag (Vector delta)     { if (onDrag != null) onDrag(gameObject, delta); }

         void OnDrop (GameObject go)     { if (onDrop != null) onDrop(gameObject, go); }

         void OnInput (string text)      { if (onInput != null) onInput(gameObject, text); }

         void OnKey (KeyCode key)        { if (onKey != null) onKey(gameObject, key); }

/// <summary>

         /// Get or add an event listener to the specified game object.

         /// </summary>

static public UIEventListener Get (GameObject go)

         {

             UIEventListener listener = go.GetComponent<UIEventListener>();

             if (listener == null) listener = go.AddComponent<UIEventListener>();

             return listener;

         }

     }

全部对于Unity3D中 NGUI 触发事件的监听方法的更多相关文章

  1. Android View中的控件和监听方法...

    PS:居然三天没写博客了...今天补上...东西虽多,但是都是一些基础...代码多了一些,有人可能会这样问,粘这么多代码有毛用..其实对于一个Android的初学者来说,一个完整的代码是最容易帮助理解 ...

  2. Android下 scrollview的滚动停止事件的监听方法

    使用递归调用的方法,每隔5毫秒检查一下是否已经停止,如果已经停止,就拿到事件啦! 不扯蛋,直接上代码. scrollContent就是我的scrollview. [代码]java代码: ? 1 2 3 ...

  3. Unity3D热更新之LuaFramework篇[04]--自定义UI监听方法

    时隔一个多月我又回来啦! 坚持真的是很难的一件事,其它事情稍忙,就很容易说服自己把写博客的计划给推迟了. 好在终于克服了自己的惰性,今天又开始了. 本篇继续我的Luaframework学习之路. 一. ...

  4. MVC框架入门准备(三)事件类 - 事件的监听和触发

    在mvc框架中可以看到事件类,实现事件的监听和触发. 举例: <?php /** * 事件类 */ class Event { // 事件绑定记录 private static $events; ...

  5. laravel中事件的监听和订阅

    一.前言 更新员工部门主管的时候,需要重新更新一下缓存,这个会比较耗时.所以计划放到队列中来执行.后来想了想,其实用一下事件监听也能实现.人家都说好,然是我也没感觉到有什么好的. 二.正文 1. 在p ...

  6. Android中Button的五种监听事件

    简单聊一下Android中Button的五种监听事件: 1.在布局文件中为button添加onClick属性,Activity实现其方法2.匿名内部类作为事件监听器类3.内部类作为监听器4.Activ ...

  7. tomcat触发ServletContext初始化监听事件的源码(原创)

    tomcat 8.0.36 知识点: 动态监听器的好处可以根据环境条件进行选择性添加. 静态监听器有七类. ServletContextAttributeListener ServletRequest ...

  8. 最优-scroll事件的监听实现

    1. 背景和目标 前端在监听scroll这类高频率触发事件时,常常需要一个监听函数来实现监听和回调处理.传统写法上利用setInterval或setTimeout来实现. 为了减小 CPU 开支,往往 ...

  9. 深入理解Spring的容器内事件发布监听机制

    目录 1. 什么是事件监听机制 2. JDK中对事件监听机制的支持 2.1 基于JDK实现对任务执行结果的监听 3.Spring容器对事件监听机制的支持 3.1 基于Spring实现对任务执行结果的监 ...

随机推荐

  1. 322 Coin Change 零钱兑换

    给定不同面额的硬币(coins)和一个总金额(amount).写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合方式能组成总金额,返回-1.示例 1:coins = [1, ...

  2. [转]asp.net MVC 常见安全问题及解决方案

    本文转自:http://www.cnblogs.com/Jessy/p/3539564.html asp.net MVC 常见安全问题及解决方案 一.CSRF (Cross-site request ...

  3. Java—解压zip文件

    import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import ja ...

  4. 将npm修改为cnpm

    1.更改npm的源地址 检测是否更改成功 2.用cnpm代替npm npm常用命令: npm更新:npm install -g npm npm初始化生成package.json:   npm init ...

  5. [Java]Java分层概念

      service是业务层 action层即作为控制器 DAO (Data Access Object) 数据访问 1.JAVA中Action层, Service层 ,modle层 和 Dao层的功能 ...

  6. jQuery——开关灯

    js对象与jquery对象的相互转化: 1.$(js对象) 2.$(selector).get(索引).$(selector)[索引] <!DOCTYPE html> <html l ...

  7. linux杀掉某个进程的脚本

    https://www.cnblogs.com/zeng1994/p/13a2c5a28e55dd3abc2c75a4fb80371a.html awk的说明: https://www.cnblogs ...

  8. ELK基本统计图表

    ELK基本统计图表,现在基本在用自带的功能,复杂的功能还需要去摸索了

  9. ubuntu14.0开机guest账号禁用方法

    在终端里进入/usr/share/lightdm/lightdm.conf.d/目录 sudo vim 50-unity-greeter.conf 然后在文件里输入: [SeatDefaults] a ...

  10. demo_static_resrouce

    环境 win10 + webstorm 2019.1.3 + node 12.x + yarn 实现的的功能 基本的js打包(支持规范:ES6 module | requirejs | commonj ...