具体细节可以参考另外一篇随笔!

以下提供的算法完成的事:

1.自适应1280x720分辨率以下的屏幕

2.自适应1280x720分辨率以上的屏幕

在我设定的要求内包括的分辨率大部分都测过了,背景图、全屏透明Sprite(主要用于九宫格区域的控件摆放)自适应都没问题(不会变形),其他的控件当然是由UIRoot组件搞定的!下面的算法主要就是说明背景、全屏透明Sprite的自适应!

之前的随笔已经说过实际屏幕比设定屏幕大的自适应,现在加入自适应比设定屏幕小的算法!

detail:

使用NGUI版本为3.6

设置:UIRoot中Manual Height=768(由于我们游戏UI定的大小是1280x768),Minimum=480(最小支持高为480的屏,更小的我没测过), Maximum=1536

脚本(将其挂在游戏对象下,每一个需要自适应的UI,都调用这个脚本里面的函数,传进去对应的参数,如AdaptiveUI函数、背景Sprite函数、全屏Sprite函数)

 //注:此脚本所在UIRoot的状态必须是活动的
     public class Adjust : MonoBehaviour
     {
         public UIRoot mRoot = null;

         private static Adjust mInstance = null;
         public static Adjust Instance { get { return mInstance; } }

         /// <summary>
         /// 自适应相关变量声明
         /// </summary>
         ;//实际屏幕宽
         ;//实际屏幕高
         ;
         ;
         private readonly float mWidthScale = Convert.ToSingle(Screen.width) / cDesignWidth;
         private readonly float mHeightScale = Convert.ToSingle(Screen.height) / cDesignHeight;
         private float mScreenSizeIsUnchanged = 0f;//屏幕大小不变
         private readonly bool mIsMinScreen = (Screen.height < cDesignHeight && Screen.width < cDesignWidth);//是否小屏幕(比设定屏幕1280x768小)

         void Awake()
         {
             if (mInstance == null)
             {
                 mInstance = this;
             }

             CalculateScreenWidthHeight();

             Output.Log(string.Format("Adjust.Awake(), mRealScreenWidth = {0}, mRealScreenHeight = {1}", mRealScreenWidth, mRealScreenHeight));
         }

         private void CalculateScreenWidthHeight()
         {
             if (mRoot != null)
             {
                 float scale = 1.0f;
                 if (mRoot.activeHeight < Screen.height)
                 {
                     scale = (float)mRoot.activeHeight / Screen.height;
                 }
                 mRealScreenWidth = Mathf.CeilToInt(Screen.width * scale);
                 mRealScreenHeight = Mathf.CeilToInt(Screen.height * scale);

                 mScreenSizeIsUnchanged = Mathf.Abs(Convert.ToSingle(mRealScreenWidth) / mRealScreenHeight - Convert.ToSingle(cDesignWidth) / cDesignHeight);

                 return;
             }
             Output.Error("Adjust.CalculateScreenWidthHeight(), mRoot is null");
         }

         public void AdaptiveUI(UIRoot root)
         {
             //宽高比不变
             if (mScreenSizeIsUnchanged < 0.0001f)
                 return;

             //实际屏幕宽高比设定宽高小
             if (mIsMinScreen)
                 return;

             if (Convert.ToSingle(Screen.height) / Screen.width > Convert.ToSingle(cDesignHeight) / cDesignWidth)
                 root.manualHeight = Mathf.RoundToInt(Convert.ToSingle(cDesignWidth) / Screen.width * Screen.height);
             else
                 root.manualHeight = cDesignHeight;

             Output.Log(string.Format("Adjust.AdaptiveUI(), Screen.height={0} Screen.width={1}", Screen.height, Screen.width));
         }

         //自适应背景
         public void AdaptiveBackground(UISprite backgroundSprite)
         {
             if (mScreenSizeIsUnchanged < 0.0001f)
                 return;

             if (mIsMinScreen)
             {
                 if (Convert.ToSingle(mRealScreenWidth) / mRealScreenHeight < (float)cDesignWidth / cDesignHeight)
                 {
                     //实际屏幕宽高比 比 设定的屏幕宽高比小,不需做适配
                     return;
                 }
                 else
                 {
                     float scale = cDesignWidth * mHeightScale / mRealScreenWidth;
                     int minScreenW = Convert.ToInt32(Convert.ToSingle(cDesignWidth) / scale);
                     int minScreenH = Convert.ToInt32(Convert.ToSingle(cDesignHeight) / scale);

                     backgroundSprite.SetDimensions(minScreenW, minScreenH);

                     return;
                 }
             }

             //实际宽高比设定宽高大 做适配
             int maxScreenW = Mathf.RoundToInt(cDesignWidth * mHeightScale);
             int maxScreenH = Mathf.RoundToInt(cDesignHeight * mHeightScale);
             if (mHeightScale < mWidthScale)
             {
                 maxScreenW = Mathf.RoundToInt(cDesignWidth * mWidthScale);
                 maxScreenH = Mathf.RoundToInt(cDesignHeight * mWidthScale);
             }
             Output.Log(string.Format("maxScreenW = {0}, maxScreenH = {1}", maxScreenW, maxScreenH));
             backgroundSprite.SetDimensions(maxScreenW, maxScreenH);
         }

         //自适应全屏(透明)Sprite
         public void AdaptiveFullScreenSprite(UISprite fullScreenSprite)
         {
             if (mScreenSizeIsUnchanged < 0.0001f)
                 return;

             if (mIsMinScreen)
             {
                 //小屏的height肯定小于设定height,因此只对width做适配
                 int w = Convert.ToInt32(Convert.ToSingle(cDesignWidth) / ((cDesignWidth * mHeightScale) / mRealScreenWidth));
                 int h = fullScreenSprite.height;
                 fullScreenSprite.SetDimensions(w, h);

                 return;
             }

             fullScreenSprite.SetDimensions(mRealScreenWidth, mRealScreenHeight);
         }
     }

