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自适应屏幕分辨率的更多相关文章

  1. Unity3D NGUI自适应屏幕分辨率(2014/4/17更新)

    原地址:http://blog.csdn.net/asd237241291/article/details/8126619 原创文章如需转载请注明:转载自 脱莫柔Unity3D学习之旅 本文链接地址: ...

  2. #region 自适应屏幕分辨率

            #region 自适应屏幕分辨率 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]        public ...

  3. delphi 窗体自适应屏幕分辨率

    delphi 窗体自适应屏幕分辨率 这是个困惑我很长时间的问题,到今天终于得到解决了. 话说Delphi有个很强的窗体设计器,这一点让VC粉丝垂涎三尺而不可得.但是,Delphi里设计的窗体并没有自动 ...

  4. Unity NGUI根据高度自适应屏幕分辨率

    Unity版本:4.5.1 NGUI版本:3.6.5 本文内容纯粹转载,转载保留参考链接和作者 参考链接:http://blog.csdn.net/asd237241291/article/detai ...

  5. Unity 利用NGUI做屏幕分辨率适配+学习UIDraggablePanel的使用

    原地址:http://blog.sina.com.cn/s/blog_697b1b8c0101g2r4.html 大家使用unity,一定有看中其跨平台的强大功能,因此也难免会遇到不同屏幕分辨率适配的 ...

  6. Delphi:窗体自适应屏幕分辨率的改进

    在窗体依据屏幕分辨率自适应调整尺度方面,昨天的工作可以说是一个突破点.昨天的工作找到了长期以来我的原有方案的问题所在,这是非常关键的.但是昨天晚上的解决方案并不完美,今天的这个才是比较完美的解决版. ...

  7. H5自适应屏幕分辨率大小

    说明: ①:H5自适应不同分辨率的设备,其实主要就一句 <meta name="viewport" content="width=device-width,init ...

  8. Delphi:窗体自适应屏幕分辨率(根据预设值的比例改变)

    delphi 程序适应屏幕分辨率,先在表单单元的Interface部分定义两个常量, 表示设计时的屏幕的宽度和高度(以像素为单位). 在表单的Create事件中先判断 当前分辨率是否与设计分辨率相同, ...

  9. Unity GUI自适应屏幕分辨率(一)布局自适应

    这里我们先谈第一个问题坐标矩阵变化实现布局自适应. 选取基准尺寸 通常你需要选择一个基准的屏幕尺寸,象现在开发的应用也需要跨平台在iOS(iPhone/iPad)/Android都可以运行,我这边选取 ...

随机推荐

  1. python初学-元组、集合

    元组: 元组基本和列表一样,区别是 元组的值一旦创建 就不能改变了 tup1=(1,2,3,4,5) print(tup1[2]) ---------------------------------- ...

  2. hdu 2389(二分图hk算法模板)

    Rain on your Parade Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 655350/165535 K (Java/Ot ...

  3. Distinct Subsequences ——动态规划

    Given a string S and a string T, count the number of distinct subsequences of T in S. A subsequence ...

  4. WordPress 性能优化:为什么我的博客比你的快

    WordPress 很慢? 很多博主都会感觉 WordPress 很慢?作为全世界最常用的建站和博客系统 WordPress 来说,在性能设计上肯定不会有太大的问题,WordPress 开发团队也肯定 ...

  5. HTTP Status 500 - Handler processing failed; nested exception is java.lang.NoClassDefFoundError: Could not initialize class sun.awt.X11GraphicsEnvironment

    解决方案:修改catalina.sh 文件加上-Djava.awt.headless=true JAVA_OPTS="$JAVA_OPTS $JSSE_OPTS -Djava.awt.hea ...

  6. CodeForces 731D 80-th Level Archeology

    区间并. 对于上下两个数字,如果不一样,那么可以计算出哪一段范围内可以保证字典序,并且后面所有位置都无需再考虑.对所有范围求交集就是答案了. 求交集写起来有点烦,直接对不可取的范围求并即可. #pra ...

  7. json_decode转码无效

    由于最近从原来常用的utf-8的字符转到了gbk:所以,在用json_decode的时候遇到了返回为空: 经查找发现是json_decode和json_encode只针对utf8字符串有效: 于是用到 ...

  8. 封装boto3 api用于服务器端与AWS S3交互

    由于使用AWS的时候,需要S3来存储重要的数据. 使用Python的boto3时候,很多重要的参数设置有点繁琐. 重新写了一个类来封装操作S3的api.分享一下: https://github.com ...

  9. coreseek 段错误 (core dumped) 问题

    coreseek建立索引出现上面问题经过测试发现有下面几个原因: 1. 分词配置文件不存在  uni.lib 2. uni.lib配置文件格式不正确

  10. 初识C#设计模式

    利用设计模式可以使我们的代码更灵活,更容易扩展,更容易维护.各种面向对象的程序设计语言都提供了基本相同的机制:比如类.继承.派生.多态等等.但是又有各自的特色,C# 中的反射机制便是一个很重要的工具, ...