动态加载UI

我们进入一个场景后,如果将这个场景所有可能用到的UI都直接放在场景中做好,由于要在进入场景时就部署好所有的UI对象,那么当UI对象较多时会碰到的问题是:1.初始化场景会产生非常明显的卡顿、2.所有UI都在场景中导致占用大量的内存。

所以我们需要对UI组件进行动态加载和销毁,当需要打开指定的UI时,动态的创建出这个UI对象,而当关闭这个UI对象之后,可以对其进行销毁从而释放出内存。

将UI制作成一个预制件

我们可以在场景中制作好一个UI,然后将其保存成一个预制件后从场景中移除,然后我们使用这个UI就可以和使用Unity中任意的预制件一样了。

特别需要注意的是,当存在重复的UI时都要将其作为一个预制件来使用,比如背包的格子或各种列表的列表项。

我们直接看一个简单的例子:

 using UnityEngine;
using System.Collections; public class LoadUI : MonoBehaviour
{
//加载的 UI 的父对象
public GameObject uiParent; //加载后创建的 UI 对象
public GameObject ui; void Start()
{
//加载制作好的 UI 的预制件
GameObject go = Resources.Load<GameObject>("UI/BagPlane"); //添加到 uiParent 的第一种方法
GameObject uiGO = Instantiate(go, uiParent.transform.position, uiParent.transform.rotation) as GameObject;
uiGO.transform.SetParent(uiParent.transform); //添加到 uiParent 的第二种方法, 其实就是 NGUI 中对于第一种方法的封装
GameObject uiGO = NGUITools.AddChild(uiParent, go); ui = uiGO;
} void Destroy()
{
//销毁 UI 对象
Destroy(ui);
}
}

NGUI事件

EventDelegate

NGUI在3.x版本里对底层的事件进行了一次大的修改,其中最重要的就是将老版本的SendMessage修改为了EventDelegate(事件委托)。

事件委托负责调用NGUI中的所有交互事件的回调,我们具体看下下面的例子:

 using UnityEngine;
using System.Collections; public class LoadUI : MonoBehaviour
{
//按钮组件
public UIButton button; void Start()
{
//第一种写法
EventDelegate eventDelegate = new EventDelegate(this, "ButtonClickHandler");
//第二种写法
EventDelegate eventDelegate = new EventDelegate(ButtonClickHandler); //第一种添加回调的写法
EventDelegate.Add(button.onClick, eventDelegate);
//第二种添加回调的写法
button.onClick.Add(eventDelegate);
} public void ButtonClickHandler()
{
Debug.Log("我被点了!");
}
}

而onClick其实是一个List.<EventDelegate>,我们对其进行增加和移除就可以管理所有的回调了。

NGUI中的所有事件都是同样的写法。

EventTrigger

EventTrigger是一个组件,可以添加到任意UI上,其目的就是扩展该UI对象的事件类型,比如按钮中只有onClick的事件,这显然不能满足所有的需求,所以我们可以给该UI对象添加一个EventTrigger脚本,使其可以支持按下、移入、移出等事件。

