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’ов, которые были брошены своими хозяевами в виду различных причин. Ребята, не бросайте свои проекты — они уникальны, и ваша задача довести их до логического конца.

Спасибо за прочтение.
Удачи.

ссылка на оригинал статьи http://habrahabr.ru/post/222435/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *