【Unity3D插件】NGUI基础学习笔记

【Unity3D插件】NGUI基础学习笔记


一、DrawCall:在Unity中,每次引擎准备数据并通知GPU的过程称为一次Draw Call。Draw Call值越低,会获得更好的渲染性能。
Draw Call Tool:NGUI--》Open--》Draw Call Tool,能够查看DrawCall的一些信息。

影响DrawCall的因素:
Atlas数量
Font动态字体数量
渲染顺序:取决于Sprite Depth深度,Unity 默认会按照控件的 Depth 来渲染。从后往前渲染,当使用相同材质的控件会合并为一个 Draw Call 。若是和前一个材质不相同则会从新产生一个 Draw Call
Panel数量

二、UI Root:
若是是Create的2D UI.会自动生成一个UI Root和其子层下生成一个Camera。
UI Root游戏物体老是放在NGUI UI层级的最上层;
UI Root游戏物体包括Transform组件+UIRoot脚本组件+UIPanel脚本组件+Rigidbody组件
UIRoot脚本组件提供根据屏幕高度的反比来缩放UI界面的一些参数。

三、Camera:
若是是Create的2D UI.会自动生成一个UI Root和一个Camera。
2d UI是用正交相机来投射加入NGUI定制相机使得投射范围在一个方形可视范围内,在z轴的视觉表现上被忽略。
Camera Tool:此工具能够查看当前场景中全部的相机,包括Main Camera和UI相机。

四、Altas图集:
Atlas是一个容器,他包含了许多Sprite的坐标信息。与使用不少小的贴图来渲染UI相比,使用一张包含了全部小贴图的大贴图的效率要高许多。这些小的贴图就被叫作Sprite,这个大的贴图就被叫作Atlas。
Altas Maker:NGUI提供了此工具来建立一个Altas图集。

五、Font字体:
Font Maker:用于观察现有的Font字体,或者制做静态Font(Bitmap字体),动态Font。
静态Font通常是从美工处获取的图片文字,须要转换才能在NGUI里面使用。静态Font必需要属于某一个Atlas。
NGUI提示,动态字体,不能被作成Atlas的一部分,使用动态字体至少会增长一次DrawCall。

六、NGUI提供的控件:
Prefab Toolbar:此工具下提供了不少经常使用的控件,能够直接使用。
组件:UI组件基本上是以UI开头的脚本组件,如UISprite、UILable、UIWidget等。
控件:我是这么理解的,由一个空的GameObject+一个或多个组件,就能够组成一个控件,好比:
Button:Transform+UISprite(Script)+UIButton(Script)+Box Collider+UIPlay Sound
Sprite:Transform+UISprite(Script)//因此说Sprite是一个控件,UISprite是一个组件

七、Panel控件以及UIPanel组件:
UIPanel负责建立实际的集合图形。你不须要手动的添加UIPanel-一旦你建立一个控件,它会自动被添加。若是你想将你的UI渲染拆分到不一样的DrawCall中,你能够手动建立你本身的UIPanel,例如你要建立一个分屏的游戏,每一个屏用一个摄像机进行渲染,这种秦光下你就须要2个UIPanel来避免控件互相重叠。
Panel Tool:查看当前场景中NGUI建立的全部Panel及其信息。

八、Widget(Container)控件以及UIWidget组件:
其余组件的容器。
Widget Tool(Widget Wizard):控件建立向导,能够向UI的游戏物体上(如UI Root)添加各类控件。

