Pull to refresh

Imagine Cup 2014 или первый опыт создания игры

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

Спасибо за прочтение.
Удачи.
Tags:
Hubs:
+16
Comments4

Articles

Change theme settings