Главное меню состоит из одного основного холста и игрового объекта, который я показываю поверх холста и имею камеру. У GameObject также есть собственный Canvas для текста.
Разрешение по умолчанию — 1920x1080, поэтому я вручную установил элементы пользовательского интерфейса, чтобы они соответствовали этому разрешению.
На этом снимке экрана показаны первые настройки Canvas и построение иерархии главного меню:
Причина, по которой мне понадобился еще один Canvas и камера, заключается в том, что это единственный способ отобразить GameObject (NAVI) поверх первого Canvas с анимацией GameObject и текстовым пользовательским интерфейсом.
Обе настройки Canvas одинаковы.
Сейчас поменял в редакторе еще до запуска игры на другое разрешение 1024х768. И теперь весь пользовательский интерфейс перепутался. То же самое происходит при запуске игры через встроенный exe-файл в полноэкранном или оконном режиме:
И у меня есть много разрешений, каждое из которых имеет разную частоту кадров, поэтому будет немного сложно и потребуется время, чтобы установить каждое разрешение вручную, как я сделал для стандартного 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);
}
}