Создание 3D-моделей для мобильной игры: опыт Playkot

Сложности работы с аутсорсерами и ограничения платформы.

В закладки

На конференции DevGAMM 2017 разработчики Age of Magic из компании Playkot рассказали о создании 3D-моделей персонажей для мобильной игры на всех этапах разработки: от идеи до оптимизации. Редакция DTF расшифровала выступление.

Даниил Козловский: Я арт-лид в проекте Age of Magic. Это игра для мобильных устройств от Playkot, которая напоминает карточную. Но у нас настоящие герои со своими способностями и внешним видом. Их можно собирать и прокачивать в сюжетной кампании, PvP и других активностях.

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

Самое сложное для нас — это создание арта. В игре порядка 70 персонажей и производство каждого из них занимает 1-1,5 человеко-месяца. Производственный процесс завязан на сотрудничестве с аутсорсерами, что накладывает определённые риски, ведь идея должна быть максимально понятной для тех, кто работает вне основной команды.

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

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

{ "items": [{"title":"","image":{"type":"image","data":{"uuid":"9ef04a30-3fa6-7c70-0b00-ffb828e180a5","width":1024,"height":576,"size":172389,"type":"jpg","color":"","external_service":[]}}},{"title":"","image":{"type":"image","data":{"uuid":"1809ab33-cc18-9d2b-a0ab-32f331f3a358","width":1024,"height":576,"size":167407,"type":"jpg","color":"","external_service":[]}}},{"title":"","image":{"type":"image","data":{"uuid":"605e8565-ff1a-4d4b-2297-16472384d0b2","width":1024,"height":576,"size":161550,"type":"jpg","color":"","external_service":[]}}}] }

При переходе от 2D к 3D моделлер может неправильно уловить пропорции, исказить характер или силуэт. Поэтому мы стали использовать 3D-скетч — быстрый, черновой «скульпт», который делает сам концепт-художник в программе ZBrush. На его пропорциях и силуэте будет базироваться финальная модель. Скетч делают без лишних деталей и подробных текстур.

Имея на руках такую модель, мы сразу можем осмотреть её в игре. ZBrush позволяет оптимизировать количество полигонов в ней с нескольких миллионов до нескольких тысяч. На этом этапе, пока не начался долгий и дорогой процесс изготовления финальной модели, ещё можно что-то поправить.

{ "items": [{"title":"3D-\u0441\u0435\u043a\u0442\u0447","image":{"type":"image","data":{"uuid":"7a929b3b-937e-0c61-8b1a-44f543f29312","width":1024,"height":576,"size":93761,"type":"jpg","color":"","external_service":[]}}},{"title":"3D-\u0441\u043a\u0435\u0442\u0447","image":{"type":"image","data":{"uuid":"c9aee6f6-b21c-ad04-2878-d38150a784ea","width":1024,"height":576,"size":105615,"type":"jpg","color":"","external_service":[]}}},{"title":"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043c\u043e\u0434\u0435\u043b\u0438 \u043d\u0430 \u0430\u0440\u0435\u043d\u0435","image":{"type":"image","data":{"uuid":"4ad284cb-0896-bfab-af04-54403d29634e","width":1024,"height":576,"size":143851,"type":"jpg","color":"","external_service":[]}}},{"title":"\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0447\u0435\u0440\u043d\u043e\u0432\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438","image":{"type":"image","data":{"uuid":"b43daf31-e2ad-41c3-fbc0-57fce7deddc9","width":1024,"height":576,"size":161276,"type":"jpg","color":"","external_service":[]}}},{"title":"\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 3D-\u0441\u043a\u0435\u0442\u0447\u0430 \u0438 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438","image":{"type":"image","data":{"uuid":"959e03e5-a0ed-ec8c-4e7e-518d6472ecf7","width":1024,"height":576,"size":184738,"type":"jpg","color":"","external_service":[]}}},{"title":"\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 3D-\u0441\u043a\u0435\u0442\u0447\u0430 \u0438 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438","image":{"type":"image","data":{"uuid":"7c399ff0-0197-cf1a-31ba-02db7dcdf2eb","width":1024,"height":576,"size":120958,"type":"jpg","color":"","external_service":[]}}}] }

Мы получаем 3D-скетч на пятый день работы над персонажем, а готовый продукт — только через месяц. Весь период производства модели мы спокойны за её качество и за то, как она впишется в мир игры.

Иногда с помощью 3D-скетчей мы создаём прототипы анимаций, чтобы продумать некоторые нюансы. Такие черновики позволяют нам также увидеть некоторые неожиданные проблемы с дизайном героев.

Например у нас есть персонаж, которого зовут Магнус. Мы предполагали, что его крылья будут постоянно раскрыты. Но на арене они перекрывали других героев. Тогда мы решили, что крылья Магнуса будут появляться в процессе анимации и атак.

