Проба пера, или первый опыт разработки игры под Android
Ожидает приглашения
В этой статье я расскажу о процессе создания моей первой игры на Android (и первой, которая была вообще сделана до конца).
Думаю, у каждого из разработчиков рано или поздно появляется мечта о создании собственной игры. К сожалению, чаще всего, мечты остаются мечтами из-за множества причин (неуверенность, отсутствие идей, бесперспективность, высокая конкуренция и т.д.). Действительно, рынок мобильных игр очень непредсказуем, со всеми этими Flappy Bird’ами, сделанными буквально на коленке, и принесшими своим создателям сотни тысяч долларов, так и проекты длинною в несколько лет, покрытые пылью где-то в конце топа приложений. Я же решил войти в рынок для получения опыта разработки и продвижения игр, да и интересно это, игру свою писать.
Идея у меня появилась где-то весной, причем появилась она достаточно спонтанно. Сидя на скучной лекции, и листая меню телефона, мне подумалось: «А что если сделать игру, в которой надо управлять «бегом» пальцев по экрану?» Идея была сразу же записана и оставлена на размышление. Летом идея приобрела более четкие очертания: игра должна была заключаться в том, что игрок управляет бегуном от первого лица, перебегая и перепрыгивая препятствия. Успех известной игры Subway surf побудил меня на то, чтобы взять некоторые элементы из неё (монетки, разбросанные по уровню, постепенное увеличение скорости, возможность стрейфа в сторону для обхода препятствий). Увы, всё это так и оставалось у меня в голове, т.к. в то время я разрабатывал другую игру на ПК (которая так и не была доработана после 5 месяцев разработки).
Избавившись от всех отвлекающих факторов, я, наконец, приступил к делу. В качестве движка был выбран знакомый мне Unity. Локация пришла в голову как-то сразу же: город. Дело оставалось за малым – найти подходящие 3d-модели и как-то органично собрать их внутри проекта.
Перебрав десяток бесплатных паков моделей городской тематики, я понял, что ни один из них не подходит. Да и где конкретно игрок будет бежать? По дороге, оббегая автомобили? Ладно, выбрав один подходящий пак дорог, я принялся сооружать прототип. Сразу же вылезли проблемы и неточности. Мне очень не понравился момент, что игрок в любой момент может перестать бежать безо всяких проблем. Пустить за ним погоню? Да и просто бежать по дороге, перепрыгивая иногда автомобили не очень-то интересно.
Внезапно решение пришло в голову: небоскребы! Дороги не нужны, будем бежать по небоскребам! Прыгать между ними, а если остановимся, нам не хватит разбега для следующего прыжка. Да и проще это реализовать, из моделей нужны только сами небоскребы. И вновь начался поиск моделей небоскребов. Сказать, что мне крупно повезло – ничего не сказать. В один прекрасный день я нашел бесплатный пак с сотней простых небоскребов. И работа закипела.
Небоскребы распакованы, приукрашены и готовы выполнять свою функцию. Так как изначально планировалось сделать игру без уровней, т.е. бесконечной, то необходим был хороший алгоритм генерации. И тут проблемка: необходимо поставить здания так, чтобы, прыгнув с края одного здания, игрок приземлялся точно в начало другого, несмотря на различие в габаритах и высотах. На помощь пришла формула тела, брошенного под углом к горизонту. Здания расставлены, на их крышах поставлены невидимые прямоугольные «трассы» для бега. Непригодные здания расположились по бокам для заполнения. Получилось 43 активных и 45 фоновых зданий. Запуск. 700 000 полигонов. Многовато.
Стоит упомянуть, что в целях оптимизации было принято решение полностью отказаться от источников света, а все материалы сделать не реагирующими на освещение (unlit texture, unlit color). Теперь настал через поработать с 3d max, удалить невидимые полигоны, перевернуть кое-где нормали (достаточно серьёзная проблема в этом паке была. Около половины зданий имели элементы с неправильными нормалями, которые выглядели как пустые пространства). Заодно были удалены пожиратели полигонов, здания, содержащие более 60к полигонов. Еще запуск. 300-400к. Уже лучше, но многовато все равно.
Управление было задумано так:
— свайп вверх или тач – прыжок;
— свайп вниз – шаг;
— свайп в сторону – стрейф;
С прыжком и стрейфом проблем не возникло, а вот с самим бегом пришлось потрудиться. Как реагировать на свайп? Должна ли скорость и длина свайпа влиять на результирующую силу? После многочисленных тестов на смартфоне друга (у меня MeeGo, сапожник без сапог, эх… ) был организован бег: каждый кадр смотрим на скорость свайпа (проверяя, естественно, его направление) и после некоторых преобразований, добавляем силу к игроку.
Для дальнейшего уменьшения количества полигонов на сцене была значительно уменьшена дальность создания новых зданий. Теперь новые здания появляются чуть ли не тогда, когда игрок уже прыгает на них. Полигонов-то меньше, но некрасиво. Здания выскакивают прямо перед игроком. Надо что-то придумать. Идея! Здания будут появляться прямо перед игроком, но по частям, и с «энергетическим» материалом на долю секунды. Сделаем вид, что так и надо. Город строится сам по себе из чистой энергии! Да и нагрузка меньше. Теперь вместо появления нескольких зданий целиком в одном кадре, здания красиво строят себя по частям из энергии (эксплуатировались unity coroutines где только возможно). Плюс еще и были удалены еще несколько «тяжелых» зданий и полигонов. Запуск. 60-100к. Отлично.
Теперь наступила пора более тонких и косметических поправок. Кстати, а что делать, если нужно прыгнуть из очень низкого здания на очень высокое? Устранить такую возможность. Список зданий отсортирован по высоте. И всё же? Что будет, если не допрыгнуть никак, а формула показывает, что результата нет? Делать огромные прыжки как в Матрице? Некрасиво, да и темп игры теряется. Сделать их иногда. Сказано – сделано. В максе создан «джампер», достаточно прыгнуть, стоя на нем и прыжок получится в несколько раз выше. Также добавлены «невидимые стены» в виде невозможности свайпа туда, где нет блока трассы. Кстати, опять же некрасиво, невозможно бежать по той или иной части крыши только потому, что она недостаточно прямоугольная. Да и прыгнуть туда можно ненароком. И снова идея пришла в голову. Добавить на крышу декоративных элементов. Пусть игрок видит, что там особо не побегаешь. Кстати, нужен же какой-то интерес для бега. Монетки? А что купить на них? Энергия для строительства новых зданий! Не соберешь, следующее здание не построится и прыгать будет некуда! А нет, не то. Энергия! Только для бега. Не собираешь – заканчивается энергия – останавливаешься и Gameover.
Время рисовашек в фотошопе, игр с прозрачностью и размытием. Благо хоть в юнити сделали нормальную систему UI. Особых проблем не возникало, помимо постоянного недовольства результатом и перерисовкам. Заодно был добавлен ночной режим (перерисованы текстуры и новые мелодии). Кстати, один из плюсов инди-разработки в том, что можно всегда отвлечься. Надоело писать код? Рисуй. Надоело рисовать? Ищи и обрабатывай звуки и музыку. Надоело всё? Поиграй, посмотри, как далеко можешь пройти собственную игру. Весело!
Меню нарисованы, звуки расставлены, все баги отловлены (ха-ха-ха). Пора найти больше друзей с Android-смартфонами для более объективного тестирования. Тестирование проведено, последние ошибки исправлены, название последнего билда «High runner 1.0». И вот, пятница, 13 ноября, игра увидела свет, вернее магазин Google Play. Можно и поздравить себя с первым законченным проектом.
Вот какие выводы были сделаны мной в процессе разработки:
— Все проблемы и недочеты игры могут и должны быть превращены в уникальные особенности;
— Прелесть самостоятельной разработки в том, что продукт является полностью твоим. Со всеми его недоработками и недостатками. Создание чего-либо своими руками вызывает необъяснимые счастливые эмоции;
— Ближе к концу разработки продукт всё больше начинает «давить» на разработчика. Выход только один — доделать и выпустить;
— Необходимо с самого начала обозначить более-менее чёткие временные рамки для проекта. И конечно же, рассчитывать свои силы, чтобы не потратить их на проект, который никогда не будет завершен.
P.S.: Конечно, цикл разработки не заканчивается с релизом, впереди High Runner ждут обновления, продвижение, реклама. Да, ради интереса в игру была встроена реклама от Admob. Наивно, конечно надеяться на какую-нибудь существенную прибыль от первого проекта, да и не ставилась такая цель. А цель поставленную в сентябре 2015 (получить опыт разработки, понять свои слабые места как разработчика, лучше узнать юнити и прочие программы) игра выполнила на все 100%. Да и новая идея у меня уже есть.
P.P.S.: Спасибо за прочтение, надеюсь, вам понравилась данная статья. С удовольствием отвечу на все вопросы в комментариях!
Часть 0. Введение
Думаю, у каждого из разработчиков рано или поздно появляется мечта о создании собственной игры. К сожалению, чаще всего, мечты остаются мечтами из-за множества причин (неуверенность, отсутствие идей, бесперспективность, высокая конкуренция и т.д.). Действительно, рынок мобильных игр очень непредсказуем, со всеми этими Flappy Bird’ами, сделанными буквально на коленке, и принесшими своим создателям сотни тысяч долларов, так и проекты длинною в несколько лет, покрытые пылью где-то в конце топа приложений. Я же решил войти в рынок для получения опыта разработки и продвижения игр, да и интересно это, игру свою писать.
Часть 1. Идея и концепция. Весна-лето 2015
Идея у меня появилась где-то весной, причем появилась она достаточно спонтанно. Сидя на скучной лекции, и листая меню телефона, мне подумалось: «А что если сделать игру, в которой надо управлять «бегом» пальцев по экрану?» Идея была сразу же записана и оставлена на размышление. Летом идея приобрела более четкие очертания: игра должна была заключаться в том, что игрок управляет бегуном от первого лица, перебегая и перепрыгивая препятствия. Успех известной игры Subway surf побудил меня на то, чтобы взять некоторые элементы из неё (монетки, разбросанные по уровню, постепенное увеличение скорости, возможность стрейфа в сторону для обхода препятствий). Увы, всё это так и оставалось у меня в голове, т.к. в то время я разрабатывал другую игру на ПК (которая так и не была доработана после 5 месяцев разработки).
Часть 2. Подготовка. Сентябрь 2015
Избавившись от всех отвлекающих факторов, я, наконец, приступил к делу. В качестве движка был выбран знакомый мне Unity. Локация пришла в голову как-то сразу же: город. Дело оставалось за малым – найти подходящие 3d-модели и как-то органично собрать их внутри проекта.
Перебрав десяток бесплатных паков моделей городской тематики, я понял, что ни один из них не подходит. Да и где конкретно игрок будет бежать? По дороге, оббегая автомобили? Ладно, выбрав один подходящий пак дорог, я принялся сооружать прототип. Сразу же вылезли проблемы и неточности. Мне очень не понравился момент, что игрок в любой момент может перестать бежать безо всяких проблем. Пустить за ним погоню? Да и просто бежать по дороге, перепрыгивая иногда автомобили не очень-то интересно.
Внезапно решение пришло в голову: небоскребы! Дороги не нужны, будем бежать по небоскребам! Прыгать между ними, а если остановимся, нам не хватит разбега для следующего прыжка. Да и проще это реализовать, из моделей нужны только сами небоскребы. И вновь начался поиск моделей небоскребов. Сказать, что мне крупно повезло – ничего не сказать. В один прекрасный день я нашел бесплатный пак с сотней простых небоскребов. И работа закипела.
Небоскребы. Финальная версия

Часть 3. Физика и математика. Начало октября 2015
Небоскребы распакованы, приукрашены и готовы выполнять свою функцию. Так как изначально планировалось сделать игру без уровней, т.е. бесконечной, то необходим был хороший алгоритм генерации. И тут проблемка: необходимо поставить здания так, чтобы, прыгнув с края одного здания, игрок приземлялся точно в начало другого, несмотря на различие в габаритах и высотах. На помощь пришла формула тела, брошенного под углом к горизонту. Здания расставлены, на их крышах поставлены невидимые прямоугольные «трассы» для бега. Непригодные здания расположились по бокам для заполнения. Получилось 43 активных и 45 фоновых зданий. Запуск. 700 000 полигонов. Многовато.
Математические потуги



Часть 4. Оптимизация. Часть 1. Октябрь 2015
Стоит упомянуть, что в целях оптимизации было принято решение полностью отказаться от источников света, а все материалы сделать не реагирующими на освещение (unlit texture, unlit color). Теперь настал через поработать с 3d max, удалить невидимые полигоны, перевернуть кое-где нормали (достаточно серьёзная проблема в этом паке была. Около половины зданий имели элементы с неправильными нормалями, которые выглядели как пустые пространства). Заодно были удалены пожиратели полигонов, здания, содержащие более 60к полигонов. Еще запуск. 300-400к. Уже лучше, но многовато все равно.
Скриншот
Белая сфера внизу — видимый пока что игрок, разноцветные сферы на зданиях показывают, где можно бежать, и откуда куда лучше прыгать

Белая сфера внизу — видимый пока что игрок, разноцветные сферы на зданиях показывают, где можно бежать, и откуда куда лучше прыгать
Часть 5. Управление. Часть 1. Октябрь 2015
Управление было задумано так:
— свайп вверх или тач – прыжок;
— свайп вниз – шаг;
— свайп в сторону – стрейф;
С прыжком и стрейфом проблем не возникло, а вот с самим бегом пришлось потрудиться. Как реагировать на свайп? Должна ли скорость и длина свайпа влиять на результирующую силу? После многочисленных тестов на смартфоне друга (у меня MeeGo, сапожник без сапог, эх… ) был организован бег: каждый кадр смотрим на скорость свайпа (проверяя, естественно, его направление) и после некоторых преобразований, добавляем силу к игроку.
Часть 6. Оптимизация. Часть 2. Октябрь 2015
Для дальнейшего уменьшения количества полигонов на сцене была значительно уменьшена дальность создания новых зданий. Теперь новые здания появляются чуть ли не тогда, когда игрок уже прыгает на них. Полигонов-то меньше, но некрасиво. Здания выскакивают прямо перед игроком. Надо что-то придумать. Идея! Здания будут появляться прямо перед игроком, но по частям, и с «энергетическим» материалом на долю секунды. Сделаем вид, что так и надо. Город строится сам по себе из чистой энергии! Да и нагрузка меньше. Теперь вместо появления нескольких зданий целиком в одном кадре, здания красиво строят себя по частям из энергии (эксплуатировались unity coroutines где только возможно). Плюс еще и были удалены еще несколько «тяжелых» зданий и полигонов. Запуск. 60-100к. Отлично.
Видео новой системы создания зданий
Часть 7. Управление. Часть 2. Конец октября 2015
Теперь наступила пора более тонких и косметических поправок. Кстати, а что делать, если нужно прыгнуть из очень низкого здания на очень высокое? Устранить такую возможность. Список зданий отсортирован по высоте. И всё же? Что будет, если не допрыгнуть никак, а формула показывает, что результата нет? Делать огромные прыжки как в Матрице? Некрасиво, да и темп игры теряется. Сделать их иногда. Сказано – сделано. В максе создан «джампер», достаточно прыгнуть, стоя на нем и прыжок получится в несколько раз выше. Также добавлены «невидимые стены» в виде невозможности свайпа туда, где нет блока трассы. Кстати, опять же некрасиво, невозможно бежать по той или иной части крыши только потому, что она недостаточно прямоугольная. Да и прыгнуть туда можно ненароком. И снова идея пришла в голову. Добавить на крышу декоративных элементов. Пусть игрок видит, что там особо не побегаешь. Кстати, нужен же какой-то интерес для бега. Монетки? А что купить на них? Энергия для строительства новых зданий! Не соберешь, следующее здание не построится и прыгать будет некуда! А нет, не то. Энергия! Только для бега. Не собираешь – заканчивается энергия – останавливаешься и Gameover.
Добавление декоративных элементов на крыши

Часть 8. Пользовательский интерфейс. Конец октября 2015
Время рисовашек в фотошопе, игр с прозрачностью и размытием. Благо хоть в юнити сделали нормальную систему UI. Особых проблем не возникало, помимо постоянного недовольства результатом и перерисовкам. Заодно был добавлен ночной режим (перерисованы текстуры и новые мелодии). Кстати, один из плюсов инди-разработки в том, что можно всегда отвлечься. Надоело писать код? Рисуй. Надоело рисовать? Ищи и обрабатывай звуки и музыку. Надоело всё? Поиграй, посмотри, как далеко можешь пройти собственную игру. Весело!
Элементы интерфейса



Часть 9. Финал. Начало ноября 2015
Меню нарисованы, звуки расставлены, все баги отловлены (ха-ха-ха). Пора найти больше друзей с Android-смартфонами для более объективного тестирования. Тестирование проведено, последние ошибки исправлены, название последнего билда «High runner 1.0». И вот, пятница, 13 ноября, игра увидела свет, вернее магазин Google Play. Можно и поздравить себя с первым законченным проектом.
Финальные скриншоты







Все сборки

Часть 10. Выводы. 17 ноября 2015
Вот какие выводы были сделаны мной в процессе разработки:
— Все проблемы и недочеты игры могут и должны быть превращены в уникальные особенности;
— Прелесть самостоятельной разработки в том, что продукт является полностью твоим. Со всеми его недоработками и недостатками. Создание чего-либо своими руками вызывает необъяснимые счастливые эмоции;
— Ближе к концу разработки продукт всё больше начинает «давить» на разработчика. Выход только один — доделать и выпустить;
— Необходимо с самого начала обозначить более-менее чёткие временные рамки для проекта. И конечно же, рассчитывать свои силы, чтобы не потратить их на проект, который никогда не будет завершен.
P.S.: Конечно, цикл разработки не заканчивается с релизом, впереди High Runner ждут обновления, продвижение, реклама. Да, ради интереса в игру была встроена реклама от Admob. Наивно, конечно надеяться на какую-нибудь существенную прибыль от первого проекта, да и не ставилась такая цель. А цель поставленную в сентябре 2015 (получить опыт разработки, понять свои слабые места как разработчика, лучше узнать юнити и прочие программы) игра выполнила на все 100%. Да и новая идея у меня уже есть.
P.P.S.: Спасибо за прочтение, надеюсь, вам понравилась данная статья. С удовольствием отвечу на все вопросы в комментариях!