unity3d

Unity设置界面(分辨率、画质)打包处理

2019-05-27  本文已影响184人  罗卡恩

经常在Unity里打完包进入时候会有选择分辨率、还有画质,如何让他们在外部不显示而是在里面直接打开进行设置。

PlayerSetting里面Splash Image里


image.png

这个是去掉开头Logo 然而会有忽明忽暗 把他上面勾掉就行了这个是整体管理


image.png
然后就可以直接进入场景没有开头了
这里可以自己设置一些Logo
image.png

只能放图片 参数是出现时间
然后找到


image.png
换成Disabled就不会出现一开始的设置界面了 要我们自己去设置
这个是上面的参数,把上面的勾去掉就是自己设置进入默认分辨率 勾上就是默认进入全屏
image.png
这个是设置支持的宽高比率 我就仅支持16:9算了
image.png
然后只能选16.9但是没有1920x1080
image.png

顺便说一下勾选这个可以在后台运行,就是你最小化或者Unity不在windows界面最高层级一般来说是不会运行的


image.png

这个不勾的话是每次开新文件切换回最小化


image.png
这个是是否单开选项 默认不勾可以开多个
image.png

不过因为这么设置打包还是全屏,因为unity觉得保留用户设置比较重要,所以上一次的信息被储存在了一个注册表中,然后相当于咱们设置的这个是无效的


image.png
所以要用代码控制 需要在Awake或者Start调用一次改变窗口大小
/**
 *Copyright(C) 2019 by #COMPANY#
 *All rights reserved.
 *FileName:     #SCRIPTFULLNAME#
 *Author:       #AUTHOR#
 *Version:      #VERSION#
 *UnityVersion:#UNITYVERSION#
 *Date:         #DATE#
 *Description:   管理设置参数
 * 分辨率设置
 * 清晰度设置
 *History:
*/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SetUpManager : MonoBehaviour
{
    /// <summary>
    /// 储存所需要的分辨率 我这里储存16:9 要别的分辨率可以打印所有去看
    /// </summary>
    public enum EResolution
    {
        _1280x720=6,
        _1600x900=14,       
        _1920x1080=18,       
    }
    Resolution[] resolutions;

    private void Start()
    {
        //所有可以设置的分辨率 unity自带
        resolutions = Screen.resolutions;

        ////可以打印出来去选择自己需要的分辨率
        //foreach (Resolution item in resolutions)
        //{
        //    Debug.Log(item.width + "x" + item.height);
        //}
        SetResolution(EResolution._1280x720);
    }

    /// <summary>
    /// 设置分辨率
    /// </summary>
    public void SetResolution(EResolution type)
    {
        //前两个是分辨率 后两个是是否全屏 最后一个是以多少Hz来显示默认为0
        Screen.SetResolution(resolutions[(int)type].width, resolutions[(int)type].height,false);
    }

    /// <summary>
    /// 是否全屏
    /// </summary>
    /// <param name="isFull"></param>
    public void IsFullScreen(bool isFull)
    {
        Screen.fullScreen = isFull;
    }
}

这样就OK了
之后添加画质设置


image.png

在这里


image.png
这边是等级也可以自己设置 然后就是下面一对参数属性
点这里可以设置一个默认的 我默认设置为我自己觉得可以最低的 image.png

设置的时候是从0开始依次增加

这个帖子说的比较全各种参数
https://blog.csdn.net/Nice_66/article/details/80682242
这里我我们用默认的几个设置

