【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+版本的,如果報錯請刪除即可)
- using UnityEngine;
- [ExecuteInEditMode]
- [RequireComponent(typeof(UIRoot))]
- publicclass SZUIRootScale : MonoBehaviour
- {
- publicint aspectRatioHeight;
-
public
- publicbool runOnlyOnce = false;
- private UIRoot mRoot;
- privatebool mStarted = false;
- void Awake()
- {
- UICamera.onScreenResize += ScreenSizeChanged;
- }
- void OnDestroy()
- {
- UICamera.onScreenResize -= ScreenSizeChanged;
- }
- void Start()
- {
- mRoot = NGUITools.FindInParents<UIRoot>(this.gameObject);
- mRoot.scalingStyle = UIRoot.Scaling.FixedSize;
- this.Update();
- mStarted = true;
- }
- void ScreenSizeChanged()
- {
- if (mStarted && runOnlyOnce) {
- this.Update();
- }
- }
- void Update()
- {
- float defaultAspectRatio = aspectRatioWidth * 1f / aspectRatioHeight;
- float currentAspectRatio = Screen.width * 1f / Screen.height;
- if (defaultAspectRatio > currentAspectRatio) {
- int horizontalManualHeight = Mathf.FloorToInt(aspectRatioWidth / currentAspectRatio);
- mRoot.manualHeight = horizontalManualHeight;
- } else {
- mRoot.manualHeight = aspectRatioHeight;
- }
- if (runOnlyOnce && Application.isPlaying) {
- this.enabled = false;
- }
- }
- }