牛骨文教育服务平台(让学习变的简单)
博文笔记

NGUI自适应各种屏幕的解决方法

创建时间:2014-03-27 投稿人: 浏览次数:169

NGUI自适应各种屏幕的解决方法:


这个问题是困扰了很多人,但找了下解决的方法很多,我觉得这是最简单的方法。

现在很多人说屏幕自适应改用UIAnchor脚本,对于高版本我并没有用过,写该文时,NGUI已经更新到3.5.4。


使用的版本是NGUI 2.7.0,需要关联的脚本,UIRoot,UIStretch两个主要的脚本。


1.设置开发环境分辨率,设置开发分辨率:1920 x 1200 (这是我的开发分辨率)




2.点击NGUI创建的2DUI的根节点(如何创建UI就不用说了吧),在监视面板(Inspector)中设置UIRoot脚本,如下图:



3.找到2DUI相机节点(Camera),挂上UIStretch脚本,并设置,如下图:



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;
    }
}


声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。