UnityUGUI相关总结

1.基于Canvas分页面

UGUI的合并批次和渲染基于Canvas,任意Canvas下的UI元素的Vertex, Rect, Color, Material, Texture发生改变,可能引起Canvas数据更新和Batch更新计算,那么Canvas的第一层区分可以基于逻辑页面来进行区分。这样区分canvas可以保证当一个canvas触发rebuild之类的情况时不会影响到其他canvas,同时所有属于这个canvas的图片可以打成一个图集来达到降低drawcall的目的。然后就是canvas的排序,我们可以使用canvas的SortingLayer和OrderInLayer来进行排序。SortingLayer大的显示在上面,当SortingLayer相同的时候,根据OrderInLayer来排序。这样我们就可以先按照逻辑将UI页面分成几大类,然后添加对应的SortingLayer。对于固定层级页面设置成Normal,叠加显示的页面设置为Stack,替换前一个页面等关闭当前打开页面时恢复前面一个页面的设置为Replace,打开页面并关闭前面页面的设置为Remove,为保证页面内的特效和模型等不会穿透也可以设置z值距离,OrderInLayer每次增加5,然后在打开页面时只需要关心在本SortingLayer下的一个先后顺序,而不需要担心弹窗会被普通页面覆盖,提示文字被弹窗覆盖。同一个SortingLayer下的OrderInLayer也可以根据需求配置成默认固定Order的或者动态,后打开的Order更高等方法。

2.Canvas内在分Canvas

有的时候美术会提需求在UI页面上插入一些粒子特效,如要需要这些粒子特效能和UI产生正确的前后顺序,需要修改ParticleSystemRenderer中的SortingLayer和OrderInLayer。但这样也会导致canvas变多,drawcall变多。最好的方案还是让美术设计UI的时候尽量去减少这种UI和例子层叠的情况。另外对于特别复杂的UI,也可以通过动静分离,把静态UI放一个canvas,然后将经常变化的UI放到一个canvas来提升性能。

3.锚点适配

分辨率适配是UI设计中比较头疼的一部分,不过UGUI基于recttransform的这套解决方案能很方便基于锚点做适配。现在主流的分辨大多是16:9,UI开发也通常以16:9为基准,这里还要测试一下比较极端的两个分辨率,ipad的4:3分辨率(如果项目不准备出ipad可以不考虑这个),和iPhone X的2:1分辨率。基于非中心锚点的UI,在不同分辨率,尤其是上述两种极端分辨率的情况下,可能会产生超出脱离屏幕的情况,这里我们可以更改rootcanvas的CanvasScaler组件来改善,2:1分辨率,改为MatchHeight,4:3分辨率,改为MatchWidth,这样能解决UI超出屏幕的问题,但是可能会导致UI产生以一些留空的情况。

4.背景图适配

对于以Anchor定位的UI元素可以分辨率自适应,但是一些填充背景的背景图却无法简单去设置锚点为四个屏幕角落,否则按照16:9的原图会再其他便分辨下被拉伸变形。这里可以写一个脚本,在awake的时候获取image的rootcanvas的rectSize,然后通过这个比例和自身图片的比例进行比较,进行缩放适配,保证填充屏幕的同时不会被拉伸,或者干脆简单的利用下Image自身的PreserveAspect属性也能达到效果。

5.刘海屏适配

对于iPhone X的刘海屏,如果不做适配,会导致一些UI被刘海遮挡。其实适配原理也很简单,先通过SystemInfo获取到设备是否为iPhone X,然后修改Canvas的RectTransform的AnchorMin和AnchorMax的X轴各自往中央缩一些即可。对于需要铺满屏幕的背景图片,因为canvas被缩小了,所以需要往外扩大一些。

6.UI动画

NGUI自身提供了tween动画,而UGUI没有提供,我们可以采用DoTween插件来用代码实现一些动画,或者让美术用Animation来实现动画效果,但是主要这两种方法通常都会导致Canvas的重建从而影响性能。

7.模型放进UI界面

UI设计经常遇到需要把模型放在UI上显示的需求,做法也有很多种。

  • 合理设计

这里的合理设计就是指UI相机渲染UI,场景相机渲染模型,两者叠加正好能适配,无需做其他操作,但是大部分情况,美术和策划给不出这样的设计。

  • 直接用UICamara渲染模型

复制一份UI模型,更改其layer为UI渲染用的layer用UICamra渲染即可,因为人物模型绝大多数情况都是采用ZTest开启的shader,所以在UGUI内直接可以通过Z轴的调整使这个人物模型和UI元素有正确的显示,但是有一点要注意,对于UGUI元素,Z轴不为0会导致无法合并批次。另外当你的游戏需要开启一些屏幕后处理的时候,这种方法会不太适用,以为UI摄像机不会去开启后处理,所以人物模型需要带一些bloom后处理的时候就要采用下面的方案。

  • RenderTexture

用另外一个相机渲染模型到一个RenderTexture,然后用UGUI的RawImage来显示模型,这种方案会比上面两种方案性能上更耗一点,因为开了另外的相机。

posted @   醉卧沙场灬君莫笑  阅读(146)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示