Разрабатываем меню в Unity3D (Создание базовой части) [Часть 1]
Здравствуйте уважаемые игроделы. На просторах интернета уроков по созданию игр в Unity3D очень много, но на верхнем слое и направленных новичкам очень мало. В данном серии уроков, я буду расписывать о создании меню игры при помощи стандартного GUI, не использую нестандартные компоненты. Урок направлен для новичков, которые желают научится создавать свое меню в игре.
По окончанию первого урока у вас получится меню игры с работающими кнопками:
В уроке будут использоваться функции: 1) public int - назначение переменной числовым значением 2) GUI.BeginGroup - создание GUI группы 3) GUI.Button - Создание GUI кнопки 4) Debug.Log - вывод сообщения в консоли 5) Application.LoadLevel - загрузка уровня 6) Application.Quit - закрытие игры
Итак, начнем: Шаг 1: Создаем в окне Project C# скрипт и называем его по своему. Шаг 2: Создаем игровую камеру: * На верхнем меню программы нажимаем пункт GameObject * После нажатия появляется выпадающее меню, в нем нажимаем пункт Create Other * В появившемся списке нажимаем на строку с названием Camera и после этого действия в окне Hierarchy появляется объект Camera
Шаг 3: Назначаем объекту Camera скрипт, который создали в первом шаге. Для этого в окне Project находим ваш скрипт, у меня он называется Menu, и перетягиваем его в окно Hierarchy на объект Camera. Чтобы удостовериться в правильности хода нужно: нажать на объект Camera в окне Hierarchy. В окне Inspector вы у объекта увидите такое одержимое:
Если же у вас появилась выделенная на изображении строка с названием вашего скрипта, то сделали вы все правильно.
Шаг 4: Откроем скрипт в редакторе. Для этого нажмите на ваш скрипт двойным нажатием левой кнопки мыши в окне Project. У вас откроется редактор скриптов, в моем случае это MonoDevelop. Открыв редактор, перед вами появится вас скрипт, который будет абсолютно пустой, но с базовым содержанием:
Код
using UnityEngine; using System.Collections; public class Menu1 : MonoBehaviour { // Use this for initialization void Start () { } // Update is called once per frame void Update () { } }
Строка
Код
public class [u]Menu[/u] : MonoBehaviour {
, в замен слова Menu будет содержать название вашего скрипта. Строку трогать и изменять не нужно. По крайней мере в данном уроке.
Шаг 5: Отредактируем скрипт под меню, для этого можно удалить некоторые строки, которые вам не понадобятся в этом уроке:
Код
// Use this for initialization - этот комментарий нам не нужен
// Update is called once per frame void Update () { } - метод Void нам тоже не понадобится
Шаг 6: Наш скрипт подготовлен для создания на нем меню игры. Перед методом void Start создадим переменную для нумерации окон в меню игры. Содержании строки такое:
Код
public int window;
public int - задаем числовое значение переменной window - название переменной, которая будет использоваться в скрипте с числовым значением
Шаг 6: Для правильной работы меню, при старте работы скрипта у нас должно отображаться одно содержимое, для этого в метод void Start добавим стартовое значением переменной window. Весь метод будет выглядеть так:
Код
void Start () { window = 1; }
Метод при старте исполнения скрипта будет назначать переменной window значение 1 [b]Шаг 7: Начнем саму работу с GUI выводом меню, для этого создадим ниже метода void Start, метод в выводом GUI. Выглядеть он будет так:
Код
void OnGUI () { }
Данный метод в программе Unity3D и в вашем создаваемом приложении вызовет вывод графических элементов.
Шаг 8: Чтобы меню отображалось по центру экрана и не приходилось для каждой кнопки рассчитывать местоположение, создадим группу, которая будет выводить свое содержимое по центру экрана:
Код
GUI.BeginGroup (new Rect (Screen.width / 2 - 100, Screen.height / 2 - 100, 200, 200)); GUI.EndGroup ();
GUI.BeginGroup - создаем группу (new Rect - задаем значение, что дальше будут даны данные о расположении самой группы (Screen.width / 2 - 100, - задаем расположение группы относительно ширины экрана Screen.height / 2 - 100, - задаем расположение группы относительно высоты экрана 200 - задаем ширину группы 200 - задаем высоту группы
Значения ширины и высоты можно свои ставить, но чтобы все было по центру аккуратно в Screen.width / 2 - 100, Screen.height / 2 - 100 значение 100 заменяем на свое значение. То есть если же ваша группа будет иметь ширину и высоту 300, то в замен 100 вы должны ввести половину от ширины 300. Вводимое значение будет 150.
Шаг 9: Создаем вывод меню, если переменная window = 1. Для этого, между началом и концом группы, созданной в шаге №8, то есть
Код
GUI.BeginGroup (new Rect (Screen.width / 2 - 100, Screen.height / 2 - 100, 200, 200)); Сюда !!! GUI.EndGroup ();
Напишем выдаваемое значение при window = 1:
Код
if(window == 1) { if(GUI.Button (new Rect (10,30,180,30), "Играть")) { window = 2; } if(GUI.Button (new Rect (10,70,180,30), "Настройки")) { window = 3; } if(GUI.Button (new Rect (10,110,180,30), "Об Игре")) { window = 4; } if(GUI.Button (new Rect (10,150,180,30), "Выход")) { window = 5; } }
if(window == 1) - если windows равно значению 1, то создадим вывод if(GUI.Button (new Rect (10,30,180,30), "Играть")) - создаем кнопку "Играть" {window = 2;} - если нажата кнопка "Играть", то window получит значение 2 С остальными кнопка так же.
Шаг 10: Создадим вывод, если переменная window равно 2
Код
if(window == 2) { GUI.Label(new Rect(50, 10, 180, 30), "Выберите уровень"); if(GUI.Button (new Rect (10,40,180,30), "Уровень 1")) { Debug.Log("Уровень 1 загружен"); Application.LoadLevel(1); } if(GUI.Button (new Rect (10,80,180,30), "Уровень 2")) { Debug.Log("Уровень 2 загружен"); Application.LoadLevel(2); } if(GUI.Button (new Rect (10,120,180,30), "Уровень 3")) { Debug.Log("Уровень 3 загружен"); Application.LoadLevel(3); } if(GUI.Button (new Rect (10,160,180,30), "Назад")) { window = 1; } }
Выводим кнопки, которые доступны при нажатии на кнопку "Играть". Вывод ни чем не отличается о предыдущих кнопок, расшифрую только новые функции: Debug.Log("Уровень 1 загружен"); - Application.LoadLevel(1); - вызываем функцию, которая загружает уровень игры. 1 - можно менять на нужный вам уровень. Числовое значение можно брать, если нажать на сочетании клавиш Ctrl + Shift + B.
Шаг 11: Создаем вывод, если window имеет значение 3:
Код
if(window == 3) { GUI.Label(new Rect(50, 10, 180, 30), "Настройки Игры"); if(GUI.Button (new Rect (10,40,180,30), "Игра")) { } if(GUI.Button (new Rect (10,80,180,30), "Аудио")) { } if(GUI.Button (new Rect (10,120,180,30), "Видео")) { } if(GUI.Button (new Rect (10,160,180,30), "Назад")) { window = 1; } }
В данном шаге новых функций не используется, поэтому просто добавляем. В следующих уроках будет расписано о создании функциональности, для настройки игры.
Шаг 12: Выводим содержимое, если значение у window 4
Код
if(window == 4) { GUI.Label(new Rect(50, 10, 180, 30), "Об Игре"); GUI.Label(new Rect( 10, 40, 180, 40), "Информация об разработчике и об игре"); if(GUI.Button (new Rect (10,90,180,30), "Назад")) { window = 1; } }
Шаг 13: Выводим содержимое, если переменная window имеет значение 5 и нажата кнопка "Выход"
Код
if(window == 5) { GUI.Label(new Rect(50, 10, 180, 30), "Вы уже выходите?"); if(GUI.Button (new Rect (10,40,180,30), "Да")) { Application.Quit(); } if(GUI.Button (new Rect (10,80,180,30), "Нет")) { window = 1; } }
В данном выводе из новых функций, только она: Application.Quit(); - данная функция выключает приложении при нажатии кнопки "Да". P.S. Функция не работает в редакторе Unity3D, она работает только в скомпилированном проекте.
Скрипт готов, если же вы делали все по шагам, то у вас появится меню, которое было показано на изображении вначале.
Код
public class Menu : MonoBehaviour {
public int window;
void Start () { window = 1; }
void OnGUI () { GUI.BeginGroup (new Rect (Screen.width / 2 - 100, Screen.height / 2 - 100, 200, 200)); if(window == 1) { if(GUI.Button (new Rect (10,30,180,30), "Играть")) { window = 2; } if(GUI.Button (new Rect (10,70,180,30), "Настройки")) { window = 3; } if(GUI.Button (new Rect (10,110,180,30), "Об Игре")) { window = 4; } if(GUI.Button (new Rect (10,150,180,30), "Выход")) { window = 5; } }
if(window == 2) { GUI.Label(new Rect(50, 10, 180, 30), "Выберите уровень"); if(GUI.Button (new Rect (10,40,180,30), "Уровень 1")) { Debug.Log("Уровень 1 загружен"); Application.LoadLevel(1); } if(GUI.Button (new Rect (10,80,180,30), "Уровень 2")) { Debug.Log("Уровень 2 загружен"); Application.LoadLevel(2); } if(GUI.Button (new Rect (10,120,180,30), "Уровень 3")) { Debug.Log("Уровень 3 загружен"); Application.LoadLevel(3); } if(GUI.Button (new Rect (10,160,180,30), "Назад")) { window = 1; } }
if(window == 3) { GUI.Label(new Rect(50, 10, 180, 30), "Настройки Игры"); if(GUI.Button (new Rect (10,40,180,30), "Игра")) { } if(GUI.Button (new Rect (10,80,180,30), "Аудио")) { } if(GUI.Button (new Rect (10,120,180,30), "Видео")) { } if(GUI.Button (new Rect (10,160,180,30), "Назад")) { window = 1; } }
if(window == 4) { GUI.Label(new Rect(50, 10, 180, 30), "Об Игре"); GUI.Label(new Rect( 10, 40, 180, 40), "Информация об разработчике и об игре"); if(GUI.Button (new Rect (10,90,180,30), "Назад")) { window = 1; } }
if(window == 5) { GUI.Label(new Rect(50, 10, 180, 30), "Вы уже выходите?"); if(GUI.Button (new Rect (10,40,180,30), "Да")) { Application.Quit(); } if(GUI.Button (new Rect (10,80,180,30), "Нет")) { window = 1; } } GUI.EndGroup (); } }
На данный момент это первый урок, в будущем появятся еще пару, которые научат делать полностью функциональное меню
Также если вы считаете, что данный материал мог быть интересен и полезен кому-то из ваших друзей, то вы бы могли посоветовать его, отправив сообщение на e-mail друга:
Игровые объявления и предложения:
Если вас заинтересовал материал «Разрабатываем меню в Unity3D (Создание базовой части) [Часть 1]», и вы бы хотели прочесть что-то на эту же тему, то вы можете воспользоваться списком схожих материалов ниже. Данный список сформирован автоматически по тематическим меткам раздела.
Предлагаются такие схожие материалы:
Если вы ведёте свой блог, микроблог, либо участвуете в какой-то популярной социальной сети, то вы можете быстро поделиться данной заметкой со своими друзьями и посетителями.
Начинаю с нуля. Неделю лазил по инету, все мозги окончательно заплел, но так и не смог найти ответы на простейшие вопросы. Везде только и начинают кричать "не засерайте сайт, не плодите темы, пошел на ... гугл!". А вот здесь нашел то, что надо! Пусть, как некоторые умники говорят, не все термины правильные - пофиг! Зато все понятно и все работает! Огромное спасибо! Специально зарегистрировался, чтобы отблагодарить!
Ну во первых: статья имеет право жить. Новичкам очень поможет. Во вторых: автор получает заслуженный плюс. Хоть я и пишу на JS. В третьих: не нравится статья - идите лесом. А автор - молодец!
Кажется администрации пора принимать меры против появления на сайте подобных глупых и безграмотных статей, что-то наподобие хабровской песочницы надо сделать, чтобы на страницы сайта попадали только грамотные и правильно отредактированные статьи!
Цитата
В уроке будут использоваться функции: 1) public int - назначение переменной числовым значением 2) GUI.BeginGroup - создание GUI группы 3) GUI.Button - Создание GUI кнопки 4) Debug.Log - вывод сообщения в консоли 5) Application.LoadLevel - загрузка уровня 6) Application.Quit - закрытие игры
Если аффтар считает функцией простое объявление целочисленной переменной, то чему он собирается учить? Да и слог у писателя такой, что даже я закоренелый троечник по русскому языку в шоке!
в общем вывод такой: вскорем времени будет в одном из журналов про игрострой, который распространяется по русскоязычным странам, будет написана статья о сайте, благодаря вам двум тролям, она будет испорчена, спасибо за внимание.
Нет, чувак,, пожалуйста, не надо! Я прошу тебя, мне это очень важно. Я не смогу пережить такого позора, ведь чужой сайт там засрут благодаря мне, и это прочтут миллионы людей!
Да он постоянно сам себе противоречит постоянно. Мне в ЛС написал, что понижать репутацию в ответ на что-то - выходка школоты, однако сам понижает репутацию в ответ на моё сообщение, лол.
если бы так все было бы просто, но увы, одноклассников нет, так как это уже в прошлом. А вот понятие в данном портале одно: за анализ портала 4 мя годами, здесь кроме тролей, таких как вы, которые обычным пользователям не помогут статьями, зная и умея в данной сфере, но обтролить спокойно смогу.
ну а что, конечно легко сказать, а если на портале есть пользователи, которые ищут подобные статьи. Если же вы знаете, то почему ближнему не поможете, написав статью полезную. Дак нет, ваше дело критика и троллинг, помощь убираем в сторону, в общем каждый сам за себя