{ "items": [{"title":"\u041c\u0430\u0433\u043d\u0443\u0441","image":{"type":"image","data":{"uuid":"1994af58-5a28-f792-a6b4-b20f2b4736f7","width":1024,"height":576,"size":61851,"type":"jpg","color":"","external_service":[]}}},{"title":"\u041c\u0430\u0433\u043d\u0443\u0441 \u043d\u0430 \u0430\u0440\u0435\u043d\u0435","image":{"type":"image","data":{"uuid":"163c4521-c4ec-c369-2061-3aa3a8dcda35","width":1024,"height":576,"size":173704,"type":"jpg","color":"","external_service":[]}}}] }

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

В конце производственной цепочки мы имеем отличное техническое задание для тех, кто будет работать над героем дальше. Оно состоит из описания героя, 3D-скетча, детализированного 2D-арта, тестовых анимаций и раскадровок. Такой подход позволяет минимизировать риски на следующих этапах создания модели.

{ "items": [{"title":"","image":{"type":"image","data":{"uuid":"eb6a5847-d07e-ed98-4cf9-e046f0fa6792","width":1024,"height":576,"size":96458,"type":"jpg","color":"","external_service":[]}}},{"title":"","image":{"type":"image","data":{"uuid":"2c6c5e2b-5496-9b99-16e2-d480fec6ca2f","width":1024,"height":576,"size":108154,"type":"jpg","color":"","external_service":[]}}},{"title":"","image":{"type":"image","data":{"uuid":"7b5edc24-b4b5-9210-c9e3-cc7da70fb6e4","width":1024,"height":576,"size":116892,"type":"jpg","color":"","external_service":[]}}}] }

Антон Ивичев, глава 3D-продакшна: я расскажу, что идёт после 3D-скетча и какие критерии качества мы предъявляем к финальной высокополигональной модели.

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

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

{ "items": [{"title":"","image":{"type":"image","data":{"uuid":"4c9fe915-474a-6122-25a3-92b7596e10d3","width":1024,"height":576,"size":87838,"type":"jpg","color":"","external_service":[]}}},{"title":"","image":{"type":"image","data":{"uuid":"23865cb3-acf1-3353-11eb-02798dc90483","width":1024,"height":576,"size":93480,"type":"jpg","color":"","external_service":[]}}},{"title":"","image":{"type":"image","data":{"uuid":"54b4caea-604f-37a1-799d-f9e70bf1385a","width":1024,"height":576,"size":97694,"type":"jpg","color":"","external_service":[]}}}] }

У высокополигонального «скульпта» более 20 миллионов полигонов, а на его создание уходит пять дней. Здесь помогает использование заранее заготовленных деталей (таких как руки и ноги) и то, что многие модели делаются на аутсорсе.

Следующий этап — создание упрощенной версии героя. В Age of Magic она состоит из 4-6,5 тысяч полигонов. Именно эту модель позднее добавят в игру, поэтому необходимо продумать точки артикуляции и оптимизировать её с сохранением визуального качества.

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

Дальше идёт этап «запекания», в результате которого мы получим карту нормалей, передающую рельеф персонажа. Обе версии модели изначально делаются в одной позиции в программе xNormal. Мы выставляем область «запекания» и получаем фиолетовую карту — нормаль.

Теперь можно приступать к текстурированию. Здесь мы не ограничиваем художников какой-то программой — в любой из них можно достичь необходимого результата. Исходные текстуры делаются в 4К, а в игру они попадают в разрешении 1024px. В движке они собираются в шейдер, и мы получаем финальный результат.

{ "items": [{"title":"","image":{"type":"image","data":{"uuid":"874d4e10-b7f2-257b-42d2-67705da315f0","width":1024,"height":576,"size":111182,"type":"jpg","color":"","external_service":[]}}},{"title":"\u00ab\u0417\u0430\u043f\u0435\u043a\u0430\u043d\u0438\u0435\u00bb","image":{"type":"image","data":{"uuid":"ddef5dfc-09df-4590-dd08-1e14084c4222","width":1024,"height":576,"size":169498,"type":"jpg","color":"","external_service":[]}}},{"title":"\u0421\u0431\u043e\u0440 \u043a\u0430\u0440\u0442 \u0432 \u0448\u0435\u0439\u0434\u0435\u0440","image":{"type":"image","data":{"uuid":"452d100c-fb00-8e1b-0773-4b5afd381b6c","width":1024,"height":576,"size":131925,"type":"jpg","color":"","external_service":[]}}}] }

Затем идет риггинг, а потом — скиннинг — привязка низкополигональной модели к скелету. На первом этапе автоматизировать процесс помогут скрипты, а на втором— плагин ngSkinTools.