/**
 *Copyright(C) 2019 by #COMPANY#
 *All rights reserved.
 *FileName:     #SCRIPTFULLNAME#
 *Author:       #AUTHOR#
 *Version:      #VERSION#
 *UnityVersion:#UNITYVERSION#
 *Date:         #DATE#
 *Description:   管理设置参数
 * 分辨率设置
 * 清晰度设置
 *History:
*/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SetUpManager
{
    /// <summary>
    /// 储存所需要的分辨率 我这里储存16:9 
    /// </summary>
    public enum EResolution
    {
        _1280x720 = 0,
        _1600x900,
        _1920x1080,
    }

    /// <summary>
    /// 储存所需要的画质等级 对应QualitySettings.names的index
    /// </summary>
    public enum EQualityLevel
    {
        Low = 2,
        Medium = 3,
        Hight = 4
    }

    ////官方的无法直接调用 没有反应要自己写
    //Resolution[] resolutions;
    //public SetUpManager()
    //{
    //    resolutions = Screen.resolutions;
    //}

    Resolution[] resolutions = new Resolution[3] {
        new Resolution { width=1280, height=720, refreshRate=60 },
        new Resolution { width=1600, height=900, refreshRate=60 },
        new Resolution { width=1920, height=1080, refreshRate=60}
    };

    /// <summary>
    /// 设置分辨率
    /// </summary>
    public void SetResolution(EResolution type)
    {
        //所有可以设置的分辨率 unity自带
        var res = resolutions[(int)type];
        //前两个是分辨率 后两个是是否全屏 最后一个是以多少Hz来显示默认为0
        Screen.SetResolution(res.width,res.height,false,res.refreshRate);
    }

    /// <summary>
    /// 是否全屏
    /// </summary>
    /// <param name="isFull"></param>
    public void IsFullScreen(bool isFull)
    {
        Screen.fullScreen = isFull;     
    }

    /// <summary>
    /// 设置画面质量
    /// </summary>
    public void SetDrawQuality(EQualityLevel type)
    {
        //索引 是否显示高画质(false之后改变画质有些消耗资源参数可能不变 所以改为true)
        QualitySettings.SetQualityLevel((int)type, true);
    }

}

不过画质这个好像也是有上次信息储存也是需要Start给一个默认

拉出来几个Toggle 空节点添加这个组件


image.png

然后把这个组件添加给要分的Toggle组 再把默认Toggle勾上组内其他Toggle勾去掉就是IsOn这个参数


image.png
立刻勾上是没有反应的 运行下刷新
image.png

把ToggleName改成对应的枚举index

然后我发现打包那个初始化可以不用要了 改变公司名 不用默认就不会被强制全屏


image.png

然后就是用Screen.resolutions里的属性没有用.只能用他封装的一个类自己写属性
再写一个Toggle类调用

/**
 *Copyright(C) 2019 by #COMPANY#
 *All rights reserved.
 *FileName:     #SCRIPTFULLNAME#
 *Author:       #AUTHOR#
 *Version:      #VERSION#
 *UnityVersion:#UNITYVERSION#
 *Date:         #DATE#
 *Description:   
 *History:
*/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Text1 : MonoBehaviour
{
    public Toggle[] togRes;
    public Toggle[] togQua;
    // Use this for initialization
    void Start()
    {
        SetUpManager set = new SetUpManager();

        ////可以打印出来去选择自己需要的分辨率
        //foreach (Resolution item in Screen.resolutions)
        //{
        //    Debug.Log(item.width + "x" + item.height);
        //}

        //打印当前等级
        //foreach (var item in QualitySettings.names)
        //{
        //    Debug.Log(item.ToString());
        //}


        foreach (var item in togRes)
        {
            item.onValueChanged.AddListener((isOn) =>
            {
                if (isOn)
                {
                    //-1是全屏
                    if (item.name == "-1")
                    {
                        set.IsFullScreen(true);
                    }
                    else
                    {
                        set.SetResolution((SetUpManager.EResolution)int.Parse(item.name));
                    }
                }
            });
        }


        foreach (var item in togQua)
        {
            item.onValueChanged.AddListener((isOn) =>
            {
                if (isOn)
                {
                    set.SetDrawQuality((SetUpManager.EQualityLevel)int.Parse(item.name));
                }
            });
        }

    }
}

Toggle名字改成和索引对应


image.png

分辨率就不测试了图太大 测试一个画质的 明显看出区别 尤其是光影


