Unity NGUI PC屏幕自适应(定高移动布局方案)

发表于2018-01-26
评论0 1.7k浏览

Unity开发中经常会需要使用NUGI插件实现某些功能,本篇文章就是如果利用UGUI插件实现PC屏幕自适应,考虑到有些人还不知道设置的方法,下面就给大家介绍下实现的步骤。


步骤:

1.设置NGUI的UIRoot适配方案,这样保证任何分辨率下高度能保证全部呈现。(高度设置为基准高度,即做UI得时候的高度)


2.贴上脚本,把需要移动和缩放的object拖入Inspector,选择移动或缩放方案。代码如下:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
/// <summary>
/// 自适应类型
/// </summary>
public enum SelfAdaptionType
{
    LeftPanel,
    UpPanel,
    DownPanel,
    RightPanel
}
public class SelfAdaption_PC : MonoBehaviour {
    public SelfAdaptionType adaptionType; //自适应类型
    float screenWid;
    float screenHei;
    private float baseWidth=2000f;  //基准宽
    private float baseHeight = 1125f;  //基准高
    private float baseScreenWidth = 1296f;   //基准的屏幕宽(screen.width的输出值)
    float deltaWid;  //移动偏移量
    float deltaScale;  //缩放比例
    public List<GameObject> objsMove = new List<GameObject>();   //需要移动的物体
    public List<GameObject> objsScale = new List<GameObject>();  //需要缩放的物体
    void Awake()
    {
        screenWid= Screen.width;
        screenHei = Screen.height;
        deltaWid = (baseWidth - screenWid* baseHeight / screenHei)/2;
        deltaScale = screenWid / baseScreenWidth;
        SelfAdaption_PC_();
    }
    private void SelfAdaption_PC_()
    {
        if(adaptionType.Equals(SelfAdaptionType.LeftPanel))
        {
            MoveObjs(1);
        }
        else if(adaptionType.Equals(SelfAdaptionType.RightPanel))
        {
            MoveObjs(-1);
        }
        else if(adaptionType.Equals(SelfAdaptionType.UpPanel))
        {
            ScaleObjs();
        }
        else if(adaptionType.Equals(SelfAdaptionType.DownPanel))
        {
            ScaleObjs();
        }
    }
    private bool MoveObjs(int _flag)
    {
        if (objsMove != null && objsMove.Count > 0)
        {
            foreach (var it in objsMove)
            {
                it.transform.localPosition +=(_flag)* new Vector3(deltaWid, 0, 0);
            }
            return true;
        }
        return false;
    }
    private bool ScaleObjs()
    {
        if(objsScale!=null&&objsScale.Count>0)
        {
            foreach(var it in objsScale)
            {
                Vector3 t_scale = it.transform.localScale;
                it.transform.localScale = new Vector3(t_scale.x*deltaScale,t_scale.y,t_scale.z);
            }
            return true;
        }
        return false;
    }
}

PS:

1.Game里设置的基准分辨率,与screen.width和screen.height不符,导致缩放的参考值需要获取和自己设置。

2.本示例缩放不适用于不居中的的物体(此方案旨在移动布局)。


示例:

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引