zoukankan      html  css  js  c++  java
  • Unity3D NGUI自适应屏幕分辨率(2014/4/17更新)

    原地址: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.  
    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视图已自动适应~!
  • 相关阅读:
    贪心算法过河问题 pojo1700
    大脑的合理使用
    给自己的忠言
    篮子水果模拟消费者生产者
    线程安全高效的单例模式
    Java提高篇——JVM加载class文件的原理机制
    递归的研究
    虚拟机分区方法
    使用spark dataSet 和rdd 解决 某个用户在某个地点待了多长时间
    获取数据集的好的方
  • 原文地址:https://www.cnblogs.com/123ing/p/3903905.html
Copyright © 2011-2022 走看看