1、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数量
2、UI Root:
如果是Create的2D UI.会自动生成一个UI Root和其子层下生成一个Camera。
UI Root游戏物体总是放在NGUI UI层级的最上层;
UI Root游戏物体包括Transform组件+UIRoot脚本组件+UIPanel脚本组件+Rigidbody组件
UIRoot脚本组件提供根据屏幕高度的反比来缩放UI界面的一些参数。
3、Camera:
如果是Create的2D UI.会自动生成一个UI Root和一个Camera。
2d UI是用正交相机来投射加入NGUI定制相机使得投射范围在一个方形可视范围内,在z轴的视觉表现上被忽略。
Camera Tool:此工具可以查看当前场景中所有的相机,包括Main Camera和UI相机。
4、Altas图集:
Atlas是一个容器,他包含了许多Sprite的坐标信息。与使用很多小的贴图来渲染UI相比,使用一张包含了所有小贴图的大贴图的效率要高许多。这些小的贴图就被叫做Sprite,这个大的贴图就被叫做Atlas。
Altas Maker:NGUI提供了此工具来创建一个Altas图集。
5、Font字体:
Font Maker:用于观察现有的Font字体,或者制作静态Font(Bitmap字体),动态Font。
静态Font一般是从美工处获取的图片文字,需要转换才能在NGUI里面使用。静态Font必须要属于某一个Atlas。
NGUI提示,动态字体,不能被做成Atlas的一部分,使用动态字体至少会增加一次DrawCall。
6、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是一个组件
7、Panel控件以及UIPanel组件:
UIPanel负责创建实际的集合图形。你不需要手动的添加UIPanel-一旦你创建一个控件,它会自动被添加。如果你想将你的UI渲染拆分到不同的DrawCall中,你可以手动创建你自己的UIPanel,例如你要创建一个分屏的游戏,每个屏用一个摄像机进行渲染,这种秦光下你就需要2个UIPanel来避免控件互相重叠。
Panel Tool:查看当前场景中NGUI创建的所有Panel及其信息。
8、Widget(Container)控件以及UIWidget组件:
其他组件的容器。
Widget Tool(Widget Wizard):控件创建向导,可以向UI的游戏物体上(如UI Root)添加各种控件。
9、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);
}
10、Tween:
NGUI的动画系统,给UI游戏物体添加动画效果。
包括:Alpha动画、Position动画、Rotation动画、Scale动画、Transform动画。
11、常用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。