Unity3D NGUI自适应屏幕分辨率(2014/4/17更新)_unity ngui自适应不同屏幕分辨率-程序员宅基地

技术标签: Unity3D  

原创文章如需转载请注明:转载自 脱莫柔Unity3D学习之旅 本文链接地址:Unity3D NGUI自适应屏幕分辨率

1.UIRoot:根据高度自适应屏幕分辨率。

NGUI根目录的UIRoot组件自带了根据高度自适应分辨率的功能。
Scaling Style属性可选择三种不同的缩放策略。
  1. PixelPerfect 完美像素:直接显示设定好的像素。当屏幕高度低于minimum Height时按比例缩小,当屏幕高度大于maximum Height时按比例扩大。
  2. FixedSize 按比例缩放:在设定好的基础上,直接按比例缩放。
  3. FixedSizeOnMobiles 合体版,android和ios为FixedSize方式,其它按照PixelPerfect方式。

// FixedSize时:填理想分辨率的高度
// FixedSizeofWidth时:填理想分辨率的宽度

Manual Height:先按照理想分辨率做。当Game视图(打包后的屏幕分辨率)不是这个理想分辨率的时候就会进行比例缩放。


Minimum Height:Game视图低于这个数值开始按比例缩放。
Maximum Height:Game视图高于这个数值开始按比例缩放。


这三种缩放方式全部都是按照高度计算缩放比例,完全忽略宽度。

在制作时UI比例按照最长的16:9(红色)来做,另外3:2(绿色)为内容区域。红色两边的位置在不同比例的手机上会有不同程度的别切割的情况,所以不要把游戏内容放在这一区域。


2.UIRoot:根据宽度自适应屏幕分辨率。

UIRoot已经实现了根据高度自适应的功能,但是我现的需求是要根据宽度来自适应,屏幕高度高于UI高度则留空白。

1.首先给UIRoot增加一种状态

  1. public enum Scaling  
  2. {  
  3.     PixelPerfect,  
  4.     FixedSize,  
  5.     FixedSizeOnMobiles,  
  6.         /// <summary>  
  7.         /// 根据宽度适配  
  8.         /// </summary>  
  9.         FixedSizeofWidth,  
  10. }  

2.实现还是需要FixedSize的算法,所以需要修改两个判断语句

修改1:
  1. public float GetPixelSizeAdjustment (int height)  
  2. {  
  3.     height = Mathf.Max(2, height);  
  4.         //修改1  
  5.         if (scalingStyle == Scaling.FixedSize || scalingStyle == Scaling.FixedSizeofWidth)  
  6.         return (float)manualHeight / height;  
  7.  
  8. #if UNITY_IPHONE || UNITY_ANDROID  
  9.     if (scalingStyle == Scaling.FixedSizeOnMobiles)  
  10.         return (float)manualHeight / height;  
  11. #endif  
  12.     if (height < minimumHeight) return (float)minimumHeight / height;  
  13.     if (height > maximumHeight) return (float)maximumHeight / height;  
  14.     return 1f;  
  15. }  
修改2:
  1. public int activeHeight  
  2. :{  
  3.     get  
  4.     {  
  5.         int height = Mathf.Max(2, Screen.height);  
  6.         //修改2  
  7.         if (scalingStyle == Scaling.FixedSize || scalingStyle == Scaling.FixedSizeofWidth)   
  8.             return manualHeight;  
  9. #if UNITY_IPHONE || UNITY_ANDROID  
  10.         if (scalingStyle == Scaling.FixedSizeOnMobiles)  
  11.             return manualHeight;  
  12. #endif  
  13.         if (height < minimumHeight) return minimumHeight;  
  14.         if (height > maximumHeight) return maximumHeight;  
  15.         return height;  
  16.     }  
  17. }  

