Cruise stories: Match-up – итоги разработки и релиза игры для Android

Cruise stories: Match-up DailyToys
Cruise stories: Match-up DailyToys

Всем привет! В этом посте хотелось бы рассказать об опыте разработки, публикации и продвижения своего проекта под названием "Cruise stories: Match-up".

Вступление

Наверное, стоит начать с небольшого описания самой игры и целей, которые преследовались на момент начала разработки. Итак, Cruise stories – это некая вариация классической игры "Память". Это та самая игра, где игроку даётся множество карт, которые сначала на небольшое время открываются, чтобы у игрока была возможность запомнить их расположение, а затем лежат рубашкой вверх, и задачей игрока является открыть все пары карт по памяти. (Так как у меня в игре эти самые карты называются тайлами, то в дальнейшем буду использовать именно это слово).

Cruise Stories: Match-Up

Мне хотелось сделать геймплей более разнообразным, и я решил добавить дополнительных правил в игру: во-первых, решил сделать различные типы тайлов, и в зависимости от их типа, при открытии (или ошибке) на поле происходили бы определенные события; во-вторых, сделать два режима игры, в одном из которых игрок должен был бы запомнить всё поле и с наименьшим количеством ошибок открыть все пары, а во втором и вовсе не показывать изначально все тайлы открытыми, задействовав фактор удачи на первых секундах уровня; и в-третьих, усложнить игровой процесс ограничением времени и количеством допущенных ошибок. К этому всему, конечно же, захотелось добавить и подсказок, которые игрок сможет покупать в магазине за игровую валюту, которую будет приобретать в процессе прохождения уровней.

Оставалось выбрать какую-то тематику для игры, так как не хотелось делать её абстрактной. И тогда, не знаю почему, в голову пришла идея сделать мини-сюжет, в котором игрок будто бы путешествовал на круизном лайнере вокруг света. Эта идея на тот момент мне показалась довольно неплохой, потому что появлялся широкий спектр возможностей в плане дизайна паков с уровнями (каждый пак – новая локация, со своим графическим оформлением, диалогами персонажа, изображениями на тайлах). За основу был взят реальный маршрут круизного лайнера (правда, большую часть локаций было оттуда вырезано, так как планировалось сделать всего 10 паков уровней). Про каждый город, в котором бы останавливался игрок было найдено небольшую тезисную информацию про различные особенности, достопримечательности. Также, текстом были описаны внешности персонажей на этих локациях.

В итоге, когда концепт игры был готов, настало время организовать свою работу. Учитывая тот факт, что игра делалась "по вечерам" после работы, важно было как можно рациональнее распределять время, чтобы тех 3-5 часов вечером хватало на каждодневный видимый результат. Опыт в организации разработки у меня уже был благодаря работе в компании. Поэтому, я завёл проект в Jira и набросал некое подобие roadmap-а в виде историй, разделив его предварительно на компоненты вроде "Graphic", "Android", "Core".

Ну, и теперь о целях. Почему именно такая игра? Потому что я понимал, что такой проект я смогу осилить в более-менее вменяемые сроки, я понимал, что смогу собственными силами отрисовать весь UI, и у меня было виденье того, что должно получиться в итоге. Я был уверен, что моих знаний хватит на реализацию этой игры и я не буде тратить уйму времени на изучение чего-то, что я ещё не знаю. То есть, этот проект по сути стал итоговым результатом моих познаний, приобретенных на своих прошлых проектах. Для реализации был выбран уже проверенный libGDX (если точнее, то libKTX, так как пишу на Kotlin). Планов на продвижение каких-то чётких не было (что как всегда, было ошибкой): запустить недорогие кампании в Google рекламе, Facebook Ads и надеяться на чудо. Монетизация – AdMob и внутриигровые покупки (которые добавлено просто для того, чтобы они были, потому что вероятность покупки игровых предметов за деньги была близка к нулю). Итак, если вкратце, то целью проекта было подвести черту под созданием игр в данном жанре (головоломки, таймкиллеры) используя стек уже существующих знаний и двигаться дальше. Ну, и конечно же, постараться извлечь из всей этой затеи какую-то прибыль.

Разработка

Я отношусь к визуалам – мне нужно наглядно видеть, как именно будет выглядеть моя игра в итоге. Поэтому, первым же делом я принялся за UI. Не могу сказать о себе, что у меня есть какое-то чувство стиля или что-то вроде этого. Если UX я могу продумать, и он выйдет довольно удобным и интуитивным, то с UI все не так радужно. По этой причине, изначально было несколько версий того, как будет выглядеть, например, главный экран игры. И на создание конечного макета ушло довольно-таки много времени.