九、NGUI事件机制:
NGUI的事件触发都必须添加Box Collider,并勾选Is Trigger,在Inspector窗口设置Box大小尺寸,能够在Widget的Collider勾选auto-adjust to match。还有一个比较重要的参数须要设置正确,便是UI Root下Camera参数,在Inspector窗口中,要肯定UICamera中的Event Type选择3D UI,Event Mask选择Everything。
Box Collider:Button自己就带有OnClick事件,可是Sprite,Label等( 也绑有Widget的)并无触发事件,因此必须手动添加Box Collider。
事件注册方法:
直接将MonoBehaviour的脚本上的方法绑定至Notifiy上面。这种方法不够灵活,不推荐。
在须要接收事件的gameobject上附加Event Listener。添加component->NGUI->Internal->Event Listener。
在任何一个脚本或者类中便可获得按钮的点击事件、把以下代码放在任意类中或者脚本中。
void Awake () 
{    
    //获取须要监听的按钮对象
    GameObject button = GameObject.Find("UI Root (2D)/Camera/Anchor/Panel/LoadUI/MainCommon/Button");
    //设置这个按钮的监听,指向本类的ButtonClick方法中。
    UIEventListener.Get(button).onClick = ButtonClick;
}
//计算按钮的点击事件
void ButtonClick(GameObject button)
{
    Debug.Log("GameObject " + button.name);
}

十、Tween:
NGUI的动画系统,给UI游戏物体添加动画效果。
包括:Alpha动画、Position动画、Rotation动画、Scale动画、Transform动画。
十一、经常使用UI脚本组件: UICamera:发送NGUI事件给全部被它所附加的摄像机所看见的对象。除此以外,它不对UI作任何事情了。实际上,若是你想要你的游戏中的对象能接收NGUI相似OnPress,OnClick等事件,那么你须要作的是附加UICamera脚本到你的MainCamera上,即挂到UIRoot下面的Camera对象下。 UISprite:是NGUI的生命。它从texture图集绘制sprite。全部的Sprite须要你先建立一个图集(Atlas)。它继承了UIWidget的全部功能。 UILable:显示文本的脚本,继承自UIWidget。全部的label都须要Font才可正常工做。这个字体可使Dynamic的(引用Unity Font),也能够是Bitmap字体——嵌入到Atlas里面的字体。动态字体更稳固由于它不须要你预先建立符号,可是Bitmap字体能够和你atlas的其余东西渲染在同一个draw call上而且这些字体能够经过photoshop美化。 UIWidget:简单来讲,就是一个你能够放在屏幕任意位置的矩形框。Widget会有必定的面积(以下图的白色框范围),可是在运行的时候(GameView)是彻底不可见的,因此很是适合当作其余组件的容器(让全部的sprite或者label等以它进行各类对齐)。UIWidget也被用来当作全部NGUI元素的基类——全部你建立的sprites和labels。UILabel,UISprite,UITexture和UI2DSprite(Unity3D 4.3版本)都继承自UIWidget。 UITexture:它彻底没有图集的概念,使用起来很是的灵活,只须要把图片挂上去就好了。这样内存里只会占用你这一张图的大小,内存虽然小了可是DrawCall就上去了。由于每一张UITexture就是一次DrawCall。 UI2DSprite: UIPanel:用来收集和管理它下面全部Widget的组件。经过Widget的Geometry建立实际的DrawCall。没有Panel全部东西都不可以被渲染出来。若是你对Unity熟悉,你能够把UIPanel当作Renderer。 UIScroll View:用来在界面中绘制一个滚动视图区域,而且能够经过滚动条来控制显示的区域内容。 UIGrid与UITable: UIGrid 和 UITable 的原理很简单,对子 Transform 的 List 进行排序,而后更加不一样的规则进行定位排列(UIGrid 和 UITable 仍是有很大不一样的)。 UIGrid 和 UITable 定义了5种排列方式(实际上是3种,None默认不排序即Transform的默认排序,Custom虽然提供virtual 能够重载): public enum Sorting {     None, //默认不排序即Transform的默认排序     Alphabetic, //按照名字字符串排序     Horizontal, //按照localPosition 进行的排序     Vertical,   //按照localPosition 进行的排序     Custom, } UIAnchor:能够固定GameObjects在屏幕或者其余Widgets的某一边或者某一个角。这是一个关键的组件,用来在NGUI中建立模块化的UI。