Привет, Хабр. Я разработчик игр на Unity (как-то низко прозвучало) и хотел бы рассказать об этапах разработки моей первой игры. История берёт начало 2 года назад, когда я решил попробовать делать игры. Начинал с гайдов на ютубе. После, создав пару примеров, приложений и мини-игр, я решил создать полноценную игру. Естественно я представлял настоящий эпик, сюжет и настоящие 10 из 10. Мои амбиции были безграничны, но я не знал, что ждёт меня впереди.
Самый первый вопрос, который я задал себе это выбор платформы публикации. Выбор платформы я делал по ценам или методом исключения: в Steam 100$ за игру, на IOS 100$ в год, выбор пал на Android. Заплатил 25$ в Google Play, получил аккаунт и началась разработка.
Я решил опираться на самые сильные и простые стороны движка. Лучше всего для этого подходила 2D физика, на её основе я и решил построить игру.
Но что это будет, в чём концепция? Я решил пойти за вдохновением на ютуб и нашёл ролик о том, как сделать генерацию уровней из пиксельных картинок. Я захотел так же.

То, что я переписал
Переписал систему, нарисовал уровень и протестировал генерацию. Подумал: «А что дальше?». И вдруг — озарение. Идея пришла мгновенно и пазл сложился воедино. Почему бы игроку не быть шариком, а управлять дать ему гравитацией? «Отличная идея» — подумал я и начал творить геймплей.
После передо мною встала задача: каким образом игрок будет управлять красным шариком. Вариантов за всё время разработки я напридумывал всего 4:
1) Радиусный
Игрок касался бы экрана, ставя точку отсчёта, относительно дальнейшего движения пальца гравитация менялась. Сила зависила от дальности точки отсчёта, а направление от угла между ними.
2) Фиксированный радиусный
То же, что и Радиусный, только точка отсчёта находилась бы строго в центре экрана
3) Двухсторонний (нажатие)
При нажатии на левую или правую часть экрана можно было повернуть «гравитацию» вместе с камерой на определённое количество градусов влево или вправо соответственно.
4) Двусторонний (зажатие)
Тот же принцип что и у Двустроннего (нажатие), только необходимо было зажимать и вращение происходило с фиксированной скоростью.
1 и 2 я сразу же отмёл из-за их сложности понимания и неинтуитивно понятного управления. Для мобильной игры не подходило. Но, к сожалению, 4 мне пришёл в голову на этапе постпродакшна, пришлось брать 3. Скажу честно, очень плохое решение (серьёзно, не надо так). У этого управления было два катастрофических недостатка.


Да и сейчас бы исправить так просто не получилось бы, не переполошив форумы и документацию. Когда я захотел хотя бы попробовать исправить баг, я не стал, так как менять гемплей было нельзя. Переделка управления под 4 тип испортило бы готовые 80% контента, заточенные под 3 тип управления.
Ещё из-за этого 1 проблема резко обострилась, теперь даже меня начало укачивать. Видимо я постарался на славу, правда не в том чего хотел. «Ну да ладно» — подумал я и продолжил продакшн дальше.
Я начал программировать ассеты головоломок, и на это у меня ушло немало времени. Целых 2 месяца я потратил на разного рода объекты и скрипты для их взаимодействия. Уровни представляли из себя простые bit-map текстуры с отчётливыми пикселями, цвет которых обозначал свой блок.
В основном все ассеты контактировали через OnTriggerEnter2D и теги. Даже сейчас догадаться не могу, на что ушло у меня около месяца. Меню заняло второй месяц от части из-за того, что я не использовал циклы, а активность всех 500 объектов регулировал через Awake, из-за этого я наплодил более 2500 строк кода.