Эволюция дизайна главного экрана игры DailyToys
Эволюция дизайна главного экрана игры DailyToys
Макеты экранов DailyToys
Макеты экранов DailyToys

Спустя некоторое время, UI наконец-то был готов, и можно было приступать к программированию. Разработка на libGDX/libKTX (для тех, кто не сталкивался с этим инструментом) – это когда все делается руками, в коде, и никакого GUI нет. Этот инструмент одновременно прекрасен и ужасен. Прекрасен тем, что это интересно, и можно построить такую архитектуру, какую пожелаешь; практически нет каких-либо ограничений для творчества; есть множество уже реализованных штук, вроде сцен, актёров, спрайтов, менеджеров ресурсов и так далее, что значительно упрощает работу. Ну, а ужасен тем, что весь этот кодинг забирает ну просто уйму времени. На движке скорость разработки, наверное, раза в 2-3 быстрее (это просто предположение, до сих пор как-то более менее глубоко изучить какой-то из движков не доводилось).

Как я уже сказал, я – визуал, и поэтому решил первым делом сделать именно главный экран игры (меню), потому что мне хотелось, чтобы он выглядел красиво, чтобы двигалась карта, и чтобы в итоге, я получил удовольствие от результата работы над ним. Пришлось потратить довольно много времени на то, чтобы моя идея заработала, но в итоге, результат вышел именно таким, каким я хотел его видеть.

Главный экран игры DailyToys

Следующим этапом было написание самой логики игры. Не могу точно сказать, сколько времени это у меня заняло, потому что на идею трекать время в джиру я забил буквально спустя месяц. Могу только сказать, что реализация логики игры (и попутно её визуализации) заняла не менее трёх месяцев (это не в человекочасах, а в "вечерах").

Хоть в начале, предполагалось больше типов тайлов, в итоге решил ограничиться только 7-ю:

1. Обычный тайл - неуспешное открытие обычных тайлов не несет никаких последствий, а успешное открытие пары таких тайлов будет приносить игроку минимальный бонус.
2. Серебряный тайл - при открытии пары таких тайлов, на поле автоматически будет открыта еще одна дополнительная случайная пара тайлов.
3. Золотой тайл - та же механика, что и у серебряного, только открываются целых две дополнительных пары тайлов.
4. Опасный тайл - если игрок не правильно открывает пару для такого тайла, на поле закрывается одна ранее открытая пара (и далеко не всегда удастся уследить, какая же именно пара закрылась, чтобы тут же открыть её заново).
5. Тайл перемешивания - если игрок не откроет пару для такого, то игра в случайном порядке перемешает закрытые тайлы (что должно озадачить игрока, ведь он уже запомнил некоторые расположения тайлов).
6. Чёрный тайл - игроку предоставляется целых 3 попытки открыть пару для такого, но в случае неудачи, игра закроет ранее открытую пару тайлов.
7. Тайл кликер - самый приятный вид тайлов. Если отгадать пару для такого тайла, запустится отдельная мини-игра, в которой задачей игрока будет сделать как можно больше тапов по экрану за отведённое время, что принесёт ему большое количество бонусов.

Последним этапом в программировании непосредственно игры стал экран завершения уровня, на котором игроку предоставлялась информация об успехе прохождения (сколько бонуса получил, на сколько звезд прошёл).

Speedcoding – создание экрана завершения уровня

Сотрудничество со сторонними специалистами

Для создания изображений персонажей и фонов под локации я решил, что лучше нанять художников. Сразу уточнение: ранее я никогда не нанимал никаких специалистов (за одним маленьким исключением), поэтому опыта в этом особого не было. Я не умел общаться с ними, правильно договариваться, торговаться.

Первым вариантом стала одна моя знакомая, которой хотелось в digital (сама она довольно неплохо рисовала на бумаге, но с редакторами опыта было чуть менее чем ноль). На тот момент особой спешки не было, и я подумал, что можно было бы попробовать дать человеку время на обучение. Я приобрёл и одолжил ей простенький Wacom Intuos S, объяснил какие-то основные вещи в PS и SAI, подсказал, где и как искать ответы на свои вопросы в интернете (на самом деле, это самая большая проблема у людей почему-то). Договорились о том, что за месяц у меня будет первый персонаж, хотя бы его скетч (учитывая полное отсутствие опыта, этот срок был как раз вменяемым, так как я не требовал hi-end графики, а это должна была быть обыкновенная простенькая картинка в таком-себе cartoon стиле). Конечно же, мы договорились и о каких-то небольших компенсациях за работу, при чём с разными вариантами: почасовка по трекингу в джире, фиксированные суммы за выполненную работу, фиксированные суммы за месяц. В итоге, это была всё-таки почасовка.