3.增加按宽度自适应算法

  1. void Update ()  
  2. {  
  3. #if UNITY_EDITOR  
  4.     if (!Application.isPlaying && gameObject.layer != 0)  
  5.         UnityEditor.EditorPrefs.SetInt("NGUI Layer", gameObject.layer);  
  6. #endif  
  7.     if (mTrans != null)  
  8.     {  
  9.         float calcActiveHeight = activeHeight;  
  10.   
  11.         if (calcActiveHeight > 0f )  
  12.         {  
  13.             float size = 2f / calcActiveHeight;  
  14.   
  15.             //看这里,看这里,看这里  
  16.             if (scalingStyle == Scaling.FixedSizeofWidth)  
  17.                     {  
  18.                 float radio = (float)Screen.width / Screen.height;  
  19.                 size = size * radio;  
  20.             }  
  21.   
  22.             Vector3 ls = mTrans.localScale;  
  23.   
  24.             if (!(Mathf.Abs(ls.x - size) <= float.Epsilon) ||  
  25.                 !(Mathf.Abs(ls.y - size) <= float.Epsilon) ||  
  26.                 !(Mathf.Abs(ls.z - size) <= float.Epsilon))  
  27.             {  
  28.                 mTrans.localScale = new Vector3(size, size, size);  
  29.             }  
  30.         }  
  31.     }  
  32. }  

3.UIStretch:根据宽度自适应屏幕分辨率。(NGUI3.0.7版本后不再支持)

这个是早期NGUI实现自适应分别率的一种方法,新版本中加入UIRoot自适应的方法后,这个脚本就不在被官方推荐使用了。

这个脚本自带的Style除了按高度自适应的功能之外,按宽度自适应是要拉伸图像的,并不能满足我们的要求。
最符合我们的要求的就是BasedOnHeight,那我们就按照这个功能修改一个BasedOnWidth出来,之前的博客中写过这个功能,现在这篇文章直接替换了之前的,所以我还是贴出修改的内容吧。
首先在Style枚举中增加一个BasedOnWidth,类型
  1. public enum Style  
  2. {  
  3.     None,  
  4.     Horizontal,  
  5.     Vertical,  
  6.     Both,  
  7.     BasedOnHeight,  
  8.         BasedOnWidth,  
  9.     FillKeepingRatio,   
  10.     FitInternalKeepingRatio  
  11. }  
Update方法中增加一个if分支。
  1. if (style == Style.BasedOnHeight)  
  2. {  
  3.     localScale.x = relativeSize.x * rectHeight;  
  4.     localScale.y = relativeSize.y * rectHeight;  
  5. }else if (style == Style.BasedOnWidth)  
  6. {  
  7.         localScale.x = relativeSize.x * rectWidth;  
  8.         localScale.y = relativeSize.y * rectWidth;   
  9. }  
  10. else if (style == Style.FillKeepingRatio)  
  11. {……}  
这个脚本是通过拉伸scale实现,所以这个脚本要放在你需要拉伸的UI上(如果你只需要一个背景图片自适应屏幕分辨率,那就把这个脚本添加到这个背景图片中,如果要一个panel内所有元素都自适应,那就放在这个panel上。如果想让所有的UI全部自适应分辨率,那就放在NGUI的cameta上。)
ui Camera属性需要选择渲染当前UI的摄像机。
使用步骤:
1.把Game视图设定一个最理想的宽度(以后按照这个比例缩放。)。
2.按需求选择一个放置UIStretch的物体,然后添加这个组件。并将ui cameta赋值。
3.将ui cameta的Size修改为当前屏幕的宽度。(这个物体的Scale的X、Y已经被UIStrech设置为屏幕宽度,此值不能被修改。)
4.这个时候改变窗口宽度,只有该物体Scale 的X、Y已被自动修改,UI视图已自动适应~!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/huang9012/article/details/31743389

智能推荐

第一篇图像处理论文审稿意见修改说明_回复审稿人 图片粘在comments-程序员宅基地

欢迎阅读我的论文http://www.aas.net.cn/cn/article/doi/10.16383/j.aas.c190619?viewType=HTML首先,感谢各位审稿人的审阅,并提出对论文质量提高具有建设性的意见。作者在等待审稿的阶段也反复对文章进行了阅读,以试图减少不当的内容和提高论文的写作水平。在这个过程中,作者也发现了些许错误,苦于写作和英语水平一直是作者最大的短板,对语言组织还是不太清楚怎么改进。但是作者相信要表达的内容,基本上是表达完整了的。下面对各位审稿人意见进行了回复,如果有表_回复审稿人 图片粘在comments

Android手机如何录制屏幕及转GIF-程序员宅基地

