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都可以运行,我这边选取 ...
随机推荐
- SQL中判断值是否为NULL
在 SQL 中,我们如果在操作数据库时使用 WHERE 子句判断一个列的值是否为 NULL,我们不能够使用 column_name=null 来进行判断,这是不正确的,我们应该使用 is null 来 ...
- setTimeout(fn,0)
我们都知道setTimeout是一个延迟执行的函数 console.log(); setTimeout(function(){console.log();},); console.log(); 会得到 ...
- 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记2——透明贴图,动画技术
第5章 透明贴图 像这样直接贴图会产生这种情况,所以我们需要透明贴图. 透明遮罩法:主要利用BitBlt函数中Raser(光栅)值的运算,需要准备素材图和遮罩图: 这个方法的原理解释见书131页. 示 ...
- 深度学习方法:受限玻尔兹曼机RBM(一)基本概念
欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. 技术交流QQ群:433250724,欢迎对算法.技术.应用感兴趣的同学加入. 最近在复习经典机器学习算法的同 ...
- hdu 1114(完全背包)
Piggy-Bank Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- 邂逅Sass和Compass之Sass篇
对于一个从后台转到前端的web开发者来说,最大的麻烦就是写CSS,了解CSS的人都知道,它可以开发网页样式,但是没法用它编程,感觉耦合性相当的高,如果想要方便以后维护,只能逐句修改甚至重写相当一部分的 ...
- pillow实例 | 生成随机验证码
1 PIL(Python Image Library) PIL是Python进行基本图片处理的package,囊括了诸如图片的剪裁.缩放.写入文字等功能.现在,我便以生成随机验证码为例,讲述PIL的基 ...
- python中文ocr方案-pytesseract
pytesseract是google维护的具有学习功能的OCR引擎,3.0以后支持中文识别. 安装: 1. 安装tesseract-ocr组件:记得同步下载简体中文与英文语言包. 2. 安装PIL,需 ...
- JDK Windows安装
进入至JDK下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html 点击下载后,会进入下载列表 点击下载后,就等 ...
- POJ2828 Buy Tickets [树状数组,二分答案]
题目传送门 Buy Tickets Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 22611 Accepted: 110 ...