NGUI学习笔记(四):动态加载UI和NGUI事件的更多相关文章

  1. QUiLoader 动态加载.ui文件

    动态加载UI文件是指,用 Qt Designer 通过拖拽的方式生产.ui 文件.不用 uic工具把.ui 文件变成等价的 c++代码,而是在程序运行过程中需要用到UI文件时,用 QUiLoader ...

  2. 详解QUiLoader 动态加载.ui文件

    http://blog.chinaunix.net/uid-13838881-id-3652523.html 1.适用情况: 动态加载UI文件是指,用 Qt Designer 通过拖拽的方式生产.ui ...

  3. thinkphp学习笔记9—自动加载

    原文:thinkphp学习笔记9-自动加载 1.命名空间自动加载 在3.2版本中不需要手动加载类库文件,可以很方便的完成自动加载. 系统可以根据类的命名空间自动定位到类库文件,例如定义了一个类Org\ ...

  4. webpack学习笔记--按需加载

    为什么需要按需加载 随着互联网的发展,一个网页需要承载的功能越来越多. 对于采用单页应用作为前端架构的网站来说,会面临着一个网页需要加载的代码量很大的问题,因为许多功能都集中的做到了一个 HTML 里 ...

  5. jquery:为动态加载的元素绑定事件

    最近在做项目的时候发现的一个问题,通过ajax动态加载出来的一个button值绑定不了点击事件.我使用的是datatables这款表单插件,表单内容是通过ajax动态渲染出来的. 解决方案: 通过Go ...

  6. node 学习笔记 - Modules 模块加载系统 (1)

    本文同步自我的个人博客:http://www.52cik.com/2015/12/11/learn-node-modules-path.html 用了这么久的 require,但却没有系统的学习过 n ...

  7. Openstack本学习笔记——Neutron-server服务加载和启动源代码分析(三)

    本文是在学习Openstack过程中整理和总结.因为时间和个人能力有限.错误之处在所难免,欢迎指正! 在Neutron-server服务载入与启动源代码分析(二)中搞定模块功能的扩展和载入.我们就回到 ...

  8. Office365学习笔记—Lookup类型加载条目过多解决方案

    1,随着接触的项目越来越多,遇到的各种奇葩的问题也越来越多,不得不说,SharePoint是个好东西,提高了开发效率,简化了很多基础的功能.但是令人头疼的问题是,当你想做个稍微复杂点的功能,就不得不研 ...

  9. Android学习笔记_37_ListView批量加载数据和页脚设置

    1.在activity_main.xml布局文件中加入ListView控件: <RelativeLayout xmlns:android="http://schemas.android ...

随机推荐

  1. Django用户认证系统(二)Web请求中的认证

    在每个Web请求中都提供一个 request.user 属性来表示当前用户.如果当前用户未登录,则该属性为AnonymousUser的一个实例,反之,则是一个User实例. 你可以通过is_authe ...

  2. PHP判断日期是不是今天 判断日期是否为当天

    <?php /** * PHP判断一个日期是不是今天 * 琼台博客 */ echo '<meta charset="utf-8" />'; // 拟设一个日期 $ ...

  3. Magic skills of vim from zhihu

    https://www.zhihu.com/question/27478597 插入模式下ctrl-y,重复当前光标上一行的字符 gd 高亮当前词 cc 删除当前行并插入 “.” 这个 mark 代表 ...

  4. Error Code: 1175

    用mysql workbench 更新一个表的时候报如下异常: Error Code: 1175. To disable safe mode, toggle the option in Prefere ...

  5. Annotation【转】

    1.Annotation的工作原理: JDK5.0中提供了注解的功能,允许开发者定义和使用自己的注解类型.该功能由一个定义注解类型的语法和描述一个注解声明的语法,读取注解的API,一个使用注解修饰的c ...

  6. 1701. Ostap and Partners(并查集-关系)

    1701 又是类似食物链的这一类题 这题是找与根节点的和差关系 因为0节点是已知的 为0  那么所有的都可以转换为与0的和差关系 可以规定合并的两节点 由大的指向小的 然后再更新和差关系 有可能最后有 ...

  7. UVa 1643 Angle and Squares

    题意: 如图,有n个正方形和一个角(均在第一象限中),使这些正方形与这个角构成封闭的阴影区域,求阴影区域面积的最大值. 分析: 直观上来看,当这n个正方形的对角线在一条直线上时,封闭区域的面积最大.( ...

  8. I.MX6 U-boot GPIO hacking

    /******************************************************************************* * I.MX6 U-boot GPIO ...

  9. Rman实现数据库迁移

    Rman实现数据库迁移(从库A迁移到库B)环境:服务器A:Oracle10g+AS3服务器B:Oracle10g+AS4准备工作: 1 在数据库B上建立与库A相同的目录结构(若由于磁盘空间等原因可以用 ...

  10. C#用DES加密JAVA用DES解密,JAVA用DES加密C#用DES解密的实现

    这里贴出来的是可通用的C#与jav的DES加密类,希望对大家管用直接复制即可用 C#DES加密解密类 ///<summary><![CDATA[加密解密帮助类]]></s ...