![](https://habrastorage.org/getpro/habr/upload_files/d64/9aa/5f3/d649aa5f3f72ab2f0943955707dc2ac6.jpg)
Всем привет, это Денис Вебер.
Думаю, что каждый человек, когда-либо игравший в игры, хоть раз задумывался о том как они устроены. В этот раз я решил примерить на себя роль разработчика и попробовать создаю свою первую в жизни игру.
Как обычно, специально для тех, кому больше нравится формат видео, а не текст, видео я оставлю в конце статьи.
Если во времена первых компьютеров и консолей создавать игры могли лишь на студиях с мощным оборудованием и какими-то нереальными умениями, то сейчас создание игр доступно куда большему количеству людей. И обычный программист, в одиночку собрав на коленке игру за один вечер может уже на следующий день стать знаменитым по всему миру.
![](https://habrastorage.org/getpro/habr/upload_files/269/fee/6ae/269fee6aece751c49e790dbe871eb75d.png)
Как сейчас помню, во времена расцвета браузерных и флэш игр я первый раз поймал себя на мысли, что точно хочу создать что-то своё.
![](https://habrastorage.org/getpro/habr/upload_files/6d2/ca5/640/6d2ca56403ac2bee730c9a0129104c50.png)
Можно подумать, что мои попытки написать пару строчек кода в кадрах программы Macromedia Flash привели меня к успешной и счастливой жизни разработчика игр, но это не так. Передвигать объекты и отслеживать нажатие кнопок было для меня конечно круто, но на этом всё и закончилось. Ну, а снова к созданию игр я подошёл только сейчас.
![](https://habrastorage.org/getpro/habr/upload_files/13d/7a0/305/13d7a0305d8054e78b2c403d154b4dc8.png)
У себя на канале, да и в жизни я занимаюсь созданием 3д графики и анимации, но в один день подумал, а почему бы не попробовать оживить графику, которую я создал. А мысль о том, что графика для игры уже готова только грела мой интерес.
![](https://habrastorage.org/getpro/habr/upload_files/df5/3f2/542/df53f25425d6388ae1712800a0399d5c.png)
Прелесть создания игр в том, что разработчик может создать вообще всё что угодно. Ну или по крайней мере то, на что у него хватит ума и сил.
Не буду скрывать, у меня уже был некоторый опыт программирования. Я создавал приложение для Android и немного писал код для Unity. Но полноценную игру я не пробовал делать никогда.
![](https://habrastorage.org/getpro/habr/upload_files/d5e/cf4/98f/d5ecf498f983a5afaf84cccadcef478a.png)
Я решил выбрать один из трёх своих проектов. И выбор пал на Super Mario Brosthers 3. В этой игре достаточно простая механика, минимум анимации и интуитивно понятное управление. И делать я её решил конечно в 3д.
![](https://habrastorage.org/getpro/habr/upload_files/4c7/38f/90a/4c738f90af3a0491d24a94457d20fd83.png)
Так как я никогда не разрабатывал игры, то иногда мне было ой как непросто. Но обо всё по порядку.
Как я и говорил, у меня был какой-никакой опыт работы в Unity и опыт написания кода на языке C#. Но, в общем, это всё, что мне могло помочь. Я решил начать с простого: подготовить графику для загрузки в движок.
Несмотря на то, что вся графика была готова, мне всё равно пришлось многое доделывать и переделывать. Где-то была неподходящая геометрия или размеры, а в других местах путаница с материалами.
![](https://habrastorage.org/getpro/habr/upload_files/a7e/5b0/315/a7e5b0315ecf6c4ad2d8342e89f47b8f.png)
Если раньше научиться программированию во Flash можно было по книгам, то теперь всё то же самое, а то и больше делает для нас YouTube.
![](https://habrastorage.org/getpro/habr/upload_files/2db/ea3/412/2dbea3412d74c2421bb7cdbf1e269471.png)
Я начал понемногу расставлять объекты на сцене и даже добавил камеру.
Если вы играли в Марио с 3д графикой после классических платформеров, то могли ощущать какое-то чувство неудобства. Разработчики переносили Марио в 3д, но вся атмосфера почему-то тут же пропадала.
![](https://habrastorage.org/getpro/habr/upload_files/6c1/20e/c63/6c120ec632a0ccd4f7d59cb9d9fa713c.png)
Поэтому я решил, что все объекты будут в 3д, но сама игра всё-таки должна походить на классическую версию, с камерой, которая передвигается по одной траектории. Соответственно и сам Марио будет передвигаться только влево и вправо. Можно будет придумать как дать Марио запрыгнуть на эти большие блоки, но оставлю это на потом.
![](https://habrastorage.org/getpro/habr/upload_files/29a/283/6e1/29a2836e1ac220a08db77776dc6f8367.png)
Как вы увидите чуть позже, свет и текстуры играют важную роль в восприятии игры. И нужно будет постараться, чтобы правильно настроить их в Unity.
Вот и я перешёл к своему первому опыту программирования игр. Я создал растянутый куб и решил, что сейчас он сойдёт за Марио. Воображение в разработке играет не меньшую роль, чем сама графика.
![](https://habrastorage.org/getpro/habr/upload_files/d82/699/ccc/d82699cccaaa14be4c42cc718b5ee068.png)
Для разных объектов в Unity создаются разные скрипты. Например, скрипт камеры будет описывать как должна передвигаться камера, а скрипт игрока... ну вы поняли.
![](https://habrastorage.org/getpro/habr/upload_files/711/e47/62e/711e4762ea0d5a758054679fc15604bc.png)
Я создавал игру, в том числе, с помощью обучалок на YouTube, но как можно догадаться, готовых решений для моей игры в интернете конечно же нет. Есть какие-то базовые вещи типа передвижения и слежения камеры, но в программировании приходится из большого количества кусков собирать что-то своё, да так, чтобы это всё ещё и правильно работало.
![](https://habrastorage.org/getpro/habr/upload_files/314/1a9/9dc/3141a99dcd9d4cd3191d79df74eeda4f.png)
Коллизии или столкновения ещё одна важная часть всех 2д и 3д игр. К объекту привязывают коллайдер, который реагирует на столкновения и, например, даёт знать программисту, что игрок упал в яму или задел противника.
![](https://habrastorage.org/getpro/habr/upload_files/036/b20/1db/036b201db3b142ca91b6e91c569c070d.png)
Вообще в игровом движке типа Unity очень много полезных штук, которые облегчают жизнь разработчику. Например, здесь есть гравитация, которая может действовать сразу во всей игре.
Как и в 3д, разработчикам игр бывает полезно посмотреть референсы, поэтому я открыл эмулятор оригинальной игры и какое-то время поиграл в него, пытаясь уловить непонятные мне раньше моменты.
![](https://habrastorage.org/getpro/habr/upload_files/9df/c9e/bf7/9dfc9ebf7ce0961a5f8ed055933ee1f5.png)
Пока игра больше похожа на бюджетную версию Geometry Dash с кубами в качестве героев, но совсем скоро я импортирую модельки и добавлю для них анимацию.
![](https://habrastorage.org/getpro/habr/upload_files/d94/b74/22b/d94b7422b205a06a88d09fe17a7c333e.png)
В кубах со знаком вопроса хранятся бонусы. Для тех, кто уже играл в оригинальную игру это не самый большой секрет. Пока я пытался настроить взаимодействие кубов с игроком получилось такое безумие или если говорить по-другому - ещё одна идея для новой игры.
![](https://habrastorage.org/getpro/habr/upload_files/19e/865/a6f/19e865a6f26cfe36bf56f6ee3680634a.png)
На самом деле, несмотря на схематичность геймплея, игра понемногу начинает обрастать своей механикой.
Думаю, что многое из того, что я делал можно повторить гораздо более удобными и менее затратными способами. Например, для того, чтобы показать анимацию выбивания куба, мне пришло в голову добавить пустой куб и при ударе прятать куб с вопросом, оставляя пустой на сцене. Возможно не слишком элегантно, зато работает.
![](https://habrastorage.org/getpro/habr/upload_files/f81/4be/f6e/f814bef6eea81663016457d03d668b53.png)
Монетки в игре играют достаточно большую роль. С помощью них Марио получает новые жизни и очки. Пара строчек кода и анимация кручения и сбора монеток готова.
![](https://habrastorage.org/getpro/habr/upload_files/d28/44b/3bf/d2844b3bffd029237b9a5ae213d681b6.png)
Для 8битной игры врагов здесь действительно много. Только в первом уровне их целых шесть видов. Я решил ограничиться всего тремя, но для начала их вполне хватит.
Цветок вылезает из трубы и плюётся огненным шаром.
Я написал таймер, который заставляет врага появляться и исчезать бесконечное количество раз.
![](https://habrastorage.org/getpro/habr/upload_files/fc9/f51/b06/fc9f51b062054ce17cae75fd975fd2f3.png)
Сложнее было с тем, чтобы цветок следил за главным героем и стрелял точно в его сторону. Но я повозился с кодом несколько часов и наконец всё получилось.
Для прошлого видео я не создавал модельку Марио, поэтому в этот раз пришлось делать и её. Я не повторял все модели из игры точь-в-точь, только, скажем так, вдохновлялся оригинальным артом. Будем надеяться, что Нинтендо закроет на всё это глаза.
![](https://habrastorage.org/getpro/habr/upload_files/a3e/b21/e4b/a3eb21e4befd28dec2d3be784d14b51c.png)
В будущем, можно будет, например, сделать местный магазин скинов и за монетки, собранные в игре, продавать для Марио новую одежду или даже усы. Должно получится интересно.
Я добавил в Blender анимации бега и прыжка и отправил Марио прямиком на сцену игры.
![](https://habrastorage.org/getpro/habr/upload_files/5e6/d58/711/5e6d58711c915c83dae8d215293bb5cc.png)
Настроить анимацию в Unity ещё та задача. Даже для человека, который уже долгое время работает в 3д программе и настраивает анимацию в ней. Здесь всё совсем по-другому. Большую часть времени всего создания игры ушло именно на добавление и редактирование анимации. И последний найденный баг был именно в анимации. Уверен, что вы, поиграв, без проблем найдёте ещё десяток багов.
![](https://habrastorage.org/getpro/habr/upload_files/66d/4a3/b1c/66d4a3b1c63d73ca2ecfa38ad27c39e0.png)
Один из самых узнаваемых врагов всей серии Марио - это конечно же Гумба. Я до сих пор не понимаю кто это, но Гумба по-прежнему напоминает мне сову.
![](https://habrastorage.org/getpro/habr/upload_files/f39/c25/f2d/f39c25f2dc27e202dcd3d569bb32c66b.png)
Марио прокачивается, когда съедает гриб. Можно было просто увеличить в размерах модельку, но я решил, что кроме роста, он должен чуть быстрее бегать и выше прыгать. В этом же уровне, в оригинальной игре, он может собрать листок и надеть летающий костюм. Я конечно хотел создать игру, близкую к оригиналу, но для самого первого опыта и такого Марио будет вполне достаточно.
![](https://habrastorage.org/getpro/habr/upload_files/d71/85f/a66/d7185fa667acc4e78cf200502aa7e77e.png)
Код для других врагов местами был похож на код для Гумбы. Обычная Купа кроме смерти после одного удара, может быть использована ещё раз, чтобы забрать с собой кого-нибудь ещё. Как-то слишком жестоко для детской игры. Я создал модельку панциря и оставалось только написать для неё код.
![](https://habrastorage.org/getpro/habr/upload_files/734/582/604/73458260475b87fc03be8c446f4e1612.png)
Большая часть кода была написана и я решил немного разнообразить уровень, добавив задний фон и прикрутив к нему эффект параллакса. Это когда задний фон движется с немного другой скоростью, чем картинка на переднем фоне.
![](https://habrastorage.org/getpro/habr/upload_files/650/aef/004/650aef0044569d912eb373d344aa179c.png)
И последний штрих из основной механики - бонусная коробка в самом конце уровня. В ней поочерёдно мигают иконки, которые игрок может выбить. Выбив три одинаковых иконки, Марио получает бонус. Всегда знал как выбить звезду и заработать максимальное количество жизней.
![](https://habrastorage.org/getpro/habr/upload_files/dc7/d52/185/dc7d5218569c781a1aff0ec194839d61.png)
А теперь бесконечный поиск багов. Хочется показать сразу на сто процентов рабочую версию игры, но с первого раза такое никогда не получится. Я в любом случае рад, что смог создать свою первую в жизни игру. В неё уже сейчас можно поиграть, скачав по ссылке под видео, в моём телеграм канале.
![](https://habrastorage.org/getpro/habr/upload_files/ed7/fc0/eda/ed7fc0eda42b9afa45cc204a24006808.png)
Пусть она ещё не идеальна, но зато она доделана. У меня на примете полно фишек, которые можно добавить в игру, и если вам будет интересно, то я обязательно продолжу этот проект.
Напишите и вы, если найдёте новый баг. Или может быть у вас есть идея, которая точно должна быть здесь реализована.
Кто знает, может моим следующим проектом станет игра по мотивам Battletoads.
![](https://habrastorage.org/getpro/habr/upload_files/0ea/852/326/0ea852326aa37407675d5da2a072e5fc.png)
Какое-то время назад и я понятия не имел что значит быть разработчиком игр. И если вы чего-то действительно захотите, всё что нужно - это упорство.
Оригинальное видео: