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

来源:互联网 发布:vod点播软件 编辑:程序博客网 时间:2024/06/06 13:09

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.         ///   
  7.         /// 根据宽度适配  
  8.         ///   
  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的摄像机。
使用步骤:
0 0