Для оптимизации мы используем влияние двух костей на один вертекс — вершину полигона. Такой подход хорошо показывает себя в мобильных играх и, как правило, работает на всех персонажах.

Однако у Магнуса «гнулись» крылья, когда он их открывал. Сейчас мы планируем проводить тесты, чтобы посмотреть, как сильно пострадает производительность при использовании влияния четырёх костей на один вертекс.

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

Начнем со сборки. На мобильных устройствах «размер» приложения влияет на скорость загрузки, на то, как быстро разряжается телефон или планшет и на то, как много людей скачают вашу игру. Если взять готовые ассеты, то каждый персонаж будет «весить» около 73 мегабайт. Умножаем это на 70 героев и получаем порядка пяти гигабайт. Это слишком много для мобильной игры.

{ "items": [{"title":"","image":{"type":"image","data":{"uuid":"8d6c9ca5-5689-9e46-6193-514510cdbb91","width":1024,"height":576,"size":113663,"type":"jpg","color":"","external_service":[]}}},{"title":"","image":{"type":"image","data":{"uuid":"8516b11c-567a-74bb-cee4-9e63d2dc0e35","width":1024,"height":576,"size":102777,"type":"jpg","color":"","external_service":[]}}}] }

Для компрессии непрозрачных текстур на устройствах от Apple мы выбрали PVRTC. Этот метод даёт хорошее сжатие. Текстуры с альфа-каналом мы используем только для эффектов. Они проигрываются быстро, поэтому тут тоже можно использовать PVRTC. Однако если вам критично качество, то можно выбрать другой формат, использовать специальный шейдер и упаковывать «альфу» отдельно от основной компоненты, а можно оставить полноцветную текстуру и уменьшить её размер.

В случае с Android всё гораздо сложнее. На этой операционной системе работает множество устройств, для каждого из которых оптимален свой формат компрессии. Мы собираемся написать специальный скрипт, который займётся созданием сборок на разные устройства. Для этого в Unity есть возможность выбрать Texture Compression. Скрипт же позволит Google Play проверять все возможные версии приложения, и предлагать ту, которая поддерживается устройством.

{ "items": [{"title":"","image":{"type":"image","data":{"uuid":"43728b0b-68a9-bcad-aa2e-d7e81cc97ab2","width":1024,"height":576,"size":160958,"type":"jpg","color":"","external_service":[]}}},{"title":"","image":{"type":"image","data":{"uuid":"72fb19ff-6728-8528-af52-c8c5355e7964","width":1024,"height":576,"size":110134,"type":"jpg","color":"","external_service":[]}}}] }

Следующий момент — это MIP-текстурирование. Оно помогает снизить нагрузку на графическое ядро, устранить «шумы» и положительно влияет на энергопотребление.

Для компрессии анимации и звука мы используем встроенные средства Unity. Инструмент Keyfame Reduction даёт очень хороший результат: он «сжимает» исходные данные в шесть-восемь раз. Если важен момент проигрывания звука, то мы используем Vorbis, потому что MP3 запускается с задержкой порядка 30 миллисекунд.

В итоге каждый персонаж занимает до 5 мегабайт. 70 героев в таком случае будут «весить» около 350 мегабайт.

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

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

Мы отказались от постпроцессинга, но встроили соответствующие этапы в шейдер. Вместе с настройками освещения это позволяет добиваться разных «погодных эффектов» или смены времени суток на арене.

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

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

{ "items": [{"title":"","image":{"type":"image","data":{"uuid":"05015e30-8c55-2fcc-c62b-6ff75c45bdf9","width":1024,"height":576,"size":165396,"type":"jpg","color":"","external_service":[]}}},{"title":"","image":{"type":"image","data":{"uuid":"84ea74e6-4f60-bef7-4a5d-6711509bd7e4","width":1024,"height":576,"size":154338,"type":"jpg","color":"","external_service":[]}}},{"title":"","image":{"type":"image","data":{"uuid":"565fa05b-b9bd-fd11-b029-07506e6446b1","width":1024,"height":576,"size":99215,"type":"jpg","color":"","external_service":[]}}},{"title":"","image":{"type":"image","data":{"uuid":"9444a869-09b6-a919-0bf9-98eb51b00ef8","width":1024,"height":576,"size":96176,"type":"jpg","color":"","external_service":[]}}},{"title":"","image":{"type":"image","data":{"uuid":"9d9163f0-d794-8b1c-dc54-1a835b1dcf84","width":1024,"height":576,"size":94966,"type":"jpg","color":"","external_service":[]}}},{"title":"","image":{"type":"image","data":{"uuid":"0f72f940-4308-75ca-a464-b08afc12681c","width":1024,"height":576,"size":74026,"type":"jpg","color":"","external_service":[]}}}] }

