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

How can I make that the ui elements in the main menu will fit every selected resolution?

主菜单是 built,有一个主菜单 Canvas 和一个我在 Canvas 上显示的游戏对象,还有一个相机。游戏对象也有自己的 Canvas 文本。

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

此屏幕截图是第一个 Canvas 设置和主菜单层次结构 build :

我需要另一个 Canvas 和相机的原因是,这是我可以在第一个 Canvas 上使用游戏对象动画和文本 Canvas 显示游戏对象 (NAVI) 的唯一方法 ui.

两个 Canvas 设置相同。

现在我在编辑器中将游戏 运行 更改为另一个分辨率 1024x768。 现在所有 ui 都乱七八糟了。当 运行 通过 built exe 文件在全屏幕或窗口屏幕上进行游戏时,情况相同 :

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

这是我用于从下拉菜单更改分辨率的脚本。脚本附在Main Menu下第一个main Canvas :

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);
    }
}

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

查看元素的矩形变换并将它们锚定在屏幕的正确位置。

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

Here 是关于 RectTransforms、Pivo​​t、Anchors 的一些更详细的信息...