«Твоя игра уже надоела, сделай другую» — говорили друзья, но я всё равно продолжал. Я запланировал 100 уровней. На их создание ушло 4 месяца. Создавал я их параллельно вместе с технической частью. В итоге мой план по уровням «заставляющие думать» получился почти никак. Я таких уровней могу назвать от силы штук 10 — 15, остальные были сложны другим. Они были сложны наличием узких коридоров, сложностью ориентации в пространстве, абсолютно мазахисткими дизайнерскими решениями и, конечно же, минами с лабиринтами. Но за их создание отвечал уже не я. Мои «наёмные работники» создали в общем около 60% контента игры.
Из-за того что уровни мы проектировали по правилам, уровни вышли проходимыми в теории, но на практике теория не проверялась. Сделав все уровни, я понимал, что может произойти со моей игрой, а именно абсолютный диссонанс от лагающих до непроходимых уровней, из-за которых не получилось бы пройти игру. Так и осталось.
Также я не забыл про графику, но над ней я работал 2 часа, затем больше вообще не прикасался. Поскольку я криворукий и лучшее что я рисовал в Photoshop это большие круги вместо глаз, я решил что пусть игрок управляет шариком красным, а текстуры взял из первого попавшегося текстур-пака по майнкрафту (халтурил как умел).
В игре есть подсказки, но сделаны они были очень быстро, а следственно некачественно. В начале уровня появляется текст с моим комментарием по типу «Сложно?», или «Подумай!».
Программировал я игру на Unity 2017.1. Тогда на дворе был уже 2018 год и версию Unity 2018.2 я мог бы скачать, но не стал. Ведь я просто не хотел мучаться с переносом игры и возможными багами. Когда пришло время финальной компиляции, я этого сделать не смог. Причина тому — отсутствие Android sdk. Я на поиски потратил неделю, экспериментировал сочетанием новых версий движка (только 2017 года), изменением их настроек и бесчисленно огромным количеством sdk (300 гб для 24 разных одинаковых sdk). В итоге остановился на сторонней программе по установке sdk, версией движка 2017.3 и типом предложения Intent. Как же я был счастлив когда скомпилировал игру.
На её публикацию у меня ушло 3 дня.
Сложность заключалась в заполнении анкеты и необходимости заполнять описание на 18 языках (не слишком интересное занятие). Локализовывал я всё это через google translate. На создание обложки и скриншотов ушло не так много времени.
Несмотря на полное отсутствие пиара (кроме личной рекомендации) у игры в целом стабильные значения. Каждый месяц в среднем 4-7 установок.
В первый месяц трафик я подогнал, рассказав неравнодушным.

В последующие полгода прирост был ощутимее. Пик установок произошёл в конце лета и осени.

Даже сейчас, спустя год после релиза установки стабильны.

Изначально главной мотивация разработки было саморазвитие, никаких целей заработка я не приследовал. Отчасти из-за этого мой авторский проект просто пропал в небытие, в остальном из-за всех вышеперечисленных минусом. Но главное — в неё просто скучно играть. Ведь если бы я ввёл рекламу, я ответственнее отнёсся бы к пиару, качеству финального продукта и его презентабельности. А так — такое себе развлечение.
Но, в принципе, я доволен своей игрой. Её размер с неплохими уровнями даёт понять, что для первой игры моя является не такой уж и плохой. Из всего времени разработки я узнал многое о программировании и маркетинге, об игростроении и смежных вещях, но самое что я понял это то, куда я попал, в какую индустрию я начал идти.
Кстати, я как раз разрабатываю сиквел, авось что получится…
P.S: Для статьи специально трейлер смонтировал:
Самый первый вопрос, который я задал себе это выбор платформы публикации. Выбор платформы я делал по ценам или методом исключения: в Steam 100$ за игру, на IOS 100$ в год, выбор пал на Android. Заплатил 25$ в Google Play, получил аккаунт и началась разработка.
Я решил опираться на самые сильные и простые стороны движка. Лучше всего для этого подходила 2D физика, на её основе я и решил построить игру.
Но что это будет, в чём концепция? Я решил пойти за вдохновением на ютуб и нашёл ролик о том, как сделать генерацию уровней из пиксельных картинок. Я захотел так же.