如果帮到你了,给个赞顶一下吧!转载请注明出处,谢谢!

NGUI 屏幕自适应大屏与小屏(初始设定宽高为1280x720,能适应比其小或者更大的屏)的更多相关文章

  1. NGUI 屏幕自适应(初始设定宽高800x480只支持比其大的屏幕)

    自适应讲解部分可以参考以下网址:http://www.xuanyusong.com/archives/2536,下面代码中提到的AdaptiveManualHeight()函数就是参考该文章的. 下面 ...

  2. NGUI 屏幕自适应

    雨松MOMO 2014年05月04日 于 雨松MOMO程序研究院 发表  现在用unity做项目 90%都是用NGUI,并且我个人觉得NGUI应该算是比较成熟的UI插件,虽然他也存在很多问题,但是至少 ...

  3. NGUI屏幕自适应(转)

      屏幕自适应 NGUI可以比较方便的实现屏幕自适应,但是它的官方教程里面针对这个问题没有详细的教程,所以可能在实现的时候会走比较多的弯路.以下是我在开发过程中找到的一个比较方便的实现方法. 主要组件 ...

  4. NGUI屏幕自适应

    NGUI确实是非常棒的一个做界面的插件,比起U3D自带的GUI要好很多,当然也有一些不好之处,毕竟什么都不可能那么完美. 最近在用Unity写游戏使用NGUI遇到了一个很多人都在遇到的问题,就是关于屏 ...

  5. 【Unity3D插件】NGUI屏幕自适应(转)

    屏幕自适应 NGUI可以比较方便的实现屏幕自适应,但是它的官方教程里面针对这个问题没有详细的教程,所以可能在实现的时候会走比较多的弯路.以下是我在开发过程中找到的一个比较方便的实现方法. 主要组件 1 ...

  6. NGUI屏幕自适应解决方案

    NGUI研究院之自适应屏幕 http://www.xuanyusong.com/archives/2536 Unity3D研究院之使用Android的硬件缩放技术优化执行效率 http://www.x ...

  7. [Unity3D]NGUI用Sprite动画和屏幕自适应做游戏开始场景

    我们在玩任何一款手游产品时,都是先上来个logo界面,游戏欢迎界面等,这就意味着我们要做一款游戏需要多个场景,场景之间来回切换实现游戏逻辑,unity也不例外,所以从本篇开始将会介绍如何搭建多个场景, ...

  8. 在一个没有设置宽高的容器中,为什么设置position:absolute后就可以全屏显示了?

    此场景适用于移动端百分比布局,背景全屏显示. 在一个没有设置宽高的容器中设置背景,想要背景全屏显示,设置bcakground-size:100%;后还需设置position:absolut; 原因: ...

  9. [Leetcode]下一个更大元素II

    题目 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地 ...

随机推荐

  1. vs快捷键汇总

    1.相关查找快捷键 Ctrl+F: 查找 Ctrl+Shift+F: 在文件中查找 F3: 查找下一个 Shift+F3: 查找上一个 Ctrl+H: 替换 Ctrl+Shift+H: 在文件中替换 ...

  2. .vimrc vim 配置大全

    map <F9> :call SaveInputData()<CR>func! SaveInputData() exec "tabnew" exec 'no ...

  3. DOM杂记

    INPUT 监听输入框值的变化:"input"

  4. 1219 spring3 项目总结

    Spring3 项目总结 列志华 (组长) http://www.cnblogs.com/liezhihua/ 团队guihub https://github.com/LWHTF/OrderingFo ...

  5. 全站 HTTPS 来了(转载)

    转载:本文为腾讯Bugly原创文章. 最近大家在使用百度.谷歌或淘宝的时候,是不是注意浏览器左上角已经全部出现了一把绿色锁,这把锁表明该网站已经使用了 HTTPS 进行保护.仔细观察,会发现这些网站已 ...

  6. centos,nginx安装备忘

    # ssh 登录慢解决 vim /etc/ssh/sshd_config UseDNS no # add limitsvi /etc/security/limits.conf* soft nproc ...

  7. 仿google art图片预览算法及demo(web版本)

    演示地址: http://codeman35.itongyin.com:19001/v3/preview.html 功能支持:拖动 滚轴放大缩小 按钮放大缩小 鹰眼预览 鹰眼拖动等功能

  8. 关于.net Microsoft.Office.Interop.Word组建操作word的问题,如何控制word表格单元格内部段落的样式。

    控制word表格单元格内部文字样式.我要将数据导出到word当中,对于word表格一个单元格中的一段文字,要设置不同的样式,比如第一行文字作为标题要居中,加粗,第二行为正常的正文. 代码如下 publ ...

  9. XML语法

    xml文档内容如下:(必须全英文输入,空格都要是英文的!) 1.文档声明 2.元素 3.属性 4.注释 5.CDATA区.特殊字符 6.处理指令 <?xml version="1.0& ...

  10. 【230】4T硬盘如何完全利用(GPT)

    参考:如何选择超过2T和3T及以上硬盘的MBR与GPT分区形式 新购置的硬盘是 4TB 的,装上后只能用 2TB 的,查明后得知是因为 MBR 只支持 2TB 的(默认情况下是 MBR 分区形式的), ...