В первый месяц художница задавала много вопросов по PS, по своему ПК в целом (опытным пользователем ПК её не назвать), и в джире собралось всего 30 часов работы за месяц. Результатом был скетч персонажа, готовый не до конца. В следующий месяц работы было ещё меньше, и художница сказала, что в силу своих жизненных обстоятельств, она не может уделять больше времени рисованию. К сожалению, пришлось прекратить совместную работу.

Следующим вариантом на позицию художника стал мой друг детства. С ним была та же история, что и с первым художником – полный ноль в редакторах, но времени и желания было явно больше. Вопросов по редакторам было намного меньше, учился по урокам с какого-то там курса по Illustrator. Первые работы были откровенно говоря, не очень. Но со временем, я указывал ему на ошибки, он их исправлял, и спустя несколько недель, начали получаться уже достаточно неплохие результаты. Но, правда, только по фонам. Для отрисовки персонажей всё ещё не хватало скилла. По этому, решили, что он будет рисовать только фоны и иллюстрации для тайлов, а для создания персонажей будем искать другого человека.

Выкинув объявление в Instagram, нашлось 4-5 желающих. У них и портфолио было даже, и вроде неплохие работы. В итоге слились все до единого. При чём, довольно странным методом: некоторые из них согласились поработать, согласились с ценой, и в итоге, прямо в день начала работ говорили, что им уже не интересно, нет времени etc. В конце-концов, нашлась художница, которая сразу же показалась мне ответственным человеком, быстро отвечала на сообщения, вовремя сдала первую (и последующие) работы.

В общем, на поиск и работу с художниками ушло времени больше чем я планировал, раза в 3. А все мои пробы и ошибки мне встали в $1K.

Тестирование

Каким-то чудесным образом, проект был завершён и я его раскидал друзьям, чтобы протестировать. В итоге, в логике игры вылезло множество багов, которых я раньше не замечал, и на фикс которых тоже ушло приличное количество времени. В итоге, релиз затянулся приблизительно на месяц.

Публикация

Нельзя просто так взять, и опубликовать с первого раза приложение в Google Play. В этот раз загвоздка была в AdMob. Во-первых, я прождал дней 12-14, пока моё приложение появится в списке приложение внутри AdMob (чтобы связать проекты). Почему так долго - неизвестно. Потом, когда таки удалось это сделать, я на радостях собрал релизный билд и отправил его на публикацию в Google Play. Билд проверялся более суток, после чего я получил reject. Google Play сообщил о том, что в приложении показывается реклама, которая не подходит под возрастную группу ЦА. У меня, конечно, возник небольшой вопрос к гуглу: если я в AdMob связываю проект с проектом в Google Play, то почему бы вам автоматически не применить настройки по возрастным ограничениям для рекламы?! Ну да ладно, исправил это недоразумение и залил новый билд. На апрув опять ушло что-то вроде 2 дней. Опубликовалось и ладно.

Продвижение

Самая сложная, и часто самая печальная часть истории о разработке игр, в частности под мобайл. Изначально решил запустить рекламу на Facebook Ads. Что же, цензурно выразить своё мнение о Facebook Ads невозможно, но я попробую. Дело в том, что их механизмы проверки рекламы на соответствие правилам площадки и вообще проверка действий пользователя в аккаунте настолько параноидальная, что любой клик "не туда" сразу ведет к блокировке аккаунта. В итоге, с горем пополам, настроил и запустил кампанию. Начались первые установки. Всего на эту первую кампанию ушло $42, а установок было 56. То есть, $0.75 за установку. Мне показалось, что это слегка дороже, чем хотелось бы. Аудитория территориально была в СНГ.

Результат первой кампании на Facebook
Результат первой кампании на Facebook

Я настроил вторую кампанию на Facebook (там добавил уже больше креативов) и получил бан. Опять. Причиной стало "подозрение на несанкционированные действия в рекламном аккаунте". Окей, идём в Google рекламу.

