NGUI学习笔记(四):动态加载UI和NGUI事件

动态加载UI

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

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

将UI制作成一个预制件

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

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

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

 1 using UnityEngine;
 2 using System.Collections;
 3
 4 public class LoadUI : MonoBehaviour
 5 {
 6     //加载的 UI 的父对象
 7     public GameObject uiParent;
 8
 9     //加载后创建的 UI 对象
10     public GameObject ui;
11
12     void Start()
13     {
14         //加载制作好的 UI 的预制件
15         GameObject go = Resources.Load<GameObject>("UI/BagPlane");
16
17         //添加到 uiParent 的第一种方法
18         GameObject uiGO = Instantiate(go, uiParent.transform.position, uiParent.transform.rotation) as GameObject;
19         uiGO.transform.SetParent(uiParent.transform);
20
21         //添加到 uiParent 的第二种方法, 其实就是 NGUI 中对于第一种方法的封装
22         GameObject uiGO = NGUITools.AddChild(uiParent, go);
23
24         ui = uiGO;
25     }
26
27     void Destroy()
28     {
29         //销毁 UI 对象
30         Destroy(ui);
31     }
32 }

NGUI事件

EventDelegate

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

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

 1 using UnityEngine;
 2 using System.Collections;
 3
 4 public class LoadUI : MonoBehaviour
 5 {
 6     //按钮组件
 7     public UIButton button;
 8
 9     void Start()
10     {
11         //第一种写法
12         EventDelegate eventDelegate = new EventDelegate(this, "ButtonClickHandler");
13         //第二种写法
14         EventDelegate eventDelegate = new EventDelegate(ButtonClickHandler);
15
16         //第一种添加回调的写法
17         EventDelegate.Add(button.onClick, eventDelegate);
18         //第二种添加回调的写法
19         button.onClick.Add(eventDelegate);
20     }
21
22     public void ButtonClickHandler()
23     {
24         Debug.Log("我被点了!");
25     }
26 }

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

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

EventTrigger

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

时间: 2024-12-29 10:07:48

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

thinkphp学习笔记9—自动加载

1.命名空间自动加载 在3.2版本中不需要手动加载类库文件,可以很方便的完成自动加载. 系统可以根据类的命名空间自动定位到类库文件,例如定义了一个类Org\Util\Auth类: namespace Org\Util; class Auth { } 保存到ThinkPHP/Library/Org/Util/Auth.class.php 这样我们就可以直接实例化了, new \Org\Util\Auth(); 实例化之后系统会自动加载 ThinkPHP/Library/Org/Util/Auth.

Qt动态加载ui文件(实现加载客户自定义的一些widget,如QVTKWidget)

利用Qt动态加载ui文件主要是实现ui设计和软件设计的分离,ui只需要向编程人员提供各个控件名称即可.这样做可以满足软件设计后期,由于客户需求,ui风格多变的情况下,不影响编程人员的开发. 具体实现:网上资料较多,一般利用QuiLoader ,只能加载Qwidget 或者QFrame,以下代码主要实现加载的Qwidget 窗口的子窗口有一些用户自定义的Widget ,这里我想加载的是QVTKWidget QString uiFilePath = "E:\\TASK\\CTSoftware\\Qt

QUiLoader 动态加载.ui文件

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

JavaScript学习10:动态加载脚本和样式

我们在写Web页面的时候,需要引入很多的JavaScript脚本文件和CSS样式文件,尤其是在网站需求量很大的时候,脚本的需求量也随之变大,这样一来,网站的性能就会大打折扣,因此就出现了动态加载的概念,即在需要的时候才去加载对应的脚本和样式.下面我们就来看看如何实现动态加载.  动态脚本: 先来看一个动态加载js文件的代码示例: //动态加载JS var flag=false ; if(flag){ loadScript('browserdetect.js'); } function loadS

输入坐标和输出坐标——图片框上动态加载按钮及响应事件

在实际的项目中总会遇到一些需要动态加载一些控件,并且加载控件的响应事件的代码.现在写一个简单的例子,主要说一下里面的一些关键点:使用鼠标在窗体上的图片框中动态的添加按钮 .动态的去加载事件,肯定是需要使用对象类动态的生成,动态事件,必须要使用委托去实现.还有一个就是"动态"的实现过程,打算鼠标点下去,在鼠标单击的位置添加上按钮. 环境:Visual Studio 2010, .Net FrameWork 3.5 private void pictureBox1_MouseDown(ob

Android学习笔记--实现正在加载圆圈,加完完成自动取消

今天学到了,网络加载数据 没加载之前是显示正在加载,加载之后 正在加载四个字消失不见,这里要用到一个自定义控件 TipInfoLayout.java 这个是自定义组件的代码 复制粘贴就好 1 package com.wuxianedu.wxhlcorelibrary.widget; 2 3 import android.content.Context; 4 import android.util.AttributeSet; 5 import android.view.LayoutInflater

ExtJS学习笔记3:加载、提交和验证表单

加载数据 1.比较好用的设置form数据的方法: formPanel.getForm().setValues([{id: 'FirstName', value: 'Joe'}]); 其中id值为form中field的name属性值,value为要赋的值 2.通过对象赋值: Ext.define('Request', { extend: 'Ext.data.Model', fields: [ 'FirstName', 'LastName', 'EmailAddress', 'TelNumberCo

Hibernate学习笔记(八) — 懒加载与抓取策略

懒加载(Load On Demand)是一种独特而又强大的数据获取方法,它能够在用户滚动页面的时候自动获取更多的数据,而新得到的数据不会影响原有数据的显示,同时最大程度上减少服务器端的资源耗用.总结一句话:什么时候需要数据,什么时候加载. 一.懒加载 1.1 类的懒加载 由javassist产生的代理类与Classes类是继承关系, session.load()方法产生的是代理对象,该代理类是持久化类的子类 /** * 类的懒加载 */ @Test public void testClass_l

Android学习笔记---使用Volley加载图片

Volley加载图片 ImageLoader使用法ImageLoader imageLoader = new ImageLoader(requestQueue,new ImageLoood()); ImageLoader.ImageListener imageListener = imageLoader.getImageListener(imageView,R.mipmap.ic_launcher,R.mipmap.ic_launcher); imageLoader.get(strUrl,ima