GIF.gif

还有个之后发现了 在第二次打开Unity会出现Unity读注册表里的参数 然后参数就对应不上Btn的位置了

/**
*Copyright(C) 2019 by #COMPANY#
*All rights reserved.
*FileName:     #SCRIPTFULLNAME#
*Author:       #AUTHOR#
*Version:      #VERSION#
*UnityVersion:#UNITYVERSION#
*Date:         #DATE#
*Description:   管理设置参数
* 分辨率设置
* 清晰度设置
*History:
*/
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class SetUpManager
{
    /// <summary>
    /// 储存所需要的分辨率 我这里储存16:9 
    /// </summary>
    public enum EResolution
    {
        _1280x720 = 0,
        _1600x900,
        _1920x1080,
    }

    /// <summary>
    /// 储存所需要的画质等级 对应QualitySettings.names的index 从0开始
    /// </summary>
    public enum EQualityLevel
    {
        Low = 2,
        Medium = 3,
        Hight = 4
    }

    ////官方的无法直接调用 没有反应要自己写
    //Resolution[] resolutions;
    //public SetUpManager()
    //{
    //    resolutions = Screen.resolutions;
    //}

    Resolution[] resolutions = new Resolution[3] {
        new Resolution { width=1280, height=720, refreshRate=60 },
        new Resolution { width=1600, height=900, refreshRate=60 },
        new Resolution { width=1920, height=1080, refreshRate=60}
    };

    /// <summary>
    /// 设置分辨率
    /// </summary>
    public void SetResolution(EResolution type)
    {
        //所有可以设置的分辨率 unity自带
        var res = resolutions[(int)type];
        //前两个是分辨率 后两个是是否全屏 最后一个是以多少Hz来显示默认为0
        Screen.SetResolution(res.width, res.height, false, res.refreshRate);
    }

    /// <summary>
    /// 设置是否全屏全屏
    /// </summary>
    /// <param name="isFull"></param>
    public void SetFullScreen(bool isFull)
    {
        Screen.fullScreen = isFull;
    }

    /// <summary>
    /// 设置画面质量
    /// </summary>
    public void SetDrawQuality(EQualityLevel type)
    {
        //索引 是否显示高画质(false之后改变画质有些消耗资源参数可能不变 所以改为true)
        QualitySettings.SetQualityLevel((int)type, true);
    }

    /// <summary>
    /// 获取当前分辨率
    /// </summary>
    public EResolution GetNowResolution()
    {
        //If the player is running in window mode, this returns the current resolution of the desktop.
        //如果播放器是运行在窗口模式,则返回的是当前桌面的分辨率
        //Debug.Log(Screen.currentResolution);        
        for (int i = 0; i < resolutions.Length; i++)
        {
            var res = resolutions[i];
            //等于返回0,大于返回大于0的值,小于返回小于0的值 基本是-1 0 1
            if (res.width.CompareTo(Screen.width)==0&&res.height.CompareTo(Screen.height)==0)
            {
                return (EResolution)i;
            }
        }
        return EResolution._1280x720;
    }

    /// <summary>
    /// 是否全屏
    /// </summary>
    /// <returns></returns>
    public bool IsFullScreen()
    {
        return Screen.fullScreen;
    }

    /// <summary>
    /// 获取当前画质
    /// </summary>
    /// <returns></returns>
    public EQualityLevel GetNowDrawQuality()
    {
        return (EQualityLevel)QualitySettings.GetQualityLevel();
    }
}