То, что я переписал
Переписал систему, нарисовал уровень и протестировал генерацию. Подумал: «А что дальше?». И вдруг — озарение. Идея пришла мгновенно и пазл сложился воедино. Почему бы игроку не быть шариком, а управлять дать ему гравитацией? «Отличная идея» — подумал я и начал творить геймплей.
После передо мною встала задача: каким образом игрок будет управлять красным шариком. Вариантов за всё время разработки я напридумывал всего 4:
1) Радиусный
Игрок касался бы экрана, ставя точку отсчёта, относительно дальнейшего движения пальца гравитация менялась. Сила зависила от дальности точки отсчёта, а направление от угла между ними.
2) Фиксированный радиусный
То же, что и Радиусный, только точка отсчёта находилась бы строго в центре экрана
3) Двухсторонний (нажатие)
При нажатии на левую или правую часть экрана можно было повернуть «гравитацию» вместе с камерой на определённое количество градусов влево или вправо соответственно.
4) Двусторонний (зажатие)
Тот же принцип что и у Двустроннего (нажатие), только необходимо было зажимать и вращение происходило с фиксированной скоростью.
1 и 2 я сразу же отмёл из-за их сложности понимания и неинтуитивно понятного управления. Для мобильной игры не подходило. Но, к сожалению, 4 мне пришёл в голову на этапе постпродакшна, пришлось брать 3. Скажу честно, очень плохое решение (серьёзно, не надо так). У этого управления было два катастрофических недостатка.
- Первый заключался в его резкости, дёрганности. При повороте изображение резко и очень неприятно сильно менялось. Я давал протестировать, сказали, что из-за управления не понимали куда идти и как играть, а половину «тестеров» начало укачивать.
- Вторая проблема чисто техническая: при повороте игра подлагивала от 0.1 до 1-2 секунд, поскольку вращала не камеру с гравитацией, а ЦЕЛЫЙ УРОВЕНЬ. А уровни порой доходили до 10000 объектов. Думаю не стоит объяснять как реагировало устройство на подобный фокус с тригонометрией. Это я заметил в середине разработки, но исправлять не решался, поскольку я не умел менять направление 2d гравитации (знаю, сглупил) и я просто ленился.


Да и сейчас бы исправить так просто не получилось бы, не переполошив форумы и документацию. Когда я захотел хотя бы попробовать исправить баг, я не стал, так как менять гемплей было нельзя. Переделка управления под 4 тип испортило бы готовые 80% контента, заточенные под 3 тип управления.
Ещё из-за этого 1 проблема резко обострилась, теперь даже меня начало укачивать. Видимо я постарался на славу, правда не в том чего хотел. «Ну да ладно» — подумал я и продолжил продакшн дальше.
Я начал программировать ассеты головоломок, и на это у меня ушло немало времени. Целых 2 месяца я потратил на разного рода объекты и скрипты для их взаимодействия. Уровни представляли из себя простые bit-map текстуры с отчётливыми пикселями, цвет которых обозначал свой блок.
Обозначения
Белый — Фоновый блок
Чёрный — Простой блок
Красный — Игрок
Голубой — Финиш
Оттенки жёлтого — Телепорт
Тёмно-красный — Красный шар
Зелёный — Зелёный шар
Просто жёлтый — Звезда
Светлый оттенок серого — Блоки-прямоугольники
Тёмный оттенок серого — Фальшивые блоки
Оттенок жёлтого потемнее — Фальшивые телепорты
Оттенок жёлтого средней тёмности — Фальшивые звёзды
Тёмно-голубой — Фальшивый финиш
(Многовато фальши)



Чёрный — Простой блок
Красный — Игрок
Голубой — Финиш
Оттенки жёлтого — Телепорт
Тёмно-красный — Красный шар
Зелёный — Зелёный шар
Просто жёлтый — Звезда
Светлый оттенок серого — Блоки-прямоугольники
Тёмный оттенок серого — Фальшивые блоки
Оттенок жёлтого потемнее — Фальшивые телепорты
Оттенок жёлтого средней тёмности — Фальшивые звёзды
Тёмно-голубой — Фальшивый финиш
(Многовато фальши)



