Скрипт простого меню для вашей игры

Прежде всего, эта статья будет полезна тем, кто только начинает изучать Unity и хочет сделать меню для своей игры. Ранее мы выкладывали проект игрового меню, которое уже было полностью готово к использованию и оформлено графически. Но данный вариант несколько проще, отлично подойдет для игр, где не нужно менять клавиши управления. Кроме того, в отличии от предыдущего меню, вместо сохранения настроек в файл, тут мы будем работать со стандартной системой сохранения. Основные функции: изменение разрешения экрана и пресетов качества изображения, регулировка громкости музыки/звуков. Так сказать, лайт версия.

Создаем новый C# скрипт GameMenu, и в самом вверху, сразу подключаем UI:

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

Займемся переменными.
Нам понадобится пара переменных для управления громкостью, плюс еще одна, с помощью которой мы сможем сообщать другим скриптам о том, активно наше меню или нет:

public static bool isMenu;
public static float soundValue;
public static float musicValue;

Для элементов UI:

public Scrollbar music;
public Scrollbar sound;
public Toggle screenMade;
public Text resolutionsText;
public Text qualityText;

Чтобы добавить нужный объект, идем по адресу GameObject -> UI ->, затем просто перетащить в скрипт, в соответствующее поле. Вывод текста, например разрешение (resolutionsText), нужно добавить Button, и использовать текстовый элемент, который вложен в кнопку, потому как сама кнопка необходима для переключения разрешения. Тоже самое касается qualityText.

Включение и отключение меню:

public GameObject[] allUI;
public GameObject startMenu;

В startMenu указывается начальное меню, то есть то, которое игрок увидит при нажатии клавиши Escape. А в массив allUI добавить все остальные разделы меню, если они есть, и стартовое тоже.

Список разрешений экрана и пресетов качества графики:

private Resolution[] resolutionsList;
private string[] qualityList;
private bool isFullScreen;
private int resolutions_id;
private int quality_id;

Будут добавлены все разрешения, которые поддерживает монитор в полноэкранном режиме (не работает в редакторе, надо делать сборку). Пресеты настроек графики меняются по адресу Edit -> Project Settings -> Quality.

Итак, старт сцены:

void Start ()
{
	qualityList = QualitySettings.names;
	resolutionsList = Screen.resolutions;
	quality_id = QualitySettings.GetQualityLevel();
	resolutions_id = 0;
	for(int i = 0; i < resolutionsList.Length; i++)
	{
		if(resolutionsList[i].height == Screen.height && resolutionsList[i].width == Screen.width) resolutions_id = i;
	}
	if(!Screen.fullScreen) isFullScreen = false; else isFullScreen = true;
	foreach(GameObject obj in allUI)
	{
		obj.SetActive(false);
	}
	
	DefaultSettings();
}

Заполняем массивы и определяем ID, для вспомогательных переменных. После, идет функция, где для всех необходимых переменных, указываются значения по умолчанию.

void DefaultSettings()
{
	soundValue = 1;
	musicValue = 0.5f;
	LoadSaveSettings(false);
}

void LoadSaveSettings(bool isSave)
{
	bool load = true;
	if(!isSave)
	{
		if(PlayerPrefs.HasKey("soundValue")) soundValue = PlayerPrefs.GetFloat("soundValue"); else load = false;
		if(PlayerPrefs.HasKey("musicValue")) musicValue = PlayerPrefs.GetFloat("musicValue"); else load = false;
	}
	if(!load || isSave)
	{
		PlayerPrefs.SetFloat("soundValue", soundValue);
		PlayerPrefs.SetFloat("musicValue", musicValue);
	}
	
	Ready();
}

Когда значения установлены, переходим в функцию загрузки или сохранения. Логика работы следующая: чтобы загрузить данные из реестра пишем LoadSaveSettings(false); если данных нет или частично отсутствуют, происходит сохранение значений по умолчанию; для того чтобы просто сохранить текущие настройки пишем LoadSaveSettings(true);

После определения всех переменных, применяем значения к элементам меню:

void Ready()
{
	qualityText.text = qualityList[quality_id];
	resolutionsText.text = resolutionsList[resolutions_id].width + "x" + resolutionsList[resolutions_id].height;
	screenMade.isOn = isFullScreen;
	music.value = musicValue;
	sound.value = soundValue;
}

Пишем Вкл/Выкл для менюшки:

void OnApplicationQuit()
{
	LoadSaveSettings(true);
}

void Update ()
{
	if(Input.GetKeyDown(KeyCode.Escape) && !isMenu) Lock();
	else if(Input.GetKeyDown(KeyCode.Escape) && isMenu) UnLock();
}

void Lock()
{
	Time.timeScale = 0;
	startMenu.SetActive(true);
	isMenu = true;
}

public void UnLock()
{
	Time.timeScale = 1;
	isMenu = false;
	LoadSaveSettings(true);
	foreach(GameObject obj in allUI)
	{
		obj.SetActive(false);
	}
}

Функция OnApplicationQuit выполняется перед закрытием приложения, то есть, делаем авто сохранение.

Публичные функции, к которым будем обращаться через UI:

public void AppQuit()
{
	Application.Quit();
}

public void SetScreenMode(bool mode)
{
	isFullScreen = mode;
}

public void SoundScrollBar(float value)
{
	soundValue = value;
}

public void MusicScrollBar(float value)
{
	musicValue = value;
}

public void NextResolutionsID()
{
	if(resolutions_id < resolutionsList.Length-1) resolutions_id++; else resolutions_id = 0;
	resolutionsText.text = resolutionsList[resolutions_id].width + "x" + resolutionsList[resolutions_id].height;
}

public void NextQualityID()
{
	if(quality_id < qualityList.Length-1) quality_id++; else quality_id = 0;
	qualityText.text = qualityList[quality_id];
}

public void ApplySitting()
{
	QualitySettings.SetQualityLevel(quality_id, true);
	Screen.SetResolution(resolutionsList[resolutions_id].width, resolutionsList[resolutions_id].height, isFullScreen);
	LoadSaveSettings(true);
}

Для Scrollbar и Toggle, нужно указывать динамический параметр, например:


Остальные, просто указать функцию кнопке: AppQuit - выход; NextResolutionsID - переключение разрешения экрана; NextQualityID - переключение пресетов графики; ApplySitting - применить настройки.

Финальный штрих, настроить приложение, при первом запуске. Отключить полноэкранный режим, вписать разрешение, и спрятать встроенное меню. Делается это по адресу Edit -> Project Settings -> Player:

Скрипт простого меню для вашей игры

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

Офлайн
login098 14 июня 2018
Где скачать?
Офлайн
Light 15 мая 2017
lolgad, нужно обновляться до актуальной версии.
Офлайн
lolgad 15 мая 2017
у меня работает только unity 4.3.0 и в ней нет UI в GameObject --> UI.

подскажите где мне найти данный элемент.
Офлайн
ABredin 9 мая 2017
Полезно) Спасибо)
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
  • Яндекс.Метрика