1. 程式人生 > >【NGUI】螢幕自適應(不用UIStretch,用UIRoot)

【NGUI】螢幕自適應(不用UIStretch,用UIRoot)

這篇文章是轉載的,之前用UIStretch做螢幕自適應,但一直有兩個硬傷讓我難受,一是螢幕被隨意拉伸後,裡面的UI就不是我想要的比例了,明明一個圓形變成橢圓了,一個高挑的美女變成一個肥姐了,好吧,這如果還能忍,那第二條真是讓我嚐盡了各種方法,那就是panel的裁剪用不了了,想做Scroll View做不了了,然後百度才知道要Panel做裁剪必須要求其scale和其父一直到根節點的scale都是(1,1,1),這還咋拉伸啊,然後看到很多朋友的各種程式碼嘗試,結果一一失敗了,反正是不好使,所以用UIStretch做螢幕自適應真是蛋疼啊,下了個新的NGUI版本3.0.8,UIStretch已經不能用了,看來連官方都不太支援了,好在還有其他辦法,看了一位朋友的部落格,寫的非常清楚了,我這裡做一下轉發,真是幫我解決了所有問題:

看過一些文章,大多數都用UIStretch。說實話我並不喜歡用這個指令碼。

我一直對那些在螢幕適應上出現問題的人推薦使用UIRoot的ManualHeight。

先提供三個截圖。看看效果是否是你想要的。旁邊空白出來的地方,你需要和策劃、美術商量用一些背景擋住。

1、正常開發解析度下:


2、看起來較細的解析度:


3、看起來較寬的解析度:


使用注意:

1、和策劃制定好開發時解析度。這很重要,要保證所有UI都在同樣的解析度下製作。

2、把我這個指令碼掛在UIRoot上。UIRoot的Scaling Style修改為FixedSize。

3、aspectRatioHeight、aspectRatioWidth分別為開發時的高和寬。

4、每個UIRoot都需要調整ManualHeight到和策劃制定的高度。

5、Unity3D的Game視窗,調整到相應的解析度。

(感謝成都-大強提供以下版本。注意:UICamera.onScreenResize是3.0+版本的,如果報錯請刪除即可

  1. using UnityEngine;  
  2. [ExecuteInEditMode]    
  3. [RequireComponent(typeof(UIRoot))]  
  4. publicclass SZUIRootScale : MonoBehaviour  
  5. {  
  6.     publicint aspectRatioHeight;  
  7.     public
    int aspectRatioWidth;  
  8.     publicbool runOnlyOnce = false;  
  9.     private UIRoot mRoot;  
  10.     privatebool mStarted = false;  
  11.     void Awake()  
  12.     {  
  13.         UICamera.onScreenResize += ScreenSizeChanged;  
  14.     }  
  15.     void OnDestroy()  
  16.     {  
  17.         UICamera.onScreenResize -= ScreenSizeChanged;  
  18.     }  
  19.     void Start()  
  20.     {  
  21.         mRoot = NGUITools.FindInParents<UIRoot>(this.gameObject);  
  22.         mRoot.scalingStyle = UIRoot.Scaling.FixedSize;  
  23.         this.Update();  
  24.         mStarted = true;  
  25.     }  
  26.     void ScreenSizeChanged()  
  27.     {   
  28.         if (mStarted && runOnlyOnce) {  
  29.             this.Update();  
  30.         }   
  31.     }  
  32.     void Update()  
  33.     {  
  34.         float defaultAspectRatio = aspectRatioWidth * 1f / aspectRatioHeight;  
  35.         float currentAspectRatio = Screen.width * 1f / Screen.height;  
  36.         if (defaultAspectRatio > currentAspectRatio) {  
  37.             int horizontalManualHeight = Mathf.FloorToInt(aspectRatioWidth / currentAspectRatio);  
  38.             mRoot.manualHeight = horizontalManualHeight;  
  39.         } else {  
  40.             mRoot.manualHeight = aspectRatioHeight;  
  41.         }  
  42.         if (runOnlyOnce && Application.isPlaying) {  
  43.             this.enabled = false;  
  44.         }  
  45.     }  
  46. }