/**
 *Copyright(C) 2019 by #COMPANY#
 *All rights reserved.
 *FileName:     #SCRIPTFULLNAME#
 *Author:       #AUTHOR#
 *Version:      #VERSION#
 *UnityVersion:#UNITYVERSION#
 *Date:         #DATE#
 *Description:   
 *History:
*/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Text1 : MonoBehaviour
{
    Transform[] togRes;
    Transform[] togQua;
    SetUpManager set = new SetUpManager();
    // Use this for initialization
    void Start()
    {

        ////可以打印出来去选择自己需要的分辨率
        //foreach (Resolution item in Screen.resolutions)
        //{
        //    Debug.Log(item.width + "x" + item.height);
        //}

        //打印当前等级
        //foreach (var item in QualitySettings.names)
        //{
        //    Debug.Log(item.ToString());
        //}

        togRes = new Transform[4] {
            transform.Find("GameObject/0"),
            transform.Find("GameObject/1"),
            transform.Find("GameObject/2"),
            transform.Find("GameObject/-1")
        };

        togQua = new Transform[3] {
            transform.Find("GameObject (1)/2"),
            transform.Find("GameObject (1)/3"),
            transform.Find("GameObject (1)/4")
        };
        RefreshBtn();

        foreach (var item in togRes)
        {
            item.GetComponent<Toggle>().onValueChanged.AddListener((isOn) =>
            {

                if (isOn)
                {
                    //-1是全屏
                    if (item.name == "-1")
                    {
                        set.SetFullScreen(true);
                    }
                    else
                    {
                        set.SetResolution((SetUpManager.EResolution)int.Parse(item.name));
                    }
                }
            });
        }


        foreach (var item in togQua)
        {
            item.GetComponent<Toggle>().onValueChanged.AddListener((isOn) =>
            {
                if (isOn)
                {
                    Debug.Log(item.name);
                    set.SetDrawQuality((SetUpManager.EQualityLevel)int.Parse(item.name));
                }
            });
        }


    }
    // 由于unity自带配置表记录用户数据我们要实时改变第二次及以后打开的Btn位置
    /// <summary>
    ///刷新Btn
    /// </summary>
    void RefreshBtn()
    {
        foreach (var item in togRes)
        {
            if (item.name == ((int)set.GetNowResolution()).ToString())
            {
                item.GetComponent<Toggle>().isOn = true;
            }
            else if (set.IsFullScreen() == true && item.name == "-1")
            {
                item.GetComponent<Toggle>().isOn = true;
            }
        }

        foreach (var item in togQua)
        {
            if (item.name == ((int)set.GetNowDrawQuality()).ToString())
            {
                item.GetComponent<Toggle>().isOn = true;
            }
        }
    }
}

这样就可以获取到之前的参数Btn自己变化了 建议有需要的一般这个界面都是激活失活可以把刷新函数放在OnEnable里
然后改了下获取模式 更简单 改成了OnEnable,因为OnEnable生命周期比Start靠前,所以改为Awake但是会出现默认Toggle残留,Start并不会,所以一开始就把勾都关掉。靠刷新添加就行了 然后基本大功告成了 进去也会储存信息


image.png

不过5.X版本还是要用之前的老脚本的方法,每次循环都用临时变量接受

