[Из песочницы] Imagine Cup 2014 или опыт создания игры своими глазами
Девять месяцев назад у меня начался 2 курс университетской жизни: занимался спортом, учился, но не было никакой работы или большого увлечения, за которыми я бы проводил много времени, разве что видео игры.Но спустя пару месяцев узнал, что у нас на кафедре работают ребята над созданием своих собственных игр. Я был заинтересован, ведь это было круто, наплыло сразу столько вопросов и идей в голове: «Как они это делают? А я ведь и сам хотел бы сделать свою игру. Как работает команда при создании игры? Как поддерживать атмосферу?» и т.д.
Когда посмотрел на то, что они уже сделали, не думая, написал одному из ребят в социальной сети, он был преподавателем по программированию, поэтому я был с ним знаком. Я долго ждал ответа и дождался, мы около часа разговаривали: заваливал его интересующими меня вопросами, а он охотно на них отвечал, это чувствовалось. Наконец я сказал: «Я ХОЧУ ДЕЛАТЬ ИГРЫ С ВАМИ! Возьмёте меня к себе? Я умею программировать!», на что он сказал, что они подумают с командой и примут решение. Не прошло и двух дней, как мне сказали: «Мы берём тебя!», я был очень доволен.
И вот уже через несколько дней мы все собираемся в уютной кафешке в центре города для того, чтобы обсудить план своих действий, текущие наработки и идеи. Я с увлечением смотрел на то, как они все обсуждают, показывают рисунки различных прототипов — все это было для меня новым и очень увлекательным. Мы решили, что будем работать на новом для нас игровом движке Unity3D, потому что он мультиплатформенный и постоянно растёт функционально. Решение было вполне аргументировано, ребята ранее работали с множеством других аналогов и даже писали свой движок на основе XNA. Мне ничего не оставалось, как согласиться.
Долгое время пришлось осваивать базовые функции и операции в Unity. Но постепенно все встало на свои места и начались получаться первые наработки.
Изначально я научился создавать 3D-местности: задаёшь размеры для плоскости, а затем на ней вырисовываешь различными кисточками горы и впадины. Можно создать очень реалистичный рельеф, затем наносишь текстуры, создаёшь воду, небо, солнце, и твой маленький виртуальный мир готов. Сначала я не мог поверить, что все так просто. Постепенно круг моих задач рос: работа с камерами, создание управления…
Очень нравилось то, что в команде была дружеская атмосфера, в которой была возможность легко обсуждать различные вопросы, принимать решения, вводить коррективы и просто общаться, несмотря на то, что я с ребятами был совсем не знаком ранее.
Но, в конце концов, мы пришли к тому, что игра потребует очень много времени, сил и средств, поэтому мы решили «заморозить» текущий проект игры и начали думать над созданием новой, более «реальной» для нашего текущего уровня в разработке.
Ну вот что у нас получилось:
Для реализации новой игры с кодовым названием «Искра» мы решили пополнить свой состав ещё двумя замечательными ребятами, на этом процесс формирования команды был закончен, и выглядела команда примерно так: • Руководитель проекта, видеоредактор и мастер анимации; • Художник со своей непередаваемой манерой работы с графикой; • Разработчик пользовательского интерфейса и social network, собственно я; • Программист игровой логики, у нас его называют «Программист от Бога»; • 3D-моделер, с потрясающим опытом в данной области.
На дворе был холодный январь 2014 года, и наша команда начала свой новый нелёгкий путь по реализации своей задумки. Мы старались как можно чаще собираться вместе, в основном мы работали на кафедре нашего университета, там было хорошее помещение, плюс за это не приходилось платить, что было для нас идеально. Процесс создания игры был и интересным, и очень тяжёлым, так как приходилось осваивать новые дополнительные программы и различные функции игрового движка, что давалось очень тяжело в первое время, но потом это превращалось в увлекательное создание того, что было задумано, и у нас стало все получаться. Мы чувствовали то, как наша скорость написания игры растёт, мы не успевали придумывать что-то новое, как реализация уже давала о себе знать. В такой хорошей атмосфере мы проработали примерно 2 месяца, мы закончили demo-игру c одним полноценным уровнем — исследовательской локацией, мы были очень довольны и не думали останавливаться. Очень запомнилось то как писал пользовательский интерфейс для клавиатуры и джойстика под NGUI. Я пришел к крайне оригинальному и «идеальному» решению: для каждой кнопки я создавал 3 спрайтовых состояния (нормальное, наведенное, нажатое), между которыми происходило переключение при определенных нажатиях клавиш, также каждая кнопка несла в себе определенную функцию, что логично — самое главное, что все это работает прекрасно.
Код GUI (только для клавиатуры): void Start () { //Стартовая активность панелей между которыми происходит переключение (пауза-продолжить) buttonInputMenu.SetActive (true); buttonsMapMenu.SetActive (false);
//Счетчик текущего меню ставим на 1 (InputMenu) int currentMenu = 1; //Счетчик текущей активной кнопки int currentButton = 1; } void Update () { //Действия при отпускании клавиши Esc, когда активно InputMenu if (Input.GetKeyUp (KeyCode.Escape) && currentMenu == 1) { //Переключение состояний кнопок buttonMenuNormal.SetActive (true); buttonMenuHover.SetActive (false); buttonMenuClick.SetActive (false);
buttonContinueNormal.SetActive (false); buttonContinueHover.SetActive (true); buttonContinueClick.SetActive (false);
//Переключение InputMenu на MapMenu buttonInputMenu.SetActive (false); buttonsMapMenu.SetActive (true);
//Переключение счетчика, который содержит инфорамция о том какая панель меню активна в данный момент currentMenu = 2; }
//Действия при отпускании клавиши Esc, когда активно MapMenu else if (Input.GetKeyUp (KeyCode.Escape) && currentMenu == 2) { //Переключение панели MapMenu на InputMenu buttonInputMenu.SetActive (true); buttonsMapMenu.SetActive (false);
//Переключение счетчика текущего меню currentMenu = 1; }
//Действие при нажатии клавишы ESC, когда активно InputMenu if (Input.GetKeyDown (KeyCode.Escape) && currentMenu == 1) { //Переключение состояний клавиш, происходит эффект анимации buttonMenuNormal.SetActive (false); buttonMenuHover.SetActive (false); buttonMenuClick.SetActive (true); }
//Обработка переключений кнопок в MapMenu if (currentMenu == 2) { //При нажатии стрелки вниз if (Input.GetKeyDown (KeyCode.DownArrow) && currentButton == 1) { //Переключение состояний buttonContinueNormal.SetActive (true); buttonContinueHover.SetActive (false); buttonContinueClick.SetActive (false);
buttonBackMainMenuNormal.SetActive (false); buttonBackMainMenuHover.SetActive (true); buttonBackMainMenuClick.SetActive (false);
//Переключение счетчика текущей кнопки currentButton = 2; }
//При нажатии стрелки вверх if (Input.GetKeyDown (KeyCode.UpArrow) && currentButton == 2) { //Переключение состояний кнопок buttonContinueNormal.SetActive (false); buttonContinueHover.SetActive (true); buttonContinueClick.SetActive (false); buttonBackMainMenuNormal.SetActive (true); buttonBackMainMenuHover.SetActive (false); buttonBackMainMenuClick.SetActive (false);
//Переключение счетчика текущей кнопки currentButton = 1; } }
//Обработка переключения и активности кнопок при нажатии Space if (currentMenu == 2) { //При нажатии любой кнопки происходит ее анимация, за счет смены текущего состояния //Также происходят действия Continue и MainMenu, при отпускании к нажатой клавишы // if (Input.GetKeyDown (KeyCode.Space) && currentButton == 1) { buttonContinueNormal.SetActive (false); buttonContinueHover.SetActive (false); buttonContinueClick.SetActive (true); }
if (Input.GetKeyDown (KeyCode.Space) && currentButton == 2) { buttonBackMainMenuNormal.SetActive (false); buttonBackMainMenuHover.SetActive (false); buttonBackMainMenuClick.SetActive (true); }
if (Input.GetKeyUp (KeyCode.Space) && currentButton == 1) { buttonContinueNormal.SetActive (true); buttonContinueHover.SetActive (false); buttonContinueClick.SetActive (false);
Continue (); }
if (Input.GetKeyDown (KeyCode.Space) && currentButton == 2) { buttonBackMainMenuNormal.SetActive (true); buttonBackMainMenuHover.SetActive (false); buttonBackMainMenuClick.SetActive (false);
MainMenu (); } } С данной игрой мы решили попробовать поучаствовать в конкурсах GamesJamKanobu и ImagineCup.Участвуя в GamesJamKanobu, мы хотели показать наше творение людям, получить качественный feedback от игроков и гуру игровой индустрии, и продолжить параллельно разработку с корректировками багов и внесением пожеланий в игру. Почти каждый день мы делали новый build для нашего сайта, где любой желающий мог поиграть в неё и также поделиться своим мнением. В итоге мы заняли 3 место в номинации «Рабочая версия», чем были удивлены, ведь на конкурс было подано почти 500 игр и все они были по-своему прекрасны.
Screenshot исследовательской локации: После такой замечательной победы мы добавили ещё один уровень — runner, вдохновение мы черпали из таких игр, как Raymond Legends, Audio Surf и Guitar Hero. И вновь у нас получилось то, что мы хотели и на этот раз: уровень был собран за 2 недели, что было для нас показателем роста.Screenshot скоростного-музыкального режима (Runner«а): Уже с новой demo пошли на ImagineCup, к которому мы готовились очень серьёзно, мы даже купили командную форму: брюки, рубашка и жилетка с фирменной нашивкой, которую мы сами сделали. Теперь по нам было видно, что мы команда, это было бы понятно даже в толпе. На кураже мы выиграли региональный финал, где был получен очень значительный опыт в выступлении и замечательные рекомендации от судей. Следующим шагом была подготовка и поездка в Москву на Российский Финал, на этот раз мы решили сконцентрировать своё внимание на содержании и подаче презентации, что нам удалось. На финале мы привлекли большое количество наших потенциальных игроков, которым очень понравилась наша игра, особенно уровень с «виртуальной реальность» с использованием OculusRift. По решению судей мы заняли первое место в номинации «Игры». Победа открыла нам ещё несколько потенциальных возможностей, над реализацией которых мы сейчас работаем.Общая фотография с Imagine CupRussia: На этом моя небольшая история заканчивается ввиду отсутствия новых событий и информации.Эта статья написана для начинающих разработчиков, как мы, с целью мотивации, поднятия духа. За полгода я увидел множество хороших проектов — потенциальных startup’ов, которые были брошены своими хозяевами в виду различных причин. Ребята, не бросайте свои проекты — они уникальны, и ваша задача довести их до логического конца.
Спасибо за прочтение.Удачи.