Вопрос из зала: Можете ли вы подробнее рассказать о сроках выполнения работ на каждом этапе?

Даниил Козловский: Процесс создания концепт-арта у нас занимает неделю или полторы, в зависимости персонажа. Этому, конечно, предшествуют некоторые дизайнерские поиски.

Антон Ивичев: на высокополигональный «скульпт»уходит примерно пять дней, а низкополигональный — четыре. Ещё столько же времени тратится на текстурирование и риггинг. Анимация и скиннинг требуют примерно неделю.

#арт #опыт

{ "author_name": "Андрей Верещагин", "author_type": "editor", "tags": ["\u0430\u0440\u0442","\u043e\u043f\u044b\u0442"], "comments": 14, "likes": 50, "favorites": 21, "is_advertisement": false, "subsite_label": "gamedev", "id": 8248, "is_wide": false }
{ "id": 8248, "author_id": 22254, "diff_limit": 1000, "urls": {"diff":"\/comments\/8248\/get","add":"\/comments\/8248\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/8248"}, "attach_limit": 2, "max_comment_text_length": 5000 }

14 комментариев 14 комм.

Популярные

По порядку

Написать комментарий...

EK

9

Интересно и информативно! Побольше бы таких статей и презентаций!

Ответить

StealerSlain

3

Зачем использовать xNormal в 2к17, если существуют прекраснейшие и незаменимые Substance Painter и Marmoset Toolbag, у которых инструментарий для запекания в разы шире?

Ответить

Anton Ivichev

StealerSlain
3

Добры день) всё верно говорите. Запекание у нас проходит не только в Xnormal сейчас, но по ряду причин, в том числе спешке, в процессе препродакшена внутри офиса он был основным для запекания. Сейчас мы расширяем инструментарий, а также не ограничиваем аутсорсеров в этом вопросе. Лекция на Девгамме уже немного устарела, совсем недавно её обнавлённая версия была представлена на Unite https://www.youtube.com/watch?v=eL_qcOAbt7w&index=73&list=PLX2vGYjWbI0Rzo8D-vUCFVb_hHGxXWd9j

Ответить

Сергей Бровков

StealerSlain
1

А что с качеством/скоростью/доступностью?

Ответить

Alexander Artamonov

StealerSlain
0

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

Ответить

Anton Ivichev

4

Спасибо dtf.ru за статью! Было очень приятно увидеть её. Все желающие посмотреть видео из лекции, могут найти нашу обновлённую версию с Unite здесь: https://www.youtube.com/watch?v=eL_qcOAbt7w&index=73&list=PLX2vGYjWbI0Rzo8D-vUCFVb_hHGxXWd9j

Ответить

Jack Savage

2

Отличная работа, полезные знания. Спасибо

Ответить

Александр Болуженков

1

Обычно все риски работы с оутсорсером связаны с тем что сперва клиент готов платить крайне не большую сумму, а сам подрядчик, потом еще срезает часть не малую когда находит исполнителей фрилансеров. Исполнитель который плохо передает пластику, формы, идеи концепта - плохой исполнитель)

Ответить

Anton Ivichev

Александр
0

Верно, по этой причине 3д скетчи мы используем только на аутсорсе. Более опытные 3д художники работающие в офисе, выполняют модель сразу с 2д наброска на нужном уровне. Вопрос цены-качества всегда актуален. Наша цель сейчас не простая: маленькой командой (от 7 на старте до 19 сейчас человек), за год с небольшим выпустить игру отличного качества с умеренным бюджетом. И данный пайплайн нам очень помогает сейчас.

Ответить

Марк Апросин

0

Я бы про Color Grading хотел бы побольше услышать. Статья крутая и ребята качественную игру делают.

Ответить

Марк Апросин

0

И все равно в итоге игра будет весит "непростительные" 500 метров минимум. В итоге скорее всего сделают ланчер в 15 мегабайт который будет приветствовать игрока экраном загрузки

Ответить

Valentin Kirillov

0

Карту спека можно хранить в синем канале нормалки без потерь качества. Минус одна х1024 текстура на каждом персе.

Ответить

Anton Ivichev

0

Вы правы, именно так мы планируем упаковать текстуры в финальной сборке(чб. по каналам). Сейчас в спешке разработки ещё не добрались. Но спасибо за дельное замечание.

Ответить

Sergey Kopov

0

Расскажите, пожалуйста, подробнее как вы работаете с ASTC сжатием на iOS. Нельзя же делать два разных билда как на Android. Как вы поддерживаете модели выше и ниже iPhone 6?

Ответить
0

Прямой эфир

Подписаться на push-уведомления
[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjog" } } }, { "id": 10, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-250597-0", "render_to": "inpage_VI-250597-0-1134314964", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=clmf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Плашка на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudo", "p2": "ftjf" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvc" } } } ]