如何使主菜单中的 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、Pivot、Anchors 的一些更详细的信息...
主菜单是 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、Pivot、Anchors 的一些更详细的信息...