Коммерческие проекты
Двадцать четыре проекта, и что каждый из них доказывает
Семь лет коммерческой работы, сгруппированные по тому, что они подтверждают, а не по датам. Средний раздел из тех, которые в портфолио обычно опускают: пять проектов, где я ошибся, во что это обошлось и что я изменил после них.
2022-2026
MirraGames: портировано, переписано, выпущено
Шестнадцать из 100+ проектов, над которыми я работал сначала как Senior, а потом как Lead Unity-разработчик. Порты с Android, iOS и Steam в браузеры и альтернативные магазины, полные переписывания там, где исходный код не выдерживал требований площадок, и несколько проектов с нуля.
-
Продукт
MirraSDK
Каждая новая платформа раньше означала удалить один вендорский SDK, импортировать другой и переписать под него вызовы, и так на каждый проект. Я убрал рекламу, платежи, облачные сохранения, аналитику и API платформ за один слой интерфейсов, каждую реализацию вынес в отдельный UPM-пакет, а связывают их три генератора кода на Roslyn при перекомпиляции. Вспомогательный модуль на NodeJS и TypeScript определяет площадку в рантайме, и именно поэтому одна WebGL-сборка обслуживает сразу несколько площадок.
РезультатИнтегрирован в 300+ выпущенных игр, используется 100+ внешними разработчиками. Подключение новой платформы сократилось с нескольких дней до нескольких часов.
-
Порт
Solar Smash
Проект передали, чтобы вывести его на веб-площадки. Я переработал интерфейс вокруг платных элементов, чтобы покупка была осознанным действием, а не результатом поиска, устранил найденные в профайлере утечки памяти и проблемы стабильности и подключил игру к MirraSDK: реклама, платежи, сохранения и API платформ. Firebase и GameAnalytics отправляют одни и те же события, чтобы их можно было сверить, а Adjust сводит доход от рекламы и покупок в один отчёт.
РезультатВыпущено на 20+ платформах. Доработанная сборка вышла и в Google Play, а не осталась только веб-версией, ради которой всё начиналось.
-
Порт
Minetap
Всё лежало во взаимозависимых UPM-пакетах, а основной проект только связывал их между собой: выглядит модульно, ведёт себя как монолит. Я работал с существующей структурой, а не переписывал её: убрал старую монетизацию, оптимизировал ассеты и геймплей сначала под веб как под самую требовательную платформу, потом подключил MirraSDK. Для Android понадобилось то, чего Unity не покрывает, поэтому Java-мосты для нативной отправки ссылки и подключения аккаунта я написал сам.
РезультатСтабильный выпуск более чем на 10 платформах: Google Play и RuStore, CrazyGames и Yandex Games. На альтернативных Android-магазинах более 50 тысяч установок.
-
Переписывание
Bus Simulator
Проект достался рабочим, но монолитным. Площадки продолжали просить функции, которые кодовая база не могла принять, и каждый запрос превращался в рискованную правку где-то совсем в другом месте. Я переписал основной цикл и физику транспорта на внедрении зависимостей с настоящим composition root, чтобы миссии, пользовательские уровни, таблицы лидеров, кастомизация автобусов и сезонные режимы добавлялись, не затрагивая ядро.
РезультатПопал в подборку GameDistribution, около полугода был самым доходным проектом портфолио и перешагнул 2 млн установок.
-
Оптимизация
Pocket Zone
500 МБ оперативной памяти сразу на старте и бюджет кадра, утекающий в Update-циклы, которым нечего было выполнять. Причину нашёл профайлер: локализация выполняла подстановку строк внутри горячих циклов. Async-задачи убрал полностью, потому что веб однопоточный, и заменил их корутинами. Затем переработал интерфейс так, чтобы одна сборка работала и в портретной, и в альбомной ориентации при любом размере окна: в браузере, где окно меняют мышью, это обязательное требование.
РезультатВыпущено на 20+ платформах, больше 100 тысяч игроков на самой успешной из них. Игроки на исходной сборке в Google Play начали спрашивать, почему веб-версия выглядит лучше.
-
Порт
Happy Town
Ещё один проект, собранный из пакетов, зависящих от пакетов, без границы, по которой можно работать, и до меня через него прошло несколько разработчиков. Я решил не переписывать: метрики были в плюсе, аудитория росла, а разделение такого масштаба стоило бы больше, чем проект способен вернуть. Поэтому объём работ ограничил социальными функциями, монетизацией, платежами и оптимизацией, а архитектуру оставил без изменений осознанно, а не по умолчанию.
РезультатВыпущено более чем на 10 платформах, больше 50 тысяч игроков на самой успешной из них, на альтернативных Android-магазинах больше 10 тысяч.
-
Порт
Love Archer
В одном регионе проект приняли, в другом отклонили по содержанию, и дело было в самих персонажах. Перерисовка означала заново затекстурировать всю графику и пересобрать 2D-скелеты и спрайты, потому что замены не совпадали с оригиналами по костям. Команда и QA прошли через это за неделю, и то, что получилось, соответствовало региональным требованиям и не изменило сути игры.
РезультатВыпущено на 10+ платформах, регулярно попадало на главные страницы площадок, больше 500 тысяч игроков на самой успешной из них.
-
Порт
Cat and Granny
Когда у площадки не было документации и туда ещё никто не выпускался, первым я отправлял именно этот проект. Достаточно маленький, чтобы отладить его целиком, и достаточно полный, чтобы проверить рекламу, платежи, сохранения и аналитику на API, которым никто не пользовался. Всё, что потребовалось для выхода, становилось письменной инструкцией, по которой на эту площадку выходил остальной каталог.
РезультатВыпущено на 20+ платформах, больше 100 тысяч игроков на самой успешной из них, и первый релиз на нескольких площадках, которые потом взяли у нас ещё много проектов.
-
Порт
Trap Craft
Проект, на котором я проверял новый пакет, прежде чем он попадал в крупный: медиации Appodeal, IronSource и Clever Ads Solutions, Firebase, Adjust, GameAnalytics, платежи XSolla. То, что выживало здесь, становилось модулем MirraSDK, который команда выбирала из выпадающего списка. Дополнительно полная мобильная адаптация, чтобы одна сборка шла и на альтернативные Android-магазины, и в мгновенные игры, работающие через WebView.
РезультатБольше 200 тысяч игроков на пике. Проект потерял аудиторию, а после обновления стабильности и монетизации вернулся в топ чарта площадки: поэтому я и продолжаю проверять проекты, за которыми никто не следит.
-
Порт
Pixel House
Один проект, проведённый через Google Play, RuStore, OneStore, веб-площадки и Nintendo Switch. Каждой платформе внутри нужно было своё, от схемы управления до обязательных флагов сборки, и на каждую уходило по одной-две недели до сборки, которую подпишет QA и возьмёт в подборку бизнес-команда площадки. Поддержка консоли в SDK и правила портирования управления мои, сами сертификации вели другие разработчики.
РезультатВыпущено более чем на 10 платформах, со стабильным доходом и редкими вмешательствами, больше 50 тысяч игроков на самой успешной из них.
-
Переписывание
End of War
Исходный код был шаблоном на MonoBehaviour начального уровня, без архитектуры как таковой, и не мог принять ту платформенную работу, которую хотел партнёр. Мы переписали его с командой так, чтобы выглядел он идентично, а вёл себя предсказуемо: внедрение зависимостей с понятным порядком инициализации, а дальше монетизация, аналитика и облачные сохранения по нашему стандартному пути. Шейдеры вернулись на встроенный конвейер рендеринга, чтобы старые iPhone в браузере держали кадр.
РезультатВыпущено на 20+ платформах и прожило около года, пока аудитория не ушла дальше. Больше 50 тысяч игроков на самой успешной из платформ.
-
Оптимизация
House Design
Android-сборка на 300+ МБ, рассчитанная на игроков с медленным интернетом и слабыми устройствами, и ни одна веб-площадка такое не примет. Я переписал инициализацию в строгую последовательную загрузку, вынес основную массу ассетов в AssetBundles на CDN и объединил облачные сохранения в отложенные пакеты запросов, чтобы бэкенд не получал запрос на каждое действие. Команда вела от него больше 10 веток под рескины и проверку ниш.
Результат15 МБ начальной загрузки, быстрый старт на самых медленных телефонах, больше 500 тысяч игроков на самой успешной платформе и стабильный доход при редком вмешательстве.
-
Порт
Mangavania
Первый релиз на площадку, которая только запустилась, с API, который никто никогда не описывал. Несколько ночей мы читали запросы и ответы, чтобы понять, чего он ждёт, а я всё это время работал на обе стороны: с инженерами площадки и со своей командой. Игра вышла за неделю, с работающей нативной рекламой и платными экранами.
РезультатСдано в срок при полном отсутствии документации к API, а заметки по нему стали шаблоном для выхода на следующую незнакомую площадку.
-
С нуля
Stickman Broken Bones
Проект был в разработке, когда я пришёл, и вышел вместе с командой. Мой первый проект с нуля в компании и последний до того, как появился единый SDK, поэтому каждый сервис ставился руками: Firebase для аналитики, Clever Ads Solutions для медиации, уровни Android SDK и манифесты поддерживались вручную от релиза к релизу.
РезультатВыпущен более чем на 5 платформах и аудиторию не нашёл. Именно эта ручная работа с интеграциями и есть то, что MirraSDK через год убрал целиком.
-
С нуля
Match 3 для Yandex Games
Новогодний match-3, заказанный за две недели до праздника, где каждая собранная фишка открывает записанное видеопоздравление. Unity WebGL плохо работает с видео, а бюджет по размеру не прощал ничего, поэтому видеоплеер я собрал в WebGL-шаблоне, а не в движке, и связывался с ним через .jslib. Проект вернулся к голым MonoBehaviour без единого лишнего UPM-пакета, а ядро match-3 я написал сам, чтобы в сборке не осталось ничего непредсказуемого.
РезультатИтоговая сборка 7-9 МБ без учёта видео, работает в браузерах на Windows, Android и iOS, играбельная версия сдана за неделю.
-
С нуля
City Driver
MVP за несколько недель: анимированное вступление, урон, который идёт в таблицу лидеров, побочные задания, гараж и прокачка. Первая версия была на голых MonoBehaviour, и я переписал её на модульное внедрение зависимостей с бутстрапом, чтобы машины и локализация грузились через Addressables в рантайме, а не загружался сразу целый гараж разрушаемых автомобилей.
РезультатВыпущено на 20+ платформах, на мобильных показал себя лучше, чем в вебе, больше 50 тысяч установок на самой успешной. Исходный код стал базой для вариантов других разработчиков и материалом для внутренних джемов, где я был судьёй.
Вторая половина
Где я ошибся и что делаю иначе теперь
Этот раздел здесь намеренно. В каждой карточке названо решение, которое было моим, во что оно обошлось и что конкретно я изменил после. Четыре ошибки из пяти относятся к оценке сроков, суждению и процессу, а не к инженерии, и примерно такого соотношения я и жду от человека, который не только делал работу, но и вёл её.
-
Работа над ошибкой
Pixel Combat
Async повсюду, тяжёлые шейдеры и звуковое middleware, которое начинает заикаться при малейшей просадке кадра. Мы заменили всё: корутины и UniTask, простые мобильные шейдеры, встроенный конвейер и гамма, собственная обёртка над обычными AudioClip. Проект заработал на десктопе, а потом и на телефонах, когда я написал свой первый редакторный инструмент для массовой правки настроек импорта. Модерацию он всё равно не прошёл, и бюджет кончился раньше, чем список багов.
Что изменилосьПайплайн импорта и моя привычка к профайлеру выросли из этого проекта. Вторая половина урока важнее: проект может быть технически выполнимым и при этом не стоить своего бюджета, и такое суждение выносят на первой неделе, а не на девятом месяце.
-
Работа над ошибкой
Up or Lava
Сложная часть была сделана. Тяжёлый проект шёл плавно даже в Android WebView, потому что к тому моменту я знал, что именно вырезать и чем заменить всё, чего WebGL не держит. А потом выяснилось, что в основе игры лежит сессионный мультиплеер, а однопоточная браузерная сборка не вытягивает задержки. Совместная игра превращалась не в кооператив, а в телепортацию, и именно это модерация площадок отклоняет первым.
Что изменилосьМы отменили задачу в тот день, когда это доказали, решение было правильным, но принято на несколько недель позже, чем следовало. Теперь я проверяю несущую зависимость на целевой платформе раньше всего остального, а такую задачу сегодня просто не взял бы.
-
Работа над ошибкой
Blackriver
Я держал график тем, что передавал проект тому, кто освободился, и агрессивно ветвил его под кроссплатформенные функции. В дату мы попали. А потом продакшен показал, к чему привела эта передача из рук в руки: сломанные облачные сохранения, пропавшие задания, некликабельные элементы интерфейса, сотни обращений в неделю, и всё это в проекте с покупками и игроками, у которых десятки часов, где формат хранения нельзя поменять, не рискуя их данными.
Что изменилосьЯ подбирал людей по тому, кто свободен, а не по тому, кому задача подходит, и это моя ошибка, а не их. Всё стабилизировалось, как только проект взял подходящий разработчик, и обращения разошлись за несколько месяцев. Теперь людей под проекты я подбираю осознанно.
-
Работа над ошибкой
Hay Farm
Месяц ушёл на подготовку купленного исходного кода, прежде чем я признал его непригодным и начал заново на своей архитектуре. Само переписывание шло хорошо, с работающей экономикой. Я не учёл, что 2D было для меня новой областью, и незнакомая область легла поверх уже потраченного месяца. Проект вышел за срок и был закрыт, когда на руках была крепкая сборка.
Что изменилосьОшибка была в оценке, а не в инженерии. У меня было два отдельных повода сдвинуть дату, и я не озвучил ни одного, а это лишает решения всех остальных. Теперь я прямо и сразу говорю, что объём изменился и дата двигается вместе с ним.
-
Работа над ошибкой
Earthquake.io
Мой первый найм в роли ведущего. Портфолио и собеседование были убедительными, а результат работы показал другое: сборка не держала кадр даже на десктопе, а основные файлы SDK были отредактированы, чтобы игра завелась, и это сломалось бы на ближайшем обновлении. Часть вины моя. В моих правилах нигде не было сказано, что основные файлы трогать нельзя, и на ревью я это не заметил, пока исправить было дёшево.
Что изменилосьЯ записал это правило явно, переписал проект за несколько дней и поменял процесс найма: небольшое оплачиваемое задание по нашим реальным стандартам до договорённости и ранний разговор о том, что в кодовой базе неприкосновенно, а что открыто. Проект вышел, работал плавно и удержал игроков.
2019-2022
TeamGZ: собственные проекты в Google Play
Частичная занятость параллельно с учёбой на маркетинге, в команде из разработчиков, 3D-художников и звукорежиссёров. Здесь моя работа закрывала обе стороны: код, который я писал вместе с остальными разработчиками, и страницы в магазинах, которые вёл я сам.
-
Рост
Серия The Dead Zone
Серия с живой аудиторией, которая перестала расти, и никто в команде не относился к странице в магазине как к самостоятельной части продукта. Вместе с остальными разработчиками я писал геймплей и системный код: контроллер от первого лица, стрельбу, логику миссий. Потом взял на себя вторую сторону: ASO, обложки, которые рисовал и проверял A/B-тестами, тексты в магазине, внутриигровые события и ответы на отзывы игроков вместо того, чтобы их не читать.
РезультатТретья часть перешагнула 1,5 млн установок, у двух предыдущих было 100 и 700 тысяч. Примерно 20 процентов прироста установок объясняются работой с магазином.
-
Рост
Scary Land
Хоррор-спин-офф, сделанный ради одного вопроса: наши игроки приходят за The Dead Zone конкретно или за жанром вокруг неё. Мы прогнали на нём тот же набор приёмов с ASO и A/B-тестами, страница почти не сдвинулась, а игроки продолжали спрашивать про обновления основной серии. Это внятный ответ, и обошёлся он в долю того, во что обошлось бы не то продолжение.
РезультатВырос со 100 тысяч игроков в 2021 году до 250 тысяч к концу 2022 и закрыл вопрос о том, к чему аудитория привязана на самом деле.
-
С нуля
Five Nights at Dr. Livesey's
Сделал один, чтобы выяснить, как быстро можно поймать тренд и сколько это на самом деле стоит. Быстрый прототип против окна, которое закрывается само: без закупки трафика, без A/B-тестов, без работы со страницей в магазине: выпустить и смотреть.
Результат100 тысяч загрузок за неделю при нулевых вложениях, а через несколько месяцев ровная линия. Это самое наглядное доказательство того, как ведут себя трендовые проекты, и причина, по которой я предпочитаю делать то, у чего есть второй месяц.
Личные проекты
Приложение под Android, доведённое до продакшена за два месяца, четыре открытых пакета для Unity и четыре прототипа, каждый под свой вопрос. Если вам ближе коммерческие проекты выше, быстрее всего написать на почту.