/**
 *Copyright(C) 2019 by #COMPANY#
 *All rights reserved.
 *FileName:     #SCRIPTFULLNAME#
 *Author:       #AUTHOR#
 *Version:      #VERSION#
 *UnityVersion:#UNITYVERSION#
 *Date:         #DATE#
 *Description:   
 *History:
*/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Text1 : MonoBehaviour
{
    ToggleGroup resGroup;
    ToggleGroup quaGroup;
    SetUpManager set = new SetUpManager();


    void Awake()
    {
        ////可以打印出来去选择自己需要的分辨率
        //foreach (Resolution item in Screen.resolutions)
        //{
        //    Debug.Log(item.width + "x" + item.height);
        //}

        //打印当前等级
        //foreach (var item in QualitySettings.names)
        //{
        //    Debug.Log(item.ToString());
        //}

        resGroup = transform.Find("GameObject").GetComponent<ToggleGroup>();
        quaGroup = transform.Find("GameObject (1)").GetComponent<ToggleGroup>();
        foreach (var item in resGroup.GetComponentsInChildren<Toggle>())
        {                  
            item.onValueChanged.AddListener((isOn) =>
            {                
                if (isOn)
                {
                    //-1是全屏
                    if (item.name == "-1")
                    {
                        set.SetFullScreen(true);
                    }
                    else
                    {
                        set.SetResolution((SetUpManager.EResolution)int.Parse(item.name));
                    }
                }
            });
        }
        foreach (var item in quaGroup.GetComponentsInChildren<Toggle>())
        {
            item.onValueChanged.AddListener((isOn) =>
            {
                if (isOn)
                {
                    set.SetDrawQuality((SetUpManager.EQualityLevel)int.Parse(item.name));
                }
            });
        }
    }

    void OnEnable()
    {
        RefreshBtn();
    }
    // 由于unity自带配置表记录用户数据我们要实时改变第二次及以后打开的Btn位置
    /// <summary>
    ///刷新Btn 
    /// </summary>
    void RefreshBtn()
    {
        foreach (var item in resGroup.GetComponentsInChildren<Toggle>())
        {
            if (item.name == ((int)set.GetNowResolution()).ToString()|| set.IsFullScreen() == true && item.name == "-1")
            {
                item.GetComponent<Toggle>().isOn=true;
            }      
        }

        foreach (var item in quaGroup.GetComponentsInChildren<Toggle>())
        {
            if (item.name == ((int)set.GetNowDrawQuality()).ToString())
            {
                item.GetComponent<Toggle>().isOn = true;
            }
        }
    }
}

好像这个是这个按钮效果必须打包才能测出来 不然一直是第一个或者没有

还有一个坑,虽然这个绿对勾是平台默认画质,但是这个灰色的是选中当前的画质默认的话最好自己点一下需要默认的,不然就默认第一个会一开始对不上


image.png

然后改进下toggle会错乱的BUG 还有全屏改窗口会自动跑左上角的BUG


image.png

官方介绍,所以只能改协程设置,让他们有一个延迟不然之前的结果都会被覆盖掉

/**
*Copyright(C) 2019 by #COMPANY#
*All rights reserved.
*FileName:     #SCRIPTFULLNAME#
*Author:       #AUTHOR#
*Version:      #VERSION#
*UnityVersion:#UNITYVERSION#
*Date:         #DATE#
*Description:   管理设置参数
* 分辨率设置
* 清晰度设置
*History:
*/
using System;
using System.Collections;
using System.Runtime.InteropServices;
using System.Threading;
using UnityEngine;

public class SetUpManager
{
    /// <summary>
    /// 储存所需要的分辨率 我这里储存16:9 
    /// </summary>
    public enum EResolution
    {
        _1280x720 = 0,
        _1600x900,
        _1920x1080,
        All,
    }

    /// <summary>
    /// 储存所需要的画质等级 对应QualitySettings.names的index 从0开始
    /// </summary>
    public enum EQualityLevel
    {
        Low = 2,
        Medium = 3,
        Hight = 4
    }

    ////官方的无法直接调用 没有反应要自己写
    //Resolution[] resolutions;
    //public SetUpManager()
    //{
    //    resolutions = Screen.resolutions;
    //}

    Resolution[] resolutions = new Resolution[3] {
        new Resolution { width=1280, height=720, refreshRate=60 },
        new Resolution { width=1600, height=900, refreshRate=60 },
        new Resolution { width=1920, height=1080, refreshRate=60}
    };

    /// <summary>
    /// 设置分辨率
    /// </summary>
    public IEnumerator SetResolution(EResolution type)
    {
        Resolution res;
        //全屏
        if (type == EResolution.All)
        {
            Screen.SetResolution(Screen.currentResolution.width, Screen.currentResolution.height, true, 60);
            yield return null;
        }
        //所有可以设置的分辨率 unity自带
        res = resolutions[(int)type];
        //如果播放器是运行在窗口模式,则返回的是当前桌面的分辨率  可使用分辨率不能大于这个数
        //  Screen.currentResolution 
        //全屏切回来会在左上角 所以先取消全屏 因为这些函数都是在这一帧结束时调用 就等待它调用完毕再设置
        yield return Screen.fullScreen=false;
       
        Screen.SetResolution(res.width, res.height, false,res.refreshRate);      
    }

