原地址:http://blog.csdn.net/asd237241291/article/details/8126619

原创文章如需转载请注明:转载自 脱莫柔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. #if UNITY_IPHONE || UNITY_ANDROID
  8. if (scalingStyle == Scaling.FixedSizeOnMobiles)
  9. return (float)manualHeight / height;
  10. #endif
  11. if (height < minimumHeight) return (float)minimumHeight / height;
  12. if (height > maximumHeight) return (float)maximumHeight / height;
  13. return 1f;
  14. }

修改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. if (calcActiveHeight > 0f )
  11. {
  12. float size = 2f / calcActiveHeight;
  13. //看这里,看这里,看这里
  14. if (scalingStyle == Scaling.FixedSizeofWidth)
  15. {
  16. float radio = (float)Screen.width / Screen.height;
  17. size = size * radio;
  18. }
  19. Vector3 ls = mTrans.localScale;
  20. if (!(Mathf.Abs(ls.x - size) <= float.Epsilon) ||
  21. !(Mathf.Abs(ls.y - size) <= float.Epsilon) ||
  22. !(Mathf.Abs(ls.z - size) <= float.Epsilon))
  23. {
  24. mTrans.localScale = new Vector3(size, size, size);
  25. }
  26. }
  27. }
  28. }

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视图已自动适应~!

Unity3D NGUI自适应屏幕分辨率(2014/4/17更新)的更多相关文章

  1. NGUI自适应屏幕分辨率

    unity官方承诺的新ui系统一直没有推出来,我们的UI使用的是原生的OnGUI系统,刚好UI需要改版,索性就想迁到NGUI上面来,于是看了一下NGUI源码,发现NGUI可以大大的降低DrawCall ...

  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. Unity3D Android手机屏幕分辨率问题

    Android手机屏幕分辨率五花八门,导致开发时不好把握,还好各个引擎对这个屏幕分辨率问题都有较好的处理方式:unity3D 也为我们提供了一个不错的解决方案. 在Unity3D 进行 android ...

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

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

随机推荐

  1. GPU总结(1)

    目录 1.为什么要引入GPU 2.CUDA环境的搭建--CUDA全称Compute Unified Device Architecture统一计算设备架构,CUDA是以后总将GPU作为数据并行计算设备 ...

  2. 【Android学习之旅】1、Android入门介绍

    1.Android介绍 1.1 Android的系统架构 下面这张图展示了Android的系统架构: 图中可见,Android大致可以分为四层架构,五块区域: Linux内核层(Linux Kerne ...

  3. 关于ajax解析

    出处:http://www.cnblogs.com/huashanlin/archive/2006/10/09/524707.html 要很好地领会Ajax技术的关键是了解超文本传输协议(HTTP), ...

  4. AE实现点击一个要素,并显示其属性

    第一步:根据鼠标点击处的点,找到被选中的要素 public IFeature Find2(IPoint pPoint) { ITopologicalOperator pTopoOpe = pPoint ...

  5. 再说 extern "C"

    早知道 C++ 源文件中要调用C语言函数需要在函数申明时 指定extern "C": 要不然可以编译通过,但连接时提示找不到什么什么符号,原因是C和C++生成的函数名不一样,ext ...

  6. Access数据库一种树形结构的实现和子节点查询

    BOOL CManageDataBase::GetDepTreeAllSons( int rootItem ) { CADORecordset Rst(&m_DataBase); BOOL b ...

  7. 【转】VS2012发布网站详细步骤

    1.打开你的VS2012网站项目,右键点击项目>菜单中 重新生成一下网站项目:再次点击右键>发布: 2.弹出网站发布设置面板,点击<新建..>,创建新的发布配置文件: 输入你自 ...

  8. Kail安装Parallels tools

    今天在安装虚拟机里面安装kail,在安装虚拟机提供的tools时候提示没有权限,如图: 后面经过自己证实首先tools是挂载的cdrom,在这样挂载下是没有写权限的(类似于windows下面读取光盘光 ...

  9. CCNA第二讲笔记

    网络定义:一组由介质(线缆)互联的网络设备(路由器.交换机)和终端系统(PC): 工作组:局域网范畴,范围最小的局域网,且不涉及网络设备.台式机需要有多块网卡,利用双绞线与其他台式机进行互联,扩展性差 ...

  10. 如何Angularjs1.3在页面中输出带Html标记的文本

    基于安全考虑,Angularjs不允许用ng-bind或者{{}}的方法输出html文本. 在实际的应用中,比如信息管理系统,用在线编辑器编辑出来的文章都带有html标记,这种情况下可以用ng-bin ...