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. Android Studio代码字体模糊解决方法

    问题描述: 我的电脑分辨率是(1920*1080),然而安装了Android Studio后代码的一些部分区域出现模糊的现象,应该是软件默认设置与高分屏有冲突. 如下图所示. 解决方法: 打开设置对话 ...

  2. kafka 设置消费者线程数

    http://blog.csdn.net/derekjiang/article/details/9053863 分布式发布订阅消息系统 Kafka 架构设计 - 目前见到的最好的Kafka中文文章 M ...

  3. Flask 的系统学习

    详细看地址: http://www.cnblogs.com/wupeiqi/articles/7552008.html 一. 说明 Flask是一个基于Python开发并且依赖jinja2模板和Wer ...

  4. Restful Framework (三)

    目录 一.版本 二.解析器 三.序列化 四.请求数据验证 一.版本 回到顶部 程序也来越大时,可能通过版本不同做不同的处理 没用rest_framework之前,我们可以通过以下这样的方式去获取. c ...

  5. javascript大神修炼记(4)——循环

    读者朋友们大家好,今天,我们继续接着前面的内容讲,前们我们已经讲了条件分支,今天我们就讲循环,顾名思义就是,重复执行相同的操作,正常循环是受程序控制的,不正常的情况,就会出现死循环,那就是我们的代码中 ...

  6. 继续ajax长轮询解决方案--递归

    如果使用for,会有一种情况发生,就是ajax的执行会大于其他的动作的执行,那么这样的一段代码就不能实现了 for(var i=0;i<20;i++){ console.log('你好') $. ...

  7. 洛谷P1919 A*B problem 快速傅里叶变换模板 [FFT]

    题目传送门 A*B problem 题目描述 给出两个n位10进制整数x和y,你需要计算x*y. 输入输出格式 输入格式: 第一行一个正整数n. 第二行描述一个位数为n的正整数x. 第三行描述一个位数 ...

  8. 洛谷P1886滑动窗口

    题目传送门 理解题意:给定一个数列和窗口范围k,求依次向右移动窗口时每次窗口内的最大和最小值. 没什么思维难度,一边扫过去,用两个数组maxx和minn记录每个窗口内的最大最小值,移动过程中用两个变量 ...

  9. 用jquery实现文章自动生成二级目录(续)

    前文:用jquery实现文章自动生成二级目录. 使用方法的补充 我们可以把我们的js和css上传到博客园,然后在页面HTML代码中使用他们. 发现的一些问题 在我把我的js放到自己的博客园上运行之后发 ...

  10. Visual Studio Xamarin中找不到iOS模拟器

    Visual Studio Xamarin中找不到iOS模拟器 Visual Studio可以正常连接Mac系统,但是在测试时候,提示以下错误信息:Failed to start iOS Simula ...