• 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(#换成@)~·

  • 相关阅读:
    手撸编译器(2)...
    手撸编译器(1)...
    语义分析(2)...
    【最大流】ECNA 2015 F Transportation Delegation (Codeforces GYM 100825)
    【模拟】CSU 1807 最长上升子序列~ (2016湖南省第十二届大学生计算机程序设计竞赛)
    【宽搜】ECNA 2015 D Rings (Codeforces GYM 100825)
    【宽搜】ECNA 2015 E Squawk Virus (Codeforces GYM 100825)
    【模拟】ECNA 2015 I What's on the Grille? (Codeforces GYM 100825)
    【最短路】【数学】CSU 1806 Toll (2016湖南省第十二届大学生计算机程序设计竞赛)
    【树状数组】CSU 1811 Tree Intersection (2016湖南省第十二届大学生计算机程序设计竞赛)
  • 原文地址:https://www.cnblogs.com/vitah/p/4063330.html
Copyright © 2020-2023  润新知