    /// <summary>
    /// 设置画面质量
    /// </summary>
    public void SetDrawQuality(EQualityLevel type)
    {
        //索引 是否显示高画质(false之后改变画质有些消耗资源参数可能不变 所以改为true)
        QualitySettings.SetQualityLevel((int)type, true);
    }

    /// <summary>
    /// 获取当前分辨率
    /// </summary>
    public EResolution GetNowResolution()
    {
        for (int i = 0; i < resolutions.Length; i++)
        {
            var res = resolutions[i];
            //等于返回0,大于返回大于0的值,小于返回小于0的值 基本是-1 0 1
            if (res.width.CompareTo(Screen.width) == 0 && res.height.CompareTo(Screen.height) == 0 && !IsFullScreen())
            {
                return (EResolution)i;
            }
        }
        return EResolution.All;
    }

    /// <summary>
    /// 是否全屏
    /// </summary>
    /// <returns></returns>
    public bool IsFullScreen()
    {
        return Screen.fullScreen;
    }

    /// <summary>
    /// 获取当前画质
    /// </summary>
    /// <returns></returns>
    public EQualityLevel GetNowDrawQuality()
    {
        return (EQualityLevel)QualitySettings.GetQualityLevel();
    }
}
/**
 *Copyright(C) 2019 by #COMPANY#
 *All rights reserved.
 *FileName:     #SCRIPTFULLNAME#
 *Author:       #AUTHOR#
 *Version:      #VERSION#
 *UnityVersion:#UNITYVERSION#
 *Date:         #DATE#
 *Description:   
 *History:
*/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class Text1 : MonoBehaviour
{
    ToggleGroup resGroup;
    ToggleGroup quaGroup;
    SetUpManager set = new SetUpManager();

    void Awake()
    {
        ////可以打印出来去选择自己需要的分辨率 是根据 Screen.currentResolution 的限制改变可用的种类
        //foreach (Resolution item in Screen.resolutions)
        //{
        //    Debug.Log(item.width + "x" + item.height);
        //}

        //打印当前等级
        //foreach (var item in QualitySettings.names)
        //{
        //    Debug.Log(item.ToString());
        //}

        resGroup = transform.Find("GameObject").GetComponent<ToggleGroup>();
        quaGroup = transform.Find("GameObject (1)").GetComponent<ToggleGroup>();
        foreach (var item in resGroup.GetComponentsInChildren<Toggle>())
        {
            item.onValueChanged.AddListener((isOn) =>
            {
                if (isOn)
                {
                 StartCoroutine(set.SetResolution((SetUpManager.EResolution)int.Parse(item.name)));
                }
            });
        }
        foreach (var item in quaGroup.GetComponentsInChildren<Toggle>())
        {
            item.onValueChanged.AddListener((isOn) =>
            {
                if (isOn)
                {
                    set.SetDrawQuality((SetUpManager.EQualityLevel)int.Parse(item.name));
                }
            });
        }
    }

    void OnEnable()
    {
        RefreshBtn();
    }
    // 由于unity自带配置表记录用户数据我们要实时改变第二次及以后打开的Btn位置
    /// <summary>
    ///刷新Btn 
    /// </summary>
    void RefreshBtn()
    {
        foreach (var item in resGroup.GetComponentsInChildren<Toggle>())
        {
            if (item.name == ((int)set.GetNowResolution()).ToString())
            {
                item.isOn = true;
            }
        }

        foreach (var item in quaGroup.GetComponentsInChildren<Toggle>())
        {
            if (item.name == ((int)set.GetNowDrawQuality()).ToString())
            {
                item.isOn = true;
            }
        }
    }
}

GitHub
https://github.com/1004019267/SetUp-Wnd

上一篇 下一篇

猜你喜欢

热点阅读