Skip to main content
AR论坛
 首页 » 资源教程 » Unity3D教程

【Unity3D】【NGUI】屏幕自适应

2016年09月04日 17:03:282010

注意:NGUI3.6.x版本及以上,建议使用UIStretch与UIWidget的Anchor功能。


(以下为老版本时写的)

看过一些文章,大多数都用UIStretch。说实话我并不喜欢用这个脚本。

我一直对那些在屏幕适应上出现问题的人推荐使用UIRoot的ManualHeight。

先提供三个截图。看看效果是否是你想要的。旁边空白出来的地方,你需要和策划、美术商量用一些背景挡住。

1、正常开发分辨率下:

【Unity3D】【NGUI】屏幕自适应 Unity3D教程 第1张

2、看起来较细的分辨率:

【Unity3D】【NGUI】屏幕自适应 Unity3D教程 第2张

3、看起来较宽的分辨率:

【Unity3D】【NGUI】屏幕自适应 Unity3D教程 第3张

使用注意:

1、和策划制定好开发时分辨率。这很重要,要保证所有UI都在同样的分辨率下制作,比如是W*H。

2、把我这个脚本挂在UIRoot上。UIRoot的Scaling Style修改为FixedSize。

3、aspectRatioHeight、aspectRatioWidth分别为开发时的高(H)和宽(W)。

4、每个UIRoot都需要调整ManualHeight到和策划制定的高度(H)。

5、Unity3D的Game窗口,调整到相应的分辨率(W*H)。


(感谢成都-大强提供以下版本。注意:UICamera.onScreenResize是3.0+版本的,如果报错请删除即可


[csharp] view plain copy
  1. using UnityEngine;  

  2.   

  3. [ExecuteInEditMode]    

  4. [RequireComponent(typeof(UIRoot))]  

  5. public class SZUIRootScale : MonoBehaviour  

  6. {  

  7.     public int aspectRatioHeight;  

  8.     public int aspectRatioWidth;  

  9.     public bool runOnlyOnce = false;  

  10.     private UIRoot mRoot;  

  11.     private bool mStarted = false;  

  12.   

  13.     void Awake()  

  14.     {  

  15.         UICamera.onScreenResize += ScreenSizeChanged;  

  16.     }  

  17.   

  18.     void OnDestroy()  

  19.     {  

  20.         UICamera.onScreenResize -= ScreenSizeChanged;  

  21.     }  

  22.   

  23.     void Start()  

  24.     {  

  25.         mRoot = NGUITools.FindInParents<UIRoot>(this.gameObject);  

  26.           

  27.         mRoot.scalingStyle = UIRoot.Scaling.FixedSize;  

  28.           

  29.         this.Update();  

  30.         mStarted = true;  

  31.     }  

  32.   

  33.     void ScreenSizeChanged()  

  34.     {   

  35.         if (mStarted && runOnlyOnce) {  

  36.             this.Update();  

  37.         }   

  38.     }  

  39.        

  40.     void Update()  

  41.     {  

  42.         float defaultAspectRatio = aspectRatioWidth * 1f / aspectRatioHeight;  

  43.         float currentAspectRatio = Screen.width * 1f / Screen.height;  

  44.   

  45.         if (defaultAspectRatio > currentAspectRatio) {  

  46.             int horizontalManualHeight = Mathf.FloorToInt(aspectRatioWidth / currentAspectRatio);  

  47.             mRoot.manualHeight = horizontalManualHeight;  

  48.         } else {  

  49.             mRoot.manualHeight = aspectRatioHeight;  

  50.         }  

  51.   

  52.         if (runOnlyOnce && Application.isPlaying) {  

  53.             this.enabled = false;  

  54.         }  

  55.     }  

  56. }  

评论列表暂无评论
发表评论