NGUI自适应屏幕分辨率
unity官方承诺的新ui系统一直没有推出来,我们的UI使用的是原生的OnGUI系统,刚好UI需要改版,索性就想迁到NGUI上面来,于是看了一下NGUI源码,发现NGUI可以大大的降低DrawCall,减轻GPU负担,但是各个组件类上面,也有很多浪费cpu的运算可以改进,这一点对开发移动平台的游戏一定很重要。因此需要对他有针对性的做一些修改,以适应自己的需要。
在迁移过程中,首先要解决的问题就是屏幕分辨率的问题,因为我们是开发移动平台的游戏,分辨率当时是设定在800*480像素,用OnGUI可以很容易解决分辨率的适配问题。看了NGUI的文档和源码,发现NGUI提供了3种分辨率解决方案。
第一种是像素匹配,也就是UIRoot组件上面的设置Scaling为Pixelperfect。采用这种模式,如果在设计阶段一条垂直支线占用100个像素,那么在各个分辨率下面都只占用100个像素。这种样式如果页游或者端游上面设计固定像素大小的界面还是可以的,毕竟游戏窗口大,像素空间占比也不小,在不同的分辨率下面界面不会变形太多,但是如果放在移动平台上面,相同尺寸的屏幕,分辨率可以从几百变换到几千,像素密度差异非常大,比如在某个低端机上面,50个像素已经占据很大的屏幕空间了,但是到一个分辨率非常大的手机上面,50个像素只占据一点点屏幕空间了,这就造成一个问题,在低端机上面很清晰地界面到高端机上面会变小到甚至看不清楚了。
第二种是固定尺寸,Scaling设置为FixedSize,这种模式下,界面占用的像素会等比缩放,但是他只提供了根据高度缩放。比如采用这种模式,你设置100像素高的界面,到了某个某个分比率下像素高翻一倍的屏幕上,界面会占用200像素高。很好,这不就是我们需要的吗?且慢,他提供的是根据高度来等比缩放的,但是现在的手机各种奇葩的宽高比都有,宽与高不是等比的,如果你设计了一个占满屏幕的背景,切换到另一个分辨率下,高度会刚好充满,但是宽呢?因为不是等比,所以会留下两边的黑边。这不是我们希望看到的。
第三种方式是通过锚定,NGUI3.07以后的版本UIPanel和UiWidgt都是继承自UIRect,UiRect提供了四个锚定变量。比如设计一个背景框,把左右上下都锚定在根物体四个角上面,这样就实现了自适应分辨率的缩放。这确实满足了我们的需求,可是想想如果每个ui都要这样去设定,那也太麻烦了,而且采用Anchor的做法,会每帧都会浪费cpu去计算相对位置(还没有分析这一部分源码,不确定),而且每个UI都会有四个新增的anchor变量,也会浪费珍贵的终端内存。所以我打算把anchor去掉。
那有没有别的方法呢?当然有,而且相当简单。NGUI为什么会对高度自适应呢?应为他对跟物体用2/manulHeight进行了缩放,这个缩放的意义是什么呢?为什么是用2来除呢?因为设计2dUI的时候,我们相机是采用正交投影模式,正交投影的视体是一个长方体,正交投影摄像机有个orthographicSize属性,我们把它设为1,他的意思是投影相机的视体半高为1,也就是这个视体的y轴是-1到1,高度一共为2,2的高度映射着整个屏幕高度,所以用2除以设置高度后,就可以在该高度进行界面设计,假定我们设计UI是800*480,我们就可以把manulHeigh设置为480,这样,root下的子物体,1就代表着1个像素,加入我们设计了一个240高度的界面,整个界面搞就占据了50%的屏幕高,切换一个不同高度的屏幕后,还是占据50%的屏幕高这样,就实现了针对高度的等比缩放了,那么宽度呢?同理啊,在Scaling里面添加一个新的样式 ,fixedSizeBoth,然后添加一个变量manulWidth, 对root的x轴所用 用 2*Screen.aspect/manulWidth缩放就可以了。 为什么要用2*Screen.aspect,自己去看看unity文档和3d方面的知识把。
NGUI自适应屏幕分辨率的更多相关文章
- Unity3D NGUI自适应屏幕分辨率(2014/4/17更新)
原地址:http://blog.csdn.net/asd237241291/article/details/8126619 原创文章如需转载请注明:转载自 脱莫柔Unity3D学习之旅 本文链接地址: ...
- #region 自适应屏幕分辨率
#region 自适应屏幕分辨率 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public ...
- delphi 窗体自适应屏幕分辨率
delphi 窗体自适应屏幕分辨率 这是个困惑我很长时间的问题,到今天终于得到解决了. 话说Delphi有个很强的窗体设计器,这一点让VC粉丝垂涎三尺而不可得.但是,Delphi里设计的窗体并没有自动 ...
- Unity NGUI根据高度自适应屏幕分辨率
Unity版本:4.5.1 NGUI版本:3.6.5 本文内容纯粹转载,转载保留参考链接和作者 参考链接:http://blog.csdn.net/asd237241291/article/detai ...
- Unity 利用NGUI做屏幕分辨率适配+学习UIDraggablePanel的使用
原地址:http://blog.sina.com.cn/s/blog_697b1b8c0101g2r4.html 大家使用unity,一定有看中其跨平台的强大功能,因此也难免会遇到不同屏幕分辨率适配的 ...
- Delphi:窗体自适应屏幕分辨率的改进
在窗体依据屏幕分辨率自适应调整尺度方面,昨天的工作可以说是一个突破点.昨天的工作找到了长期以来我的原有方案的问题所在,这是非常关键的.但是昨天晚上的解决方案并不完美,今天的这个才是比较完美的解决版. ...
- H5自适应屏幕分辨率大小
说明: ①:H5自适应不同分辨率的设备,其实主要就一句 <meta name="viewport" content="width=device-width,init ...
- Delphi:窗体自适应屏幕分辨率(根据预设值的比例改变)
delphi 程序适应屏幕分辨率,先在表单单元的Interface部分定义两个常量, 表示设计时的屏幕的宽度和高度(以像素为单位). 在表单的Create事件中先判断 当前分辨率是否与设计分辨率相同, ...
- Unity GUI自适应屏幕分辨率(一)布局自适应
这里我们先谈第一个问题坐标矩阵变化实现布局自适应. 选取基准尺寸 通常你需要选择一个基准的屏幕尺寸,象现在开发的应用也需要跨平台在iOS(iPhone/iPad)/Android都可以运行,我这边选取 ...
随机推荐
- redis之(十八)redis的支持水平扩容的集群特性,以及插槽的相关操作
[一]主从集群的缺点,客户端分片的缺点 (1)主从+哨兵的redis集群,只是做主从备份,数据冗余的一种处理.但在存储空间的扩展上还是有限制.因为集群中的节点都是存储同样的数据.单一节点的容量,就可以 ...
- hdu 3308(线段树区间合并)
LCIS Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- 【转载】Python: Enum枚举的实现
转自:http://www.cnblogs.com/codingmylife/archive/2013/05/31/3110656.html 从C系语言过来用Python,好不容易适应了写代码不打 ...
- 【JBPM4】流程实例变量存取
设置流程实例变量 //创建流程引擎 ProcessEngine processEngine = Configuration.getProcessEngine(); //获得执行服务 Execution ...
- NET应用——你的数据安全有必要升级
最近又被[现场破解共享单车系统]刷了一脸,不得不开始后怕:如何防止类似的情况发生? 想来想去,始终觉得将程序加密是最简单的做法.但是摩拜.ofo也有加密,为什么仍然被破解?那是因为请求在传输过程中被篡 ...
- jquery请求解析xml
我们使用jque.ajax来做这个实验.其核心实现原理就是将请求回来的xml数据用$()选择器封装,然后进行傻瓜式操作. 代码如下: 需要注意的是请求数据格式要声明成:xml.不然不生效. $.aja ...
- The 18th Zhejiang University Programming Contest Sponsored by TuSimple -C Mergeable Stack
题目链接 题意: 题意简单,就是一个简单的数据结构,对栈的模拟操作,可用链表实现,也可以用C++的模板类来实现,但是要注意不能用cin cout,卡时间!!! 代码: #include <std ...
- php 获取指定月份的开始结束时间
/** * * 获取指定年月的开始和结束时间戳 * * @param int $y 年份 * @param int $m 月份 * @return array(开始时间,结束时间) */ functi ...
- PTA L1-020 帅到没朋友 团体程序设计天梯赛-练习集
L1-020 帅到没朋友(20 分) 当芸芸众生忙着在朋友圈中发照片的时候,总有一些人因为太帅而没有朋友.本题就要求你找出那些帅到没有朋友的人. 输入格式: 输入第一行给出一个正整数N(≤),是已 ...
- 北邮校赛 H. Black-white Tree (猜的)
H. Black-white Tree 2017- BUPT Collegiate Programming Contest - sync 时间限制 1000 ms 内存限制 65536 KB 题目描述 ...