UnnyWorld: постмортем

Арена с боссами

После закрытия нашей игры UnnyWorld многие разработчики знакомые просили написать постмортем по игре. Решил поделиться конкретными примерами, коих за время разработки накопилось приличное количество. Будут рассмотренные ошибки, которые мы допустили, постараюсь дать парочку полезных советов.

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

Про игру в двух словах

Условно Unnyworld можно разделить на две части: Сити билдер и Арены. Часть про билдер – это некий Clash of Clans. У вас есть своя планета, которую необходимо обустраивать. И вы можете нападать на другие планеты, чтоб красть ресурсы.

Атака на планету

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

Арены – типичная MOBA 3на3 с разными режимами (захват флага, захват точки и т.д).

У каждого персонажа свои спеллы, которые можно комбинировать с другими игроками.

Перед боем можно сменить заклинания.

Выбор спеллов за Мага

Игровой цикл в целом выглядит так: 1) Для прокачки спеллов нужны свитки, которые падают из сундуков. Сундуки можно получить различными бесплатными способами (за лигу, за победу в Бэтл Рояле и т.п.) или купить. 2) Чтоб прокачать спелл, нужно построить и улучшить здание героя до определённого уровня. 3) Для улучшения здания героя нужно улучшать другие здания (главное здание, алтарь и т.д.). Т.е., мы пытались как-то увязать режим планеты и арен. Вероятно, мы делали всё не так.

Отсутствие чёткого плана и стратегии

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

Как следствие, пытались делать всё и сразу. Нужна ли система гильдий, когда в игре полтора пользователя? Хм, вряд ли.

Нужна ли система, позволяющая создать кастомный матч, приглашая туда друзей и согильдейцев, когда в игре маленький CCU? Не уверен.

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

Отсутствие опыта

Т.к. раньше мы работали преимущественно лишь с синглплей играми, то наступили на большое количество грабель при выборе той или иной технологии.

Поговорим немного о технической части вопроса.

Выбор технологий

Небольшое уточнение. По больше части мы чисто клиентские разработчики. Из всей команды только у пары человек был опыт работы с серверными технологиями. Про админство я вообще молчу. Постараюсь по конкретным технологиям пройтись с небольшим summary по каждой.

Какой облачный провайдер использовать? AWS? Azure? Soft Layer?

На тот момент принципиальной разницы не было. Плюс, у нас был кредит на SoftLayer как стартапу.

Oh, boi, если бы вы только знали, как там всё плохо:

-Сапорт особо не разбирается в проблеме. Были случаи, когда я к ним обращался по поводу проблемы на определённой виртуалке (не мог приконнектиться и т.п.). На что получал ответ:

Мы ребутнули машину, теперь всё норм

-Были случаи, когда виртуалка поднималась часами. Как видите, я прождал 4 часа, а виртуалка так и не создалась.SoftLayer_VPS_toooo_loooong

-Частые maintance.

-Бывает, что без предупреждений ребутнут машину, или приватную сеть отрубят.

В итоге перешли на Azure. Таких проблем не было. Сапорт быстро отвечает и всегда помогает в случае чего.

Хорошо:

Плохо: не проанализировали как следует все возможные варианты. А ведь сервера – это важнейшая часть для онлайн игры =/

И так, вам нужно на сервере как-то запускать игровые инстансы, через какую-то систему API перекидывать после авторизации игрока на нужный инстанс. Что же будем делать? А давайте возьмём готовое решение, которое будет само в зависимости от нагрузки менеджить это дело. Ого, тут вон есть штука, называемая Kubernetes. Правда она в бете…Но всё равно, давайте попробуем!

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

Ну ладно, а что ещё есть? Mesosphere и Apache Mesos! С ним всё тоже самое, без опыта сложно. Если что-то отваливается, то без бубна не исправить проблему.

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

Т.е. инстансы всегда предзапущены. При нехватке мы поднимаем новую VPS.

Хорошо: проанализировали альтернативы.

Плохо: потратили много времени на протип. Для первой версии нужно было вообще не думать об этих вещах, а просто стартовать инстансы без всяких апликух поверх. Можно было прям захардкодить адреса инстансов на клиенте в прототипе.

Для сервис дискавери использовали consul.io Это, вероятно, одно из тех решений, о котором не пожалели. Там, правда, бывают проблемы вроде таких, когда при ребуте ломается конфиг. Но это редко и при незапланированном ребуте машины. В целом, за всё время с консулом было работать одно удовольствие.

Хорошо: взяли готовое решение, а не стали пилить что-то сами.

Для развёртывания изначально использовались bash скрипты.

Позже я перевёл весь деплой на Ansible. Не могу нарадоваться и по сей день. Были, безусловно, проблемы на первых порах. Но система довольно проста в изучении, да и документации навалом.

Хорошо: быстро написать bash скрипт, особых знаний не требуется.

Плохо: при переходе на нормальную систему деплоя пришлось выбросить практически всё ранее написанное.

Для общения между своими сервисами пробовали Rabbitmq. Но он просто так не в тему через несколько дней мог просто развалиться. В итоге сделали по-простому – все сервисы взаимодействуют либо посредством чистых tcp сокетов, или http запросами с keep-alive, если нужно запросы слать только в одну сторону.

Хорошо: проанализировали альтернативы. Выбрали неплохое решение.

Плохо: отсутствие опыта работы с технологией. Не нужно в продакшн тащить вещи, которые вы не сможете починить в случае проблем.

