UGUI小结

UGUI小结:
一、UGUI系统提供的组件:
1、Text
文本显示组件,基本属性如Font和size等等
值得注意的是UGUIText 的shadow和outline的性能比较差。
shadow的原理是将原始的顶点数据复制一份根据设置的偏移量计算复制后的新顶点的位置,并设置颜色。
outline相当于四个不同偏移方向上的shadow。需要自己手动优化,比如接入其他开源方案,或者使用GPU计算。
2、Image
图片显示组件类似NGUI的UISprite
显示方面有ImageType–>>Sliced、Tiled等等适配不同的显示需求,如九宫等等。点击图片可以设置九宫和导入格式。
PreserverAspect属性可以锁定sprite比例。
3、RawImage
RawImage支持默认图片格式,能大大减少包体,但是会增加一个DrawCall,需要自己权衡使用。
4、Button
点击事件组件,可以配合其他组件如Image、Text使用,灵活地给对象添加点击事件。
5、Toggle , ToggleGroup
单选框组件,配合toggleGroup可以实现多选框。可以拿到toogle状态的bool值
6、Slider
进度条条组件,返回一个float。
7、ScrollBar
滑动条组件
8、DropDown
类似菜单栏选项组件
9、InputField
输入框组件 caretBlinkRate 光标闪动速率 CaretWidth光标宽度
10、Canvas
Canvas是UGUI总的显示单元,所有的UI元素必须是Canvas的子对象才能显示
UGUI Canvas有三种模式 Overlay、Camera、worldSpace
Overlay
画布会填满整个屏幕空间,并将画布下面的所有的UI元素置于屏幕的最上层,或者说画布的画面永远“覆盖”其他普通的3D画面,如果屏幕尺寸被改变,画布将自动改变尺寸来匹配屏幕
Camera
画布会被放置到摄影机前方。在这种渲染模式下,画布看起来 绘制在一个与摄影机固定距离的平面上。所有的UI元素都由该摄影机渲染,因此摄影机的设置会影响到UI画面
WorldSpace
画布被视为与场景中其他普通游戏对象性质相同的类似于一张面片(Plane)的游戏物体。画布的尺寸可以通过RectTransform设置,所有的UI元素可能位于普通3D物体的前面或者后面显示。当UI为场景的一部分时,   可以使用这个模式。,
11、Panel
一个大号Image
12、ScrollView
滚动视图组件
13、EventSystem
EventSystem是UGUI的事件管理中心,在创建UI元素的时候会自动创建,如果没有EventSystem对象,UI元素无法响应事件。
14、LayoutGroup
Layout组件可以控制RectTransform的position和size,主要用于排版

tips :对于不需要响应点击事件的对象建议吧RaycastTarget选项勾掉,减少不必要的消耗

二、特性
显示
UGUI的显示层级是由Hierarchy面板的排列顺序决定的,越靠下的显示越靠前。
锚点
UGUI的锚点设置是在RectTransform(专门为UI封装的Transform,封装了一些方法)的stretch,
详细可以参考https://www.jianshu.com/p/dbefa746e50d
三、Canvas的Rebatch和Graphic的Rebuild
Canvas通过叫做的batch操作合并子对象上面的Mesh,生成合适的渲染命令并发送到Unity的渲染系统。当canvas被设置为dirty时会触发rebatching
所有的几何信息都会通过CanvasRenderer被收集到Canvas。
Canvas中嵌套的Canvas被称为SubCanvas,除了少数极端情况,Canvas的Rebatch不会触发SubCanvas的Rebatch,反之亦然。
所有UGUI显示对象组件的基类是Graphic,而大部分内置组件的继承了MaskableGraphic,集成了IMaskable接口的Graphic,允许Mask遮罩处理对象。
Graphic依赖于CanvasUpdateRegistry类,这个类遍历找出所有需要更新的Graphic和Layout,并在他们的Canvas触发willRenderCanvas事件时更新。这个更新流程叫做Rebuild
强烈注意:Canvas生成的所有几何图形都会加入透明渲染序列中,重要的是每一个光栅化的像素点都会被采样,即使完全被遮挡掉。在移动设备上,高频率的overdraw会消耗大量的Gpu性能
BatchProcess:当Canvas完成Batch并发送到渲染通道的时候,底层会存储一份batch的结果直道canvas被标记为dirty,计算batch的过程是多线程的,所以在不同机器上表现会很不同。
论如何关闭UI:当关闭一个窗口的时候,如果我们关闭一个Canvas的GameObject,会导致对应VBO data被删除,当打开Canvas时Rebatch会重新计算,如果频繁操作,CPU占用会快速提高导致降帧或者卡顿的情况。一种解决思路是UI窗口上面添加一个Canvas,通过disable/enable canvas Component控制UI的打开关闭,这种做法UI的mesh会保存在内存里面,但不会发送给gpu,但是要注意MonoBehaviour还在正常运行,可以选择封装一个CallBackManager。
四、图集
在textureImportSetting里面可以设置texture的packTag,packTag相同的texture会被打包到同一个图集里面,UGUI图集还不是很稳定,谨慎使用
五、图片导入
关于UGUI图片导入,大部分情况下我们只用到了TextureType中的两种,sprite和default,sprite是常见的用于Image的Texture,而不适合打入图集的图片出于减少图片大小的考虑可以选择DefaultType,记得把Minmap和Read/Write勾选掉,减少不必要的空间占用。
六、代码的事件监听
常用的做法有三种:
1、Button组件添加回调

    Button b = GetComponent<Button>();
    b.onClick.AddListener(CallBack);

2、脚本中继承EventSystem的事件接口
如IPointerClickHandler
UGUI提供了丰富的接口供以调用
3、封装EventTriggerListener
继承UGUIdeEventTrigger,封装一下,或者封装一个继承了事件接口的Listener也可以
可以根据需求灵活选用不同的方案。
七、资料
源码:https://bitbucket.org/Unity-Technologies/ui/
资料:Optimizing Unity UI https://unity3d.com/cn/learn/tutorials/topics/best-practices/guide-optimizing-unity-ui?playlist=30089

本人知识不足,水平有限,如有疏漏或错误,欢迎指正

猜你喜欢

转载自blog.csdn.net/thrt520asd/article/details/81217791
今日推荐