В основном все ассеты контактировали через OnTriggerEnter2D и теги. Даже сейчас догадаться не могу, на что ушло у меня около месяца. Меню заняло второй месяц от части из-за того, что я не использовал циклы, а активность всех 500 объектов регулировал через Awake, из-за этого я наплодил более 2500 строк кода.

«Твоя игра уже надоела, сделай другую» — говорили друзья, но я всё равно продолжал. Я запланировал 100 уровней. На их создание ушло 4 месяца. Создавал я их параллельно вместе с технической частью. В итоге мой план по уровням «заставляющие думать» получился почти никак. Я таких уровней могу назвать от силы штук 10 — 15, остальные были сложны другим. Они были сложны наличием узких коридоров, сложностью ориентации в пространстве, абсолютно мазахисткими дизайнерскими решениями и, конечно же, минами с лабиринтами. Но за их создание отвечал уже не я. Мои «наёмные работники» создали в общем около 60% контента игры.
Из-за того что уровни мы проектировали по правилам, уровни вышли проходимыми в теории, но на практике теория не проверялась. Сделав все уровни, я понимал, что может произойти со моей игрой, а именно абсолютный диссонанс от лагающих до непроходимых уровней, из-за которых не получилось бы пройти игру. Так и осталось.
Также я не забыл про графику, но над ней я работал 2 часа, затем больше вообще не прикасался. Поскольку я криворукий и лучшее что я рисовал в Photoshop это большие круги вместо глаз, я решил что пусть игрок управляет шариком красным, а текстуры взял из первого попавшегося текстур-пака по майнкрафту (халтурил как умел).
В игре есть подсказки, но сделаны они были очень быстро, а следственно некачественно. В начале уровня появляется текст с моим комментарием по типу «Сложно?», или «Подумай!».
Программировал я игру на Unity 2017.1. Тогда на дворе был уже 2018 год и версию Unity 2018.2 я мог бы скачать, но не стал. Ведь я просто не хотел мучаться с переносом игры и возможными багами. Когда пришло время финальной компиляции, я этого сделать не смог. Причина тому — отсутствие Android sdk. Я на поиски потратил неделю, экспериментировал сочетанием новых версий движка (только 2017 года), изменением их настроек и бесчисленно огромным количеством sdk (300 гб для 24 разных одинаковых sdk). В итоге остановился на сторонней программе по установке sdk, версией движка 2017.3 и типом предложения Intent. Как же я был счастлив когда скомпилировал игру.
На её публикацию у меня ушло 3 дня.
Сложность заключалась в заполнении анкеты и необходимости заполнять описание на 18 языках (не слишком интересное занятие). Локализовывал я всё это через google translate. На создание обложки и скриншотов ушло не так много времени.
Обложка и скриншоты






Несмотря на полное отсутствие пиара (кроме личной рекомендации) у игры в целом стабильные значения. Каждый месяц в среднем 4-7 установок.
В первый месяц трафик я подогнал, рассказав неравнодушным.

В последующие полгода прирост был ощутимее. Пик установок произошёл в конце лета и осени.

Даже сейчас, спустя год после релиза установки стабильны.

Изначально главной мотивация разработки было саморазвитие, никаких целей заработка я не приследовал. Отчасти из-за этого мой авторский проект просто пропал в небытие, в остальном из-за всех вышеперечисленных минусом. Но главное — в неё просто скучно играть. Ведь если бы я ввёл рекламу, я ответственнее отнёсся бы к пиару, качеству финального продукта и его презентабельности. А так — такое себе развлечение.
Но, в принципе, я доволен своей игрой. Её размер с неплохими уровнями даёт понять, что для первой игры моя является не такой уж и плохой. Из всего времени разработки я узнал многое о программировании и маркетинге, об игростроении и смежных вещях, но самое что я понял это то, куда я попал, в какую индустрию я начал идти.
Кстати, я как раз разрабатываю сиквел, авось что получится…
P.S: Для статьи специально трейлер смонтировал: