Огромное количество игр построено на сервисной поддержке, будь то тактический шутер Rainbow Six Siege или большая ролевая World of Warcraft. Игроков постоянно вовлекают ивентами, игровыми режимами, картами, персонажами или перками. Но когда в проекте уже сотни и тысячи единиц контента, а релизы ежемесячно — это может стать проблемой для разработчиков. В какой-то момент мы тоже с этим столкнулись в мобильном PvP-шутере и пришлось искать решение. В итоге полностью пересмотрели пайплайн создания контента и оптимизировали процессы так, чтобы одна гугл-таблица заменила нам таск-трекеры. О нашем опыте на проекте с 200 млн инсталлов и 1 млн DAU подробно расскажу под катом. В нашем пайплайне единица контента движется по «линии» этапов и в любой момент — если происходит изменение концепта, модели или чего-то еще, — она может вернуться в нужную точку и заново пройти по всем шагам. Так не появляются непредсказуемые и неутвержденные вещи — все работают только над тем, что попадет в игру. Весь пайплайн разработки контента делится на несколько этапов: Разработка идеи. Ищем, отсеиваем и собираем лучшие идеи контента. Создание 2D-концепта. Рисуем эскизы и концепты. Создание 3D-концепта. Превращаем концепты в 3D-модели. Оптимизация 3D-модели. Оптимизируем и готовим к анимации. Анимирование. Делаем риггинг и оживляем контент. Подключение к проекту. Настраиваем механики, добавляем эффекты и звук. Тестирование. Проводим плейтесты, даем фидбек и устраняем баги. Релиз и сбор статистики. Выпускаем в сторы, работаем с аудиторией, метриками и, если остались, отлавливаем баги. Ревью контента. Следим за игровым балансом и проверяем параметры. Контент проходит каждый этап разработки, но если в работе параллельно несколько десятков единиц оружия, то рано или поздно начнутся проблемы: кто-то одновременно будет моделировать одно и то же, что-то потеряется из виду или пропустит нужный этап. Решить их, как оказалось, можно буквально одной гугл-таблицей.  Чтобы не забегать вперед, последовательно пройдем по всему пайплайну: расскажу о каждом этапе, в каких инструментах работаем, как оптимизируем контент, подключаем его к проекту, тестируем и взаимодействуем друг с другом, а также почему важно не ограничивать свободу творчества.  Сейчас над нашим мобильным шутером Pixel Gun 3D работают более 80 человек. У проекта свыше тысячи единиц контента, сотня карт, десяток онлайн-режимов (включая батлрояль на двух огромных картах) и даже сюжетная кампания. Все разберем на его примерах и кейсах. Добавление нового контента в игру — одна из главных составляющих LiveOps. Проект всегда улучшается на основе аналитики и тестов, большой пласт работы составляет общее улучшение метрик проекта, а также работа с комьюнити. Но обычно игроки обращают внимание именно на контент. В любых играх-сервисах к каждому обновлению игры принято готовить цикличный пак контента (сейчас это называют сезоном). Он состоит из тематики, сюжета, батлпасса, пушек, скинов, карт и много чего еще. Например, недавно Activision выпустила большой апдейт Call of Duty Black Ops: Cold War, в котором главной темой стал Зомби-ивент. Сезоны в Pixel Gun 3D продуманы на 2-3 вперед. Составляется фиксированная сетка, где расписывается, какая тема за какой следует, и что будет внутри: механики, новые режимы, карты и прочее. Контент должен максимально отличаться от представленного в предыдущем сезоне — так он намного привлекательнее для игроков.  Поэтому нужно постоянно находить и генерировать цепляющие идеи. Вдохновение можно встретить и в реальной жизни, но если говорить о проверенных способах, то глобально есть три направления: Анализ популярных трендов на рынке. Проведение арт-конкурсов среди комьюнити. Разработка уникального сеттинга для привлечения внимания. Среди популярных трендов, например, все еще киберпанк, но, вероятно, пик интереса к нему прошел с релизом долгостроя CD Projekt RED. Еще есть ежегодные праздники, в феврале отмечается Китайский Новый год — ивент, когда все добавляют фонарики, красные скины и атрибутику с текущим знаком зодиака. Или 14 февраля, где на пару дней в играх появляются сердечки, купидоны и тому подобное. Трендом может стать не только сеттинг или отдельно взятый праздник, но и игровой режим. Например, Imposter по мотивам Among Us. Про него выпустим отдельный материал — расскажем, как добавляли режим, зачем вообще разработчикам тренды, откуда они берутся и как их применять в своем проекте. Другая хорошая практика — проводить арт-конкурсы среди комьюнити. Игроки предлагают собственные варианты оружия или персонажей, после чего сами же голосуют за лучшие, которые затем попадают в игру. Это вообще win-win ситуация: разработчики собирают новые идеи (иногда присылают даже готовые концепты), а игроки — призы, признание, социализацию и дополнительную вовлеченность. Подобные активности проводятся у нас с 2014 года, когда в игре было порядка 30 пушек. За это время механику проведения конкурсов особо не меняли, поэтому опытные игроки готовятся к ним заранее, а потом отправляют практически готовое ТЗ с описанием механик, параметрами DPS и даже анимациями. Авторы потом получают свои пушки уже в игре вместе с призовой валютой. Хоть это и виралит, в индустрии такое встретишь не часто, обычно потому, что производство контента занимает много времени и ресурсов. Но вполне можно выстроить быстрый и эффективный пайплайн, который позволит разработать единицу контента за считанные дни. Здесь помогает наш гибкий сеттинг игры, где миксуются любые темы: от реалистичных калашей до магических посохов. Поэтому проблем с идеями не возникает. Способ посложнее — придумать уникальную тематику под внутренний праздник или выдуманный ивент, если есть предположения, что она понравится игрокам. Например, мы выпустили сезон разработчиков, в котором сделали карту «Офис». Туда добавили кучу отсылок на наш настоящий офис в Ростове-на-Дону, частично воссоздали интерьеры и дали в них побегать игрокам. Даже если возникают сложности с тематикой, то всегда есть место для экспериментов: за основу взять классическую историю (например, путешествие к центру Земли), добавить в нее новых деталей или скрестить с чем-нибудь еще. Отобранные идеи обсуждаются ведущим геймдизайнером и продакт-овнером. ГД готовит мини-питч по каждой: почему она должна понравиться игрокам, в чем будет ее фишка и так далее. Лучшие идеи попадают в концепт-док с общей канвой обновления: пишется сюжет, раскрываются детали лора и прикрепляются референсы. В дальнейшем это повлияет на мотивацию игроков, обоснование игровых режимов и прочего.  Затем документ передается в концепт-отдел, где стартует реализация. Начиная с этого момента и дальше, арт-отдел может на свой вкус улучшать визуал любой составляющей единицы контента (придерживаясь общей тематики, разумеется). Важно оставлять простор для творчества, чтобы избежать выгорания.  Бывают исключения, когда нужно обыграть конкретный мем или тренд — тогда ТЗ будет жесткое. В остальных случаях главный критерий один — должно быть интересно. Эскизы от руки практически не рисуются, обычно только, когда нужно придумать что-то совсем нестандартное. Из-за особенностей пиксельной стилистики художникам удобнее работать сразу в Photoshop: открыть картинку 100×100 и прямо в ней попиксельно рисовать. Здесь к художникам параллельно подключается кор-команда — она придумывает механики и свойства будущему контенту. Например, лид геймдизайнер в концепт-доке предполагает, что снайперка должна пробивать стены — на основе этого составляется набор фич. Затем думают над способами реализации (самостоятельно готовыми инструментами или привлечением программиста), какие параметры прописывать и так далее — на протяжении всего пайплайна важно следить за изменениями, которые могут на это повлиять. Кроме того, при концептировании художники сразу прикидывают уникальные моменты по анимированию. Если нужно что-то быстро переделать или заменить, 2D-художники примеряют на себя роль специалистов по 3D, что помогает параллельно прокачивать скиллы. Те, кто не знает анимацию — потихоньку учат ее основы; кто не работал с текстурами — пробует текстурировать, и так далее. Разумеется, у каждого своя основная специализация, но при этом любой умеет выдавить, затекстурировать и анимировать, например, оружие. Так не только интереснее работать, но и позволяет специалистам развиваться в разных направлениях. Каждый сотрудник знает весь пайплайн, поэтому когда контент доходит до нужного этапа — многие вещи уже продуманы и учтены. Здесь же формируется сетка по категориям и рекомендованным механикам, которая основывается на анализе продаж прошлых апдейтов (чтобы от сезона к сезону контент не повторялся).  Но вернемся к 2D-концептам. Когда художники заканчивают работу, то на выходе получается примерно такое полотно: Из десятков вариантов выбираются наиболее удачные и дорабатываются. Для примера возьмем эскиз участника арт-конкурса среди комьюнити и сделаем из него оружие. Все пушки должны быть выдержаны в одном стиле. Поэтому выбранный концепт обязательно калибруется: Настраивается плотность пикселей — чтобы концепт не был слишком детальным или, наоборот, грубым. Дорабатывается цвет — чтобы не было плавных градиентов (из-за специфики графики используется по 3-4 оттенка на 3-4 цвета для одной пушки). Подгоняется по цветовой палитре — чтобы ничего не выбивалось (результат сравнивается с рефами по визуалу и будущим эффектам). Когда модель откалибрована — создается подробное ТЗ. Оно, как правило, включает сюжет сезона, связь с предыдущим, лор и описание контента (2D-концепт, механики, свойства, референсы по визуальному стилю и анимациям).  Этот документ помогает на протяжении всего пайплайна. Его читает каждый отдел — все знают общую концепцию сезона, поэтому большинство проблем просто не возникает. К тому же, это эффективно: если не ограничивать никого жестким ТЗ, то часто можно получить результат, который в разы превзойдет первоначальные ожидания. Пример ТЗ на оружие: — Название, класс, тег: Maximum Cruelty (Максимальная Жестокость), Heavy, Weapon1282.— Механика: Заряжаем выстрел, создавая шар перед дулом (пушка раскрывается). После этого происходит мгновенный взрыв в точке прицела. Убитые цели взрываются, нанося дополнительный урон, но уже в меньше области (возможна цепная реакция).— Свойства: Charge Shot / Area Damage / Targets Explode.— Оформление: Нижний подвес (держим, как миниган), энергия внутри пушки постоянно светится (ставим дополнительный материал для свечения в темноте). При перезарядке энергия тухнет до установки батареи. Концепты выбраны, документ составлен, вижен синхронизирован. Значит, можно переходить к созданию 3D-модели.  Утвержденные 2D-концепты попадают в руки 3D-отдела.  Раньше мы использовали 3ds Max, но с ним было много проблем, особенно у новичков. Очень утрированный пример: делали модель не 50 пикселей, а 48 с половиной — потом текстура в 50 пикселей просто не ложилась как надо.  Сейчас перешли на два воксельных редактора: MagicaVoxel и Qubicle (но к 3ds Max еще вернемся). Моделирование в них происходит не сложными формами, а вокселями (что идеально подходит для нашей стилистики). Можно быстро и удобно посмотреть модель в объеме с разных ракурсов и найти проблемные места. В итоге скорость значительно выросла — теперь 3-4 модели проверяются всего за час. Воксельные редакторы сразу дают правильную фигуру — на выходе получается 3D-модель с текстурой (ее потом проще оптимизировать и запечь). У нас есть собственный набор правил и ограничений по работе с 3D-моделью, но из-за специфики графики от них иногда приходится отступать. Начинается нетривиальный процесс придания формы, чтобы модель была не слишком простой, но и не слишком сложной. Не всегда все идет гладко. Иногда пушка в 2D-концепте выглядит круто, а в 3D вообще не цепляет. Именно воксельный редактор помогает ускорить процесс и понять, что делать с моделью: либо довести до ума, либо вернуть на этап 2D-концепта. Бывает, что концепт вообще полностью меняем. Например, сколько бы ни тестили пушку, стреляющую щитом с топорами по типу бумеранга, играть с ней было скучно. Она просто не цепляла. В итоге сделали вместо неё Мьёльнир с совершенно другой механикой и получили совсем другие эмоции от игры. От 3ds Max, конечно, полностью не отказались. Его вместе с Blender и Maya используем дальше для оптимизации и анимации. На этом этапе максимально упрощаем оружие, скашиваем углы и правим ту геометрию, которую не позволял менять воксельный редактор.  Обязательно проводим габаритный тест модели с персонажем, начинаем думать, как будем нарезать, сколько костей добавлять и так далее. А еще обозначаем дополнительные требования к оформлению — здесь может появиться крутая идея, которая сильно поднимет привлекательность для игрока, но сохранит первичную концепцию и стиль. Крайне важно правильно оптимизировать модель. У нас почти в любом мультиплеерном режиме 10 игроков, у каждого есть питомцы, шапки, броня, пушки, гаджеты; они стреляют, вокруг разлетаются частицы, взрываются эффекты и так далее. При этом суммарно мобильный девайс тянет до 200 тысяч полигонов — если ошибемся с одной пушкой и сделаем ее на 5000 полигонов и она станет популярной, то производительности конец. Чтобы этого не происходило, есть ограничения. Например, для оружия рекомендовано 1000 полигонов. В редких случаях на крутую пушку можем выделить 1500-2000 полигонов.  Уменьшить число полигонов, сохранив форму, пиксельность и кубичность можно, но приходится выкручиваться и идти на хитрости. В пушке из примера упростили рога снизу, а верх сделали трапециями. Без этого на модели было бы 2500 полигонов. После запекается текстура. Она должна быть правильной квадратной формы, и чем меньше, тем лучше. Здесь пиксельная стилистика работает в плюс — можно сделать небольшую текстуру 64×64 или 128×128 и вложить туда кучу информации. Тот, кто занимается оптимизацией, заранее думает, какие объекты будут двигаться и что будет задействовано, чтобы впоследствии разделить эти объекты на отдельные меши и зариггать. Обязательно стараемся минимизировать количество костей (пушка, обойма, затвор, гильза и так далее) для аниматоров. У самых сложных пушек доходит до 20, но обычно укладываемся в 10 или меньше. Здесь нужно сделать небольшое отступление и рассказать про еще одну важную особенность. Мы работаем с Git-системой, когда на сервере лежит проект, и все заливают туда изменения. Если два человека возьмут одну и ту же модель, сделают ее локально и начнут загружать — произойдет конфликт версий. Чтобы этого не случилось, каждая единица контента закрепляется за одним сотрудником. Для этого есть отдельная гугл-таблица с контент-планом, где отмечается, кто за что и на каком этапе отвечает. Если контент переходит дальше, то ответственный меняется. Никто ничего в работу не возьмет пока не проверит эту таблицу. В нее, помимо прочего, записывается и другая информация по мере появления: название, теги, описание, механики, свойства и все остальное.  Для удобства можно использовать цветовые маркеры и выделять ячейки: оранжевый — контент в работе; зеленый — готов к тестированию; синий — протестирован и готов к релизу. Одна таблица заменила нам таск-трекеры, в ней же находится ссылка на подробное ТЗ. По сути, сезонный контент находится в рамках двух документов, что сильно упрощает всем жизнь. Особенно тем, кому нужно быстро влиться в рабочий процесс после отсутствия. С организационным моментом разобрались, возвращаемся к разработке.  Когда кор-отдел читает описание пушки, то он сразу прикидывает тайминги, а когда 3D-модель уже практически готова и заапрувлена, то прописывает их в таблице. Каждая пушка в игре имеет точные значения скорости выстрелов и перезарядки — к этому в том числе привязывается анимация.  Аниматор получает задачу сделать пушку, открывает таблицу, просматривает каждый столбец, видит описания, свойства и тайминги — может анимировать.  Анимация делается с помощью тех же инструментов, что и оптимизация (3ds Max, Blender и Maya). Ее у нас несколько видов:  idle (когда персонаж стоит и ничего не делает); стрельба; перезарядка; пустой магазин (стрельба без боеприпасов); лоадинг (взятие пушки из арсенала); анимация профайла (взаимодействие персонажа с пушкой в магазине: крутит, перезаряжает, полирует и прочее). Последняя в списке самая длинная и сложная. Но приносит практическую пользу — работает в качестве витрины и демонстрирует контент игроку со всех сторон. Ее обсуждаем отдельно, но делаем это в самом конце, чтобы не задерживать плейтесты. Жестких условий по анимации обычно нет, есть рефы и тематика (но бывает и строго прописанное ТЗ). Главное техническое условие в анимировании — попасть в тайминги, указанные кор-отделом. Это скорость перезарядки, скорость стрельбы и прочие параметры. Иногда приходится возвращаться к кор-отделу, когда в тайминги не укладывается клевая анимация. Если есть жесткие критерии, то они будут заранее указаны в ТЗ. Например, ракету взрывать с эффектом фаербола, из которого разлетаются улыбки. Такие детали прописаны давно, и когда они доходят до своих этапов и нужных специалистов — переносятся в таблицу с контент-планом и берутся в работу. Иногда нужно сделать специфичное оформление. Например, кибернетический модуль, который раскладывается прямо из руки персонажа, потребовал включить дополнительную цикличную анимацию. Или другой пример — органическая пушка стала выглядеть гораздо лучше, когда к ней добавили анимацию глаза.  В конце этого этапа получается готовый к добавлению в проект контент. У пушки есть основное — анимированная 3D-модель. Теперь осталось навести дополнительную красоту. Контент обязан выглядеть привлекательно не только в лобби, но и в геймплее. На это влияет все и сразу: арт, анимации, эффекты и звуки.  3D-художник, который занимался оптимизацией и анимацией пушки, продолжает с ней работать. Следующий шаг — залить в Git и технически подключить к проекту, чтобы пушка полность работала в игре. Тонкие настройки механики он не выставляет, только приблизительные. Когда все подключено, сообщает об этом геймдизайнеру по кору, FX-дизайнеру и саунд-дизайнеру. Дальше процесс такой:  Саунд-дизайнер предварительно накидывает звуки, ориентируясь на концепт-док и ТЗ. Эффекты берет из библиотек звуков, комбинирует, тюнит, а при необходимости записывает сам. Креатив не ограничиваем, только, как и везде, задаем направление тематикой или описанием пушки, если она специфичная. Следом геймдизайнер настраивает механику: сколько пуль будет в обойме, какие тайминги и параметры. Если механика уже есть в игре, то к процессу вообще не подключается программист — все делается арт-отделом самостоятельно. Если механика новая или старой чего-то не хватает — тут без программиста уже не обойтись. Дальше модель забирает FX-дизайнер и в Unity добавляет эффекты, партиклы взрывов, выстрелов, вылет гильз и остальную красоту. Под конец пушка возвращается к саунд-дизайнеру, который на основе настроенных механик и эффектов корректирует звук. К концу этапа получается готовая единица контента — она замоделена, анимирована, настроена, озвучена и готова к плейтестам. Pixel Gun 3D в этом году исполнится 8 лет. Это большой и сложный проект с сотнями механик и десятками режимов. И с большим легаси. Иногда новый дробовик может сломать кнопку паузы. Я, конечно, утрирую, но что-то подобное в теории возможно. Поэтому важно иметь запас на тестирование. Если нет времени или появились сложности, то в первую очередь нужно браться за то, с чем точно проблем не будет. Например, пока 3D-шники моделят карты, 2D-концептеры перерисовывают проблемные пушки и апдейтят ТЗ. За один день так можно переделать 10-20 вариантов, утвердить и заново отправить в пайплайн. Когда все готово — начинаются первые плейтесты. Контрольная группа с участием арт-лидов, ГД-лида и продакт-овнера проверяет комфорт, качество визуала и геймплея со всем контентом из ближайшего релиза.  Обычно это первый и последний плейтест. После него формируется документ с правками и контент отправляется в нужный этап пайплайна на фиксы. Если правка по звуку, то доходит до саунд-дизайнера, он фиксит; по анимации — к аниматору, и далее по списку. Но чаще всего правки графические: добавить лампочку, блестящий шейдер и подобные визуальные улучшалки. Все это полируется на финальной неделе и уходит в продакшн. Откорректировать тайминг или поменять свойства довольно просто, самое неприятное — менять модель. Это отбрасывает нас в точку получения 3D-концепта и нужно проверять все заново. Но если обнаруживается баг на релизной неделе, то у нас есть понятие «красный коридор» — если все хорошо с анимацией, моделью, звуками, но есть мелкий баг, то пушка минует все ненужные этапы, фиксится, где необходимо и попадает сразу к тестировщикам.  Да, бывают случаи, когда нужно переделать пушку чуть ли не с нуля или заменить на другую, но это 1 раз из 20. И теперь это не критично — даже самый большой апдейт в году (рождественский) стал проходить без запинок. 3D-отдел вообще работает через чат в Slack — отправляют все изменения, рефы и остальное. Все это прямо там же обсуждается текстом, иногда голосом на созвонах. Для программистов такой формат, конечно, не подойдет. Если в коде это вызывает хаос и конкуренцию, то в арте — коллективный творческий процесс. Все друг под друга калибруются, поэтому многие критичные вещи фиксятся еще до первого плейтеста.  В целом, при таком формате стало меньше бюрократии и больше творчества. Поэтому 70-80% контента доходит до плейтеста уже в отличном качестве. Когда все фидбеки учтены, а баги пофикшены — проводится итоговый плейтест перед релизом. Если все хорошо, контент готов отправиться в сторы. Работа над одной пушкой от идеи до финала занимает около месяца. Это не человекочасы, а длина полного цикла пайплайна. Тайминги такие: 2 недели — концептирование и моделирование; 1 неделя — фидбек и правки; 1 неделя — финальные тесты и полировка.  Готовый контент отправляется в ветку Develop, отмечается в таблице и ждет своего часа. Затем происходит релиз и сразу начинается сбор метрик: что лучше продается, что чаще берут в матчах, следим за киллрейтами и собираем различную статистику. Если есть проблема с параметрами оружия, то фиксим ее прямо на сервере, но если что-то глобальное с моделью или эффектами — выпускаем хотфикс.  За этим в том числе следит отдел комьюнити. Собирает фидбеки, работает с аудиторией в отзывах, комментариях, комнатах в Discord. Обязательно нужно учитывать мнение аудитории и работать с лояльностью.  Еще могут возникать неучтенные сочетания механик, сомнительный образ или случайная отсылка на неприемлемое содержание. Но последнее больше актуально в специфических регионах вроде Китая или арабских стран. Это тоже оперативно исправляется. В игре сейчас более тысячи единиц контента: оружие, карты, питомцы, броня и многое другое. Все это нужно сбалансировать между собой, но каждый раз с выходом нового контента подгонять параметры вручную просто нереально. Мы стали искать комплексное решение, что-то автоматизированное и построенное на алгоритмах. И нашли — те же гугл-таблицы. Сейчас постоянно идет фоновая работа: собирается киллрейт всех пушек, и система с помощью формул в гугл-таблицах автоматически показывает отклонения, которые нужно исправить. Расчетные формулы там настолько сложные, что не поместятся на экран монитора, но об этом поговорим уже в другом материале. Пайплайн в разы увеличил скорость разработки. Мы полностью избавились от ситуаций, когда несколько человек заняты одной и той же задачей или переделывают что-то друг за другом. Проблемы с синком решились одной, казалось бы, простой гугл-таблицей — теперь даже десятки видов контента можно делать параллельно без ошибок, овертаймов и недопониманий.  Большинство технических проблем решается еще до их появления. Но если какой-нибудь критический баг все же проскользнет — его можно спокойно пофиксить даже за несколько дней до релиза и не нарушать остальные процессы. Мы также регулярно пробуем разные методы правильной оценки и прогнозирования успешности сезонов. Дошло до того, что в поиске идеала мы уже несколько раз меняли аналитические системы. А прямо сейчас с командой аналитиков и серверных программистов пишем новую консоль с понятными и наглядными метриками для сравнения тем и сезонов, чтобы готовить контент, опираясь не на интуицию, а на цифры — об этом расскажем в отдельной статье. MagicaVoxel — https://www.voxelmade.com/magicavoxel/ Qubicle — https://www.minddesk.com/ Blender — https://www.blender.org/ 3ds Max — https://www.autodesk.ru/products/3ds-max/ Maya — https://www.autodesk.ru/products/maya/ Ведущий геймдизайнер