Unity NGUI的多分辨率适配

参考链接:http://blog.csdn.net/mfc11/article/details/17681429,作者:CSDN mfc11

1、NGUI默认的适配方式:

  NGUI默认是适配方式是根据高度适配,高度适配的具体设置可以参看连接:http://www.cnblogs.com/vitah/p/3942392.html。

2、使用默认适配方式可能出现的问题:

  当目标设备的宽高比与所编辑页面的宽高比一致时,整个UI将完美显示;当目标设备宽高比小于所编辑的宽高比时,页面宽度将大于设备宽度,使得多出的部分无法显示;而当目标设备宽高比大于所编辑宽高比时,页面宽度小于设备宽度,设备两边将出现黑边。

3、使用UIAnchor:

  UIAnchor则是将整个页面分为TopLeft/Top/TopRight/Left/Center/Right/BottomLeft/Bottom/BottomRight九个区域,挂载了UIAnchor组件的节点都将按照设置自动停靠到相应的区域中。有了UIAnchor,上面的两个问题将被一定程度的解决:当目标设备宽高比小于编辑的宽高比时,由于UIAnchor的自动停靠功能,UI不会被裁切掉,但UI之间的左右间距将相应变小,有可能出现UI重叠的问题;当目标设备宽高比大于所编辑宽高比时,UI之间的左右间距将变大,好在这样起码不会有UI被裁切或重叠。

  这种使用UIAnchor的方法,只需要解决可能出现的UI重叠的情况,不过当有出现全屏的sprite时,一张铺满整个屏幕的UISprite不管是否使用UIAnchor,在目标设备宽高比更小时,sprite都会在横向上被裁切,而将目标设备宽高比更大时,sprite都不能铺满整个屏幕。

4、在使用UIAnchor时需要调节UI显示的问题:

  总结下就三个问题:

  (1)设备宽高比比所给UI的宽高比更小时,UI的重叠问题;

  (2)设备宽高比比所给UI宽高比小,全屏sprite被裁切;

  (3)设备宽高比比所给UI宽高比大,全屏sprite不能铺满整个屏幕;

5、设备宽高比比所给UI的宽高比更小时,UI的重叠问题的解决方式:

  当设备宽高比比所给UI宽高比更小,UI Root会根据UI的高度调节scale大小,使得设备宽度不足以显示全部全部的UI内容,我们可以调节摄像机的Camera.orthographicSize(仅适用2D GUI),以足够显示页面的宽度。即,改变了NGUI原有的“高度适配”原则,转为“宽度适配”,使得整个页面都得以显示,而由于UIAnchor的存在,UI的左右间距保持不变,但上下间距会变大。给出代码,挂载在UI Root下的Camere对象上:

using UnityEngine;
using System.Collections;

public class UIAdjust : MonoBehaviour
{
    // 所给UI的宽高
    private float standard_width = 1280f;
    private float standard_height = 720f;
    
    // 设备的宽高
    private float device_width = 0f;
    private float device_height = 0f;

    public void Awake()
    {
        // 获取设备的宽高
        device_width = Screen.width;
        device_height = Screen.height;

        SetCameraSize();
    }

    private void SetCameraSize()
    {
        float adjustor = 0f;

        // UI的宽高比
        float standard_aspect = standard_width / standard_height;

        // 设备的宽高比
        float device_aspect = device_width / device_height;

        // 设备宽高比小于UI的宽高比,调节Camere的orthographicSize,使设备的宽度能显示全部UI,即在高度适配的基础上再按宽度适配
        if (device_aspect < standard_aspect)
        {
            adjustor = standard_aspect / device_aspect; 
            camera.orthographicSize = adjustor;
        }
    }
}
View Code

  上诉代码可以解决非全屏的UI适配问题;

6、在5步骤的基础上,全屏sprite的显示问题:

  在5步骤的基础上,全屏sprite的显示会出现两个问题:

    (1)设备宽高比更小时,sprite上下不填满:

    (2)设备宽高比更大时,sprite左右不填满;

  这时候我们根据对应的比例调节全屏sprite在上下方向和左右方向的scale值即可,前提是该sprite可以拉伸,如果是不能拉伸的sprite需要采用其他的方法,给出全屏sprite的适配代码,挂载在需要全屏显示的sprite下:

using UnityEngine;
using System.Collections;

public class FullScreenSpriteAdjust : MonoBehaviour 
{
    private float standard_width = 1280f;
    private float standard_height = 720f;
    private float device_width = 0f;
    private float device_height = 0f;

    void Awake()
    {
        device_width = Screen.width;
        device_height = Screen.height;
        SpriteAdjust();
    }

    void SpriteAdjust()
    {
        // 图片标准的宽高比
        float standard_aspect = standard_width / standard_height;

        // 设备的宽高比
        float device_aspect = device_width / device_height;

        float scale_x = 1;
        float scale_y = 1;

        // 设备宽高比大于图片宽高比,sprite左右不填满
        if (device_aspect > standard_aspect)
        {
            scale_x = device_aspect / standard_aspect;
        }
        // 设备宽高比小于图片宽高比,sprite上下不填满
        else if (device_aspect < standard_aspect)
        {
            scale_y = standard_aspect / device_aspect;
        }

        gameObject.transform.localScale = new Vector3(scale_x, scale_y, gameObject.transform.localScale.z);
    }
}
View Code

  文章中内容几乎是复制参考链接的,感谢作者给出的想法。代码是自己写的,如果有更好的方法可以留言或者邮箱:linw1225#163.com(#换成@)~·

原文地址:https://www.cnblogs.com/vitah/p/4063330.html