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. Django 内容回顾

    模板 变量 {{ }} 标签 {% %} if elif else for empty forloop() with...as csrf_token 过滤器 default length add da ...

  2. SVD 学习笔记

    本文主要学习了这篇博客:http://www.cnblogs.com/LeftNotEasy/archive/2011/01/19/svd-and-applications.html,将SVD讲的恨透 ...

  3. OI——不后悔的两年

    NOI2014,悲惨的考跪,99+170+130 399 Cu滚粗.最终签到了复旦的一本,还算是有点结果吧.(其实我一开始就想读复旦我会说?)回首这两年,就像一场梦一样,从一无所知的小白到进入省队再到 ...

  4. 【转】Linux之printf命令

    转自:http://blog.chinaunix.net/uid-9525959-id-2001528.html printf FORMAT [ARGUMENT]... printf OPTION [ ...

  5. C#语言最基础的数组和集合

    数组的书写格式:数据类型[]变量名=new 数据类型[长度]: 集合的书写格式:List<变量类型>变量名=new List<变量类型>(): 集合添加元素:变量名.Add(数 ...

  6. 实现PC延迟执行函数

    头文件内容: #pragma once typedef function<void ()> DelayClickHandler; typedef void (*pDelayFun)(); ...

  7. c++中std::set自定义去重和排序函数

    c++中的std::set,是基于红黑树的平衡二叉树的数据结构实现的一种容器,因为其中所包含的元素的值是唯一的,因此主要用于去重和排序.这篇文章的目的在于探讨和分享如何正确使用std::set实现去重 ...

  8. Ruby开发环境的搭建

    1.Ruby的下载 https://rubyinstaller.org/downloads/ 2.Ruby的安装 3.Eclipse配置Ruby开发环境 插件地址:http://rubyeclipse ...

  9. [Windows Server 2012] Filezilla安全加固方法

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:FileZ ...

  10. windows远程桌面连接

    服务器端: 1.我的电脑->管理->本地用户和组->用户->新建用户设置账号密码,隶属于administrator和remote user 2.我的电脑->属性-> ...