Игра онлайн, значит нужен чатик. Самим писать? Вряд ли оно будет масштабируемым. Давайте возьмём что-то готовое. XMPP? Ejabberd? Seems good. Вообще, пробовали и ежа, и MongooseIM, но остановились в итоге на еже. Были некоторые проблемы с поднятием оного на своих серваках (косяки с таймингами в сообщениях, краши и т.п.). Решили использовать их облачное решение https://ejabberd-saas.com/. Да, оно платное. Но работало без проблем.

Хорошо: проанализировали альтернативы. Выбрали подходящий вариант.

Плохо: вместо того, чтобы разобраться в локальных проблемах, решили использовать платное облачное решение. Тарифы там от 200 евро. Регионов у нас игровых было несколько. Для инди команды это выходит в весьма существенную сумму, которую лучше было бы потратить на другие вещи.

На первых порах у нас вообще не было никакой системы по сбору метрик на серваках. Почему запрос тормозит? Что не так с сервисом? Сколько сейчас комнат свободных? Да, мы даже не могли посмотреть, сколько на данный момент свободных комнат!

Позже пришло осознание, что что—то нужно делать. Пробовали использовать Graphite + Grafana. Даже образ до докера делал со всем этим: https://github.com/Suvitruf/docker-grafana-graphite-diamond

Но не сложилось. Не хотелось тратить на это время, решили воспользоваться готовым чем-то. Выбор пал на Datadog.

Всё отлично. Метрки, алерты, графики. Клиентский драйвер почти тот же самый, что и для графита. Красота. Но…10+$ за каждый хост в месяц. Ииии…это выходит в 200+$ в месяц.

Осознание того, что мы просрали на это кучу денег, прошло слишком поздно. Решили, всё же, на своих серверах это делать. Настроили Influx. В итоге одна машина за пару десятков баксов спокойно обрабатывает метрики с десятков/сотен машин.

Хорошо: пробовали сами по-быстрому. Нашли альтернативу готовую. Осознали (хоть и поздно), что решение было ошибочным. Настроили удобную систему локально.

Плохо: как следует не разобрались в вопросе. Потратили много денег.

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

Немного про концептуальные и ГД решения

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

Разделение игры по регионам

Игроки просили азиатский сервер и сервер в Южной Америке (до этого сервера были в Европе и США). Почему бы не сделать, да? Сделали. В итоге полтора юзера размазались по 4 регионам. Раз несколько регионов, то нужно сделать систему трансфера. Логично? Логично.

Хорошо: у пары человек стал лучше пинг (。•́︿•̀。)

Плохо: куча времени потрачено на создание регионов, системы трансфера и т.п.

Слушать советы/предложения игроков необходимо, но не следует сразу бежать и всё это реализовывать.

Замена квадратной сетки на гексы и переделка нападений на планеты

Раньше планеты выглядели вот так:

И нападения:

Старый вариант нападения на планеты

Переход на гексы упростил многие вещи технически. Плюс выглядеть это стало куда лучше, проще работать с элементами игровыми.

Переделана система заклинаний

Раньше выглядело так:

Старая система заклинаний

Сам апгрейд осуществлялся за камни, которые падали из сундуков. Всё было неочевидно, запутанно.

В итоге заменили систему камней на свитки как в Clash Royale.

UnnyWorld Scrolls

Для улучшения заклинания нужно определённое количество свитков. Всё просто и понятно.

Хорошо: заметили проблемное место и переделали.

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

Покупки на Твиче

Мы даже договорились с https://www.twitch.tv/ , чтобы на странице игры можно было совершать внутриигровые покупки.

Но т.к. нашу игру никто не стримил, то смысла в таком решение вообще ноль.

Хорошо: потенциальное место для честного отъёма денег у игроков.

Плохо: если вашу игру не стримят, то смысла в этом нет никакого. Просто впустую потрачено время.

Battle Royale режим

На волне хайпа решили запилит такой режим в игре. Но т.к. онлайн в игре небольшой был, то в этом режиме были практически одни боты, что нивелирует всё на нет.

Про баги

В таком проекте сложно не наделать багов. Было много относительно безобидных GUI багов.

Были баги посерьёзнее, например, когда игроки моментально умирали в центре арены. Повторить этот баг мы так и не смогли локально. Он периодически происходил у игроков, но мы так и не смогли его починить.

Забавный баг, когда при переключении персонажа не удалялась моделька предыдущего. В итоге можно было устроить пати хард.

Были и баги, связанные с платформой/движок.

К примеру, иногда всё GUI могло просто пропасть. Но если зайти в иерархию объектов и просто кликнуть по объекту, то оно снова появлялось.

Мы про эту проблему репортили Unity. Они ответили, что могут нам выделить сотрудника для помощи за 10к$ в месяц ლ(ಠ_ಠ ლ)

На платформе Facebook Gameroom была проблема со скейлом, когда игра реагировала на тачи не в том месте, где они были совершены.

Это, уже не говоря про баги в различных библиотеках. К примеру, на некоторых машинах Steamworks.NET мог падать https://github.com/rlabrecque/Steamworks.NET/issues/121.

Итоги

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

Особо никто не занимался контент менеджментом и общением с игроками, не было никаких рассылок.

Во время разработки было потеряно много времени при выборе и апробации различных технологий.

Не было чёткого плана по реализации фич/контента.

В общем-то, большая часть всех этих проблем из-за неопытности.

Что дальше?

Unnyworld был закрыт. Мы решили сделать проект поменьше в рамках текущих возможностей. Сейчас работаем над айдлером Hero Masters. Будем рады новым бета-тестерам и любому фидбеку.

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

Если есть какие-то вопросы, то с радостью отвечу либо в комментариях, либо в новой статье.