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. C# System.Environment.GetFolderPath的使用 [转]

    原文:https://blog.csdn.net/yongyong521/article/details/75105853 获取系统文件目录 string strPath = Environment. ...

  2. 涨知识-VI 基于TCP/UDP的应用层协议

    基于TCP/UDP的应用层协议: 基于TCP: Telnet(Teletype over the Network, 网络电传),通过一个终端(terminal)登陆到网络 FTP(File Trans ...

  3. DataFrame入门案例(集团公司对人事信息处理场景)

    我用一个集团公司对人事信息处理场景的简单案例,来作为入门,详细分析DataFrame上的各种常用操作,包括集团子公司的职工人事信息的合并,职工的部门相关信息查询.职工信息的统计.关联职工与部门信息的统 ...

  4. PB连接SQLITE

    sqlite3数据库,简单而功能强大,比起ini文件保存用户设置,更简单安全,为什么使用数据库存用户设置,由开发者自己去想吧进入话题:pb中可以用ole DB方式在不注册odbc的情况下直接连接数据库 ...

  5. JS高级——函数的调用模式

    函数调用模式一共有四种 <script> //1.函数模式 //this指向window全局对象 //2.方法模式 //this指向调用这个方法的对象 //3.构造函数模式 //this ...

  6. 循环语句和方法(day4)

  7. demo记录

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta http ...

  8. opencv 图像各方向旋转

    1. 简介 计算机图形学中的应用非常广泛的变换是一种称为仿射变换的特殊变换,在仿射变换中的基本变换包括平移.旋转.缩放.剪切这几种.本文以及接下来的几篇文章重点介绍一下关于旋转的变换,包括二维旋转变换 ...

  9. Weex框架源码分析(Android)(一)

    一.weexSDK初始化流程 WXSDKEngine.initialize(Application application,InitConfig config); //WXSDKEngine的init ...

  10. 考试T1总结(又CE?!)

    考试T1CE... 最近不适合考试 T1 扶苏是个喜欢一边听古风歌一边写数学题的人,所以这道题其实是五三原题.歌曲中的主人公看着墙边的海棠花,想起当年他其实和自己沿着墙边种了一排海棠,但是如今都已枯萎 ...