天天看點

NGUI自适應各種螢幕的解決方法

NGUI自适應各種螢幕的解決方法:

這個問題是困擾了很多人,但找了下解決的方法很多,我覺得這是最簡單的方法。

現在很多人說螢幕自适應改用UIAnchor腳本,對于高版本我并沒有用過,寫該文時,NGUI已經更新到3.5.4。

使用的版本是NGUI 2.7.0,需要關聯的腳本,UIRoot,UIStretch兩個主要的腳本。

1.設定開發環境分辨率,設定開發分辨率:1920 x 1200 (這是我的開發分辨率)

NGUI自适應各種螢幕的解決方法
NGUI自适應各種螢幕的解決方法

2.點選NGUI建立的2DUI的根節點(如何建立UI就不用說了吧),在監視面闆(Inspector)中設定UIRoot腳本,如下圖:

NGUI自适應各種螢幕的解決方法

3.找到2DUI相機節點(Camera),挂上UIStretch腳本,并設定,如下圖:

NGUI自适應各種螢幕的解決方法

4.在Game視圖切換到開發比率(1920x1200)下開發,這樣你釋出的UI就能适應各種螢幕,不會有黑邊,不過如果螢幕的分辨率和開發分辨率相差太大的話,會有壓縮或放大。

5.我自己也寫了個簡單的2DUI界面自動适應的腳本(縮水版),直接将該腳本挂到UI相機上就行,然後再在監視面闆輸入開發的寬和高(開發分辨率)

using UnityEngine;
using System.Collections;

           
// 使在輯模式運作該腳本,直接觀察,所見及所得,點選播放按鈕一次,觀察效果
           
[ExecuteInEditMode]
public class AutoAdjustResFor2DUI : MonoBehaviour
{
    // 該腳本挂到NGUI的2D相機上面,使UI自動适應螢幕,為了開發直覺,還是要調好步驟1.2中的參數

    public int resWidth  = 1920; // 開發分辨率 寬 可以在監視面闆改成你的分辨率寬,這是我預設值
    public int resHieght = 1200; // 開發分辨率 高

    Camera uiCamera = null;

    Vector2 relativeSize = Vector2.one;

    Transform mTrans;
    UIRoot mRoot;
    Rect mRect;

    void Awake()
    {
        mRect = new Rect();
        mTrans = transform;
    }

    void Start()
    {
        uiCamera = gameObject.camera;
        mRoot = transform.root.GetComponent<UIRoot>();
        //print(mRoot.name);
        mRoot.manualHeight = resHieght;
        relativeSize.x = 1f / resWidth;
        relativeSize.y = 1f / resHieght;
    }

    void Update()
    {
        float adjustment = 1f;

        if (uiCamera == null)
        {
            Debug.LogError("2DUI Camera is null!, This script must be attached 2DUI's camera!");
            return;
            
        }
        else
        {
            mRect = uiCamera.pixelRect;
            adjustment = mRoot.pixelSizeAdjustment;
        } 

        float rectWidth = mRect.width;
        float rectHeight = mRect.height;

        if (adjustment != 1f && rectHeight > 1f)
        {
            float scale = mRoot.activeHeight / rectHeight;
            rectWidth *= scale;
            rectHeight *= scale;
        }

        Vector3 localScale = mTrans.localScale;

        localScale.x = relativeSize.x * rectWidth;
        localScale.y = relativeSize.y * rectHeight;

        if (mTrans.localScale != localScale) mTrans.localScale = localScale;
    }
}