Меню выбора разрешения экрана с фильтром

Недавно в Unity добавили (наконец-то) выпадающий список UI. И раз такое дело, на его основе сделаем меню выбора разрешения экрана. Но, чтобы не делать лишние телодвижения, автоматизируем процесс заполнения опций менюшки, дополнительно добавим кнопку для принятия выбранных настроек, плюс, переключатель режима, полноэкранный или оконный. Еще сделаем фильтр списка разрешений, то есть, если вы хотите установить для своей игры определённое минимальное разрешения, просто указываем соответствующее значение по высоте экрана, и из списка разрешений будут исключены все, которые ниже установленного значения.

Добавим на сцену GameObject -> UI:

-> Dropdown собственно будущий список.
-> Button кнопка, для принятия настроек.
-> Toggle переключатель режима экрана.

Теперь скрипт, точнее код, который мы встраиваем в скрипт меню игры.



Убедимся что подключены нужные библиотеки:

using UnityEngine;
using UnityEngine.UI;
using System.Collections;

Объявляем переменные:

public Dropdown resDropdown; // выпадающая менюшка
public int minHeight = 720; // фильтр разрешения экрана по высоте, включая это
public Button applyButton; // кнопка "Применить"
public Toggle fullscreenToggle; // переключатель полноэкранный/оконный режим

private Resolution[] resolutionsList;
private int resolutionsList_id;

Старт сцены:

void Start () 
{
	resolutionsList = Screen.resolutions;
	ReBuildResolutionsList();
	SetDropdownMenu();
	fullscreenToggle.isOn = Screen.fullScreen;
	applyButton.interactable = false;
}

Основные функции:

string ResToString(Resolution res)
{
	return res.width + " x " + res.height;
}

void SetDropdownMenu()
{
	resDropdown.options = new System.Collections.Generic.List<Dropdown.OptionData>();
	
	for (int i = 0; i < resolutionsList.Length; i++)
	{
		Dropdown.OptionData option = new Dropdown.OptionData();
		option.text = ResToString(resolutionsList[i]);
		resDropdown.options.Add(option);
		if(resolutionsList[i].height == Screen.height && resolutionsList[i].width == Screen.width) resolutionsList_id = i;
	}
	
	resDropdown.value = resolutionsList_id;
	resDropdown.onValueChanged.AddListener(delegate { SetID(); });
	fullscreenToggle.onValueChanged.AddListener(delegate { SetID(); });
	applyButton.onclick.AddListener(() => {ApplyResolution();});
}

void SetID()
{
	applyButton.interactable = true;
	resolutionsList_id = resDropdown.value;
}

void ApplyResolution()
{
	applyButton.interactable = false;
	Screen.SetResolution(resolutionsList[resolutionsList_id].width, resolutionsList[resolutionsList_id].height, fullscreenToggle.isOn);
}

void ReBuildResolutionsList()
{
	int x = 0;
	foreach (Resolution element in resolutionsList) 
	{
		if (element.height >= minHeight) x++;
	}
	Resolution[] pureArray = new Resolution[x];
	x = 0;
	foreach (Resolution element in resolutionsList)
	{
		if (element.height >= minHeight)
		{
			pureArray[x] = element;
			x++;
		}
	}
	resolutionsList = new Resolution[pureArray.Length];
	for(int i = 0; i < resolutionsList.Length; i++)
	{
		resolutionsList[i] = pureArray[i];
	}
}

Собственно вот и всё.

Тестируется не в редакторе, а непосредственно в самом приложении, после его сборки.

Скачать демо сцену:

Внимание! Посетители, находящиеся в группе Гости, не могут скачивать файлы.

Комментариев 1

Офлайн
CompanyBolt 31 марта 2017
Привет, как сделать также но не с разрешением экрана, а качества текстур?
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
  • Яндекс.Метрика