Как я могу сделать так, чтобы элементы пользовательского интерфейса в главном меню соответствовали каждому выбранному разрешению?

Главное меню состоит из одного основного холста и игрового объекта, который я показываю поверх холста и имею камеру. У GameObject также есть собственный Canvas для текста.

Разрешение по умолчанию — 1920x1080, поэтому я вручную установил элементы пользовательского интерфейса, чтобы они соответствовали этому разрешению.

На этом снимке экрана показаны первые настройки Canvas и построение иерархии главного меню:

Главное меню холста

Причина, по которой мне понадобился еще один Canvas и камера, заключается в том, что это единственный способ отобразить GameObject (NAVI) поверх первого Canvas с анимацией GameObject и текстовым пользовательским интерфейсом.

Обе настройки Canvas одинаковы.

Сейчас поменял в редакторе еще до запуска игры на другое разрешение 1024х768. И теперь весь пользовательский интерфейс перепутался. То же самое происходит при запуске игры через встроенный exe-файл в полноэкранном или оконном режиме:

Разрешение изменено на 1024x768 для тестирования

И у меня есть много разрешений, каждое из которых имеет разную частоту кадров, поэтому будет немного сложно и потребуется время, чтобы установить каждое разрешение вручную, как я сделал для стандартного 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);
    }
}

person Daniel Lip    schedule 02.12.2019    source источник


Ответы (1)


В вашем случае вы настраиваете Canvas Scaler для масштабирования с размером экрана, сопоставляя высоту, поэтому они всегда будут соответствовать вертикальной оси. Это важный момент.

Взгляните на Rect Transforms ваших элементов и закрепите их в правильной точке экрана.

Вероятно, все ваши элементы закреплены в центре экрана, из-за чего они выходят за пределы игровой сцены.

Вот более подробная информация о RectTransforms, Pivot, Anchors...

person b.galerani    schedule 02.12.2019