如何使主菜单中的ui元素适合每个选定的分辨率?

问题描述 投票:0回答:1

主菜单由一个主Canvas和一个GameObject组成,我在Canvas上显示并具有Camera。 GameObject也有自己的画布来显示文本。

默认分辨率为1920x1080,因此我将ui元素设置为手动以适合此分辨率。

此屏幕快照是第一个Canvas设置和“主菜单”层次结构的构建:

Canvas main menu

之所以需要另一个Canvas和Camera,是这是我可以在第一个Canvas上显示带有GameObject动画和文本ui的GameObject(NAVI)的唯一方法。

两个画布设置都相同。

现在我在编辑器中进行了更改,甚至在将游戏运行到另一个分辨率1024x768之前。现在所有的用户界面都一团糟。在全屏或窗口模式下通过内置的exe文件运行游戏时,情况相同:

Changed resolution to 1024x768 for testing

而且我每个分辨率都有许多不同的帧速率,所以这有点困难,并且像我为默认的1920x1080所做的那样,将需要手动设置每个分辨率的时间。

这是我用来从下拉菜单更改分辨率的脚本。脚本被附加到主菜单下的第一个主画布上:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Audio;
using UnityEngine.UI;

public class SettingsMenu : MonoBehaviour
{
    public AudioMixer audioMixer;
    public Text volumeInPercentages;
    public Dropdown resolutionDropDown;

    [SerializeField]
    private Slider _volumeSlider;
    [SerializeField]
    private Dropdown _dropDownQuality;

    private Resolution[] resolutions;

    private void Start()
    {
        resolutions = Screen.resolutions;
        resolutionDropDown.ClearOptions();

        List<string> options = new List<string>();

        int currentResolutionIndex = 0;
        for (int i = 0; i < resolutions.Length; i++)
        {
            string option = resolutions[i].width + " x " + resolutions[i].height
                 + " " + resolutions[i].refreshRate.ToString() + " Hz";
            options.Add(option);

            if (resolutions[i].width == Screen.currentResolution.width &&
                resolutions[i].height == Screen.currentResolution.height)
            {
                currentResolutionIndex = i;
            }
        }

        resolutionDropDown.AddOptions(options);
        resolutionDropDown.value = currentResolutionIndex;
        resolutionDropDown.RefreshShownValue();
    }

    public void SetVolume()
    {
        float volume = _volumeSlider.value;
        Debug.Log("Volume " + volume);
        audioMixer.SetFloat("MusicVol", Mathf.Log10(volume) * 20);
        volumeInPercentages.text = Mathf.Round(volume * 100).ToString() + " %";
    }

    public void SetQuality()
    {
        int qualityIndex = _dropDownQuality.value;
        QualitySettings.SetQualityLevel(qualityIndex);
    }

    public void SetFullScreen()
    {
        Screen.fullScreen = !Screen.fullScreen;
    }

    public void SetResolution()
    {
        Resolution resolution = resolutions[resolutionDropDown.value];
        Screen.SetResolution(resolution.width, resolution.height, Screen.fullScreen);
    }
}
c# unity3d canvas resolution screen-resolution
1个回答
0
投票

在您的情况下,您正在将Canvas Scaler设置为通过匹配高度来按屏幕尺寸缩放,因此它们始终适合垂直轴。这是重要的一点。

查看元素的Rect变换,并将其锚定在屏幕的正确点。

[您的所有元素可能都固定在屏幕中央,导致它们离开游戏场景。

Here是有关RectTransforms,Pivot,Anchors的一些更详细的信息...

© www.soinside.com 2019 - 2024. All rights reserved.