В Google настроить кампанию оказалось в разы приятнее и проще. Кампания стартовала и начала показывать результаты. Цена за установку оказалась намного меньше, чем на Facebook, где-то в районе $0.3 за установку. Аудитория территориально была тоже в СНГ.

Результат первой кампании в Google
Результат первой кампании в Google

Спустя пару дней настроил еще одну кампанию в гугле, но уже не на страны СНГ, а на Индию, Бразилию, Мексику и страны Африки. Хотел проверить, насколько цены за установку будут отличаться. В итоге, установки обходились в приблизительно $0.2.

Результат второй кампании в Google
Результат второй кампании в Google

Также, закупил еще совсем немного мотивированного трафика (по сути, бесполезная трата денег, просто хотелось проверить, как это работает).

В итоге, реклама в целом обошлась мне в $260. Этой суммы мне хватило на то, чтобы приложение продвинулось в топе среди новых бесплатных по категории на 47 место. Я подумал, что допихать его в топ-30 мне попросту не хватит денег, и решил остановиться.

Итоги

На момент написания статьи в дашборде Flurry наблюдается неутешительная картина. (Стоит отметить, что SDK Flurry я подключил уже после релиза, в одном из обновлений, по этому кол-во установок несколько больше, но данные из Firebase и тем более Google Play Console сложно назвать достоверными, как-то у них слишком долго всё обновляется).

Flurry dashboard
Flurry dashboard

И по данным Google Play Console выходит, что на данный момент всего 287 активных установок, и 1.05К установок всего.

Google Play Console KPI
Google Play Console KPI

Как видно, пришёл к успеху :) (сарказм)

Выводы

Одна из целей достигнута – игра получилась такой, какой я её видел изначально. Как игра зашла аудитории, и хорошая ли она вышла – судить не мне. С продвижением и прибылью – косяк.

Ну, и конечно же, я пообещал себе, что это мой последний проект подобного рода. Пора отбросить детские мечты о том, что можно заработать на простенькой мобайл игре деньги на более крутой проект, проект мечты. Игра не стрельнет, если не вливать множество денег в продвижение. Без этого – только надеяться, что повезёт. Но цена попытки слишком велика, чтобы просто слепо надеяться на удачу или чудо. В общем и целом, проект обошелся мне в 18 месяцев работы и $1.5К.

Ну, и для тех, кто дочитал до этого места, и желает посмотреть на игру, то вот линк на Google Play:

3535
15 комментариев

Вывод "Игра не стрельнет, если не вливать множество денег в продвижение." правильный. 
Могу посоветовать переделать игру на HTML5 и для начала выложить на Яндекс.игры. Там даже без затрат на продвижение можно что-то заработать, уж точно больше, чем вы получили. Затраты времени (денег) на переделку вашей готовой игры сравнительно невелики. 

2
Ответить

Спасибо за совет! Никогда ранее не имел дела с Яндекс.игры, возможно и стоит попробовать. К тому же, насколько я знаю, то как раз возможен деплой проекта libGDX на HTML5. Если найдутся силы и желание, то воспользуюсь вашим советом :)

Ответить

Сейчас маленькой студии без издателя продвигать мобильную игру практически нереально. И тут дело не только в необходимости огромных финансовых вложений в рекламу, но и экспертизы издателя в рекламном продвижении и тенденциях рынка. Хоть это и грустно, но таковы реалии.

Так что, если у вас не спрятаны под подушкой, как минимум, пару миллионов рублей, под рукой нет команды UAM, а ваша игра не шедевр всех времен и народов, то единственный выход - обратиться к издателю. Лучше отдать +-50% прибыли от 10 миллионов, чем получить все 100% от 10 тысяч. 

Но и тут есть нюанс. Издателей, обычно, не интересуют игры, у которых ретеншен первого дня <40%, а CPI для США >0.5$. Хотя бы один из двух показателей должен быть хорошего уровня. Оно и понятно. Тут дело не в жадности издателя. Просто игры с показателями меньше заявленных, банально не окупают рекламные вложения и выходят, в лучшем случае, в 0.

2
Ответить

Автор молодец, сделал адекватные выводы из проделанной работы.

Но только среди тех метрик, которые автор показал, я не увидел самой главной - удержание пользователей на первый/третий/седьмой день.

1
Ответить

Спасибо за комментарий! Да, действительно забыл добавить удержание пользователей в пост.

1
Ответить

Комментарий недоступен

1
Ответить

Спасибо :)

Ответить