有时候我们需要录制Android手机的屏幕,比如写了一个Demo应用,需要发布到博客和微博上。 目前只有4.4以上版本的真机(不支持虚拟机)支持频幕视频录制功能。 你需要更新adt版本(如果你当前adt版本不能升级platform tools到V19或以上),然后升级platform tools。 本以为会在ddms看到相应的UI按钮帮助我录屏,最后还是乖乖的开了

Android混淆规则proguard-rules.pro-程序员宅基地

# Add project specific ProGuard rules here.# You can control the set of applied configuration files using the# proguardFiles setting in build.gradle.## For more details, see# http://developer.a..._proguard-rules.pro

类的加载过程(来一个通俗易懂的理解)-程序员宅基地

JVM类加载分为5个过程:加载,验证,准备,解析,初始化,使用,卸载,如图:没错,以上就是抽象的类加载过程,写类加载过程的都是大同小异,图我也是copy来的,然后联想到近期刚刚入职新公司,下面我入职新公司来解释类加载(绝对通俗易懂):加载(加载是指查找字节流并据此创建类的过程,说白了,就是把编译后的.Class静态文件转换到内存中(方法区),然后暴露出来让程序员能访问到)场景:企业A发of..._类加载过程的通俗解释

STM32 HAL库如何启用PB3-5与PA13-15___hal_afio_remap_swj_nojtag_睿智の男孩的博客-程序员宅基地

STM32中基于HAL库完全启用SWD/JTAG引脚的方法___hal_afio_remap_swj_nojtag

SELinux设置和状态查看方法_ubantu系统查询seluinx-程序员宅基地

总所周知,SELinux在提供安全保护的同时,也带来了很多令人蛋疼的问题,比如与各种程序服务的兼容性问题。在各种错误日志中,我们都能发现它作祟的身影,因此很多时候,与其花费大量时间去学习selinux策略设置,修复错误,不如直接关闭来得痛快。下面提供关闭方法:一、关闭SELinux:1、临时关闭:setenforce 0 _ubantu系统查询seluinx

随便推点

undefined is not an object (evaluating '_react3.default.PropTypes.bool')-程序员宅基地

在学习React Native的过程中,也就是学习生命周期defaultProps()的时候,为defaultProps配置属性和为属性申请类型时出现错误 static defaultProps = { autoPlay: false, maxLoops: 10, nameString:'suncuihua', }; // 注意这里有分号...

PAT 1041 考试座位号 C语言实现_int seat-程序员宅基地

每个 PAT 考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位。正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考试座位就座。但有些考生迟到了,试机已经结束,他们只能拿着领到的试机座位号码求助于你,从后台查出他们的考试座位号码。输入格式:输入第一行给出一个正整数N(≤1000),随后N行,每行给出一..._int seat

supermap objects 地图上添加 点线面图层 和删除图层 的类_超图移除临时图层-程序员宅基地

窗口form1的代码:using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms; namespace addLayer1_超图移除临时图层

Linux无线驱动源码安装_无线网卡驱动源码怎么看-程序员宅基地

linux 无线网卡驱动的安装!_无线网卡驱动源码怎么看

Jave报错:java.lang.IllegalStateException_菜鸟中的拖拉机的博客-程序员宅基地

reloadable如果这个属性设为true,tomcat服务器在运行状态下会监视在WEB-INF/classes和WEB-INF/lib目录下class文件的改动,如果监测到有class文件被更新的,服务器会自动重新加载Web应用,也就是热部署。有助于调试servlet和其它的class文件,但这样用加重服务器运行负荷,建议在Web应用的发存阶段将reloadable设为false。当tomcat已经关闭了其类加载器后,一些线程依然会继续运行,这样就导致出错,这些错误就会被到日志文件里。...

教学管理软件——教学评价系统_echarts教学评价系统-程序员宅基地

JDK6:http://u.115.com/file/f0e2dceac6jdk-6u10-rc2-bin-b32-windows-i586-p-12_sep_2008.exe教学评价系统 V 4.4:http://u.115.com/file/f045d25465database.rar 该系统是为教学管理服务,包括班级管理、课程管理、教师信息管理、学生信息管理、招生管理、教学反馈等六大模块。《教学_echarts教学评价系统