Требования к playable по сетям: таблица на 2026 год
Требования Unity, AppLovin, Meta и Mintegral к playable: формат, размер, MRAID, ориентация, CTA. Одна сборка на все сети по докам не подтверждается.
PlayableMRAID4 мин чтения

Playable работает локально, а в Unity Ads пустой экран: Unity прямо называет одну причину, ссылку на ассет. Ещё семь проверок из спецификации.

Когда playable не работает в Unity Ads и показывает пустой экран, хотя локально всё запускается, первым делом проверьте index.html на ссылки на ассеты по пути или URL. Только эту причину Unity называет в документации прямо. Остальные семь пунктов ниже — проверки из спецификации и модерации, а не «причины от Unity»: они ломают воспроизведение или ведут к реджекту, но какой из них даёт именно пустой экран, доки не говорят.
| № | Что проверить | Откуда пункт |
|---|---|---|
| 1 | Ссылки на ассеты по пути или URL | Unity называет причиной прямо |
| 2 | Сетевые запросы (XHR) | спецификация, модерация |
| 3 | MRAID ready и видимость рекламы |
спецификация |
| 4 | Старые Android, iOS 13, polyfill | спецификация, модерация |
| 5 | Ошибки в консоли | модерация |
| 6 | Поворот экрана | спецификация, список причин реджекта |
| 7 | Минификация и размер файла | спецификация, модерация |
| 8 | Тест только в десктопном браузере | best practices |
Это единственный пункт, где Unity пишет про пустой экран. На странице спецификации playable сказано: playable, который работает локально, но показывает пустой экран в рекламном юните, обычно всё ещё ссылается на какой-то ассет по пути или URL. Требования к файлу там же: один index.html, меньше 5 МБ, все картинки, аудио и видео внутри в виде base64, никаких ссылок на другие файлы, папки и удалённые адреса. Устройство скачивает с CDN только HTML-файл, всё остальное Unity Ads игнорирует.
Локально это не видно: рядом лежит папка с картинками, и браузер находит ./img/hero.png. В рекламном юните этой папки нет.
Как проверить. Прогоните итоговый файл через grep: он покажет всё, что похоже на ссылку и не начинается с data:.
grep -noE "(src|href)=\"[^\"]{0,60}|url\([^)]{0,60}|https?://[^ \"')]{0,60}" index.html | grep -v "data:"
Разберите каждую строку вывода. Адрес вида http://www.w3.org/2000/svg — это идентификатор пространства имён в SVG, а не запрос. Строки внутри самой библиотеки (движка, аналитики) тоже бывают просто текстом. А вот src="img/hero.png" или url(./font.woff2) — это ровно тот случай, о котором пишет Unity.
Команда не ловит пути, которые собираются в JavaScript: this.load.image("hero", "assets/hero.png"), new Audio("snd/tap.mp3"), fetch("config.json"). Их ищите отдельно по load., Audio(, fetch(, XMLHttpRequest. Как собрать проект, чтобы все ассеты оказались внутри файла, разобрано в статье из HTML5-игры в playable одним index.html.
На странице best practices для playable нет раздела про диагностику пустого экрана и перечня причин. Дальше идут требования спецификации и список проверок модерации. Нарушение любого из них может сломать playable или привести к реджекту, но связь «пункт — пустой экран» здесь наше чтение, не утверждение Unity.
Согласно спецификации, playable работает без сетевых запросов (XHR) и не может подгружать с сервера картинки, конфиг или другой контент во время показа. Unity может разрешить аналитические вызовы, которые собирают данные о действиях игрока, но без персональных данных. Свою атрибуцию (старт, просмотр, клик) playable не шлёт: это Unity считает на своей стороне. В проверках модерации то же правило: никаких XHR, кроме разрешённых аналитических вызовов.
Как проверить: откройте файл в браузере с DevTools на вкладке Network, перезагрузите страницу и посмотрите, что кроме самого документа ничего не запрашивалось. Затем включите режим Offline и перезагрузите ещё раз. Если playable в офлайне ведёт себя иначе, что-то подтягивалось по сети: шрифт по URL, JSON с настройками, скрипт счётчика.
ready и видимостьUnity требует поддержку MRAID 3.0 и поддерживает только полноэкранную рекламу MRAID 3.0. Webview Unity Ads сам подставляет MRAID, поэтому тег со скриптом mraid в playable не нужен. Запускать игру можно только после события ready и только когда реклама видима. Не стартуйте на загрузке страницы: по словам Unity, всё, что крутится до показа, съедает первые секунды игрока и выглядит сломанным. Не поддерживаются expand, resize, свои кнопки закрытия, sms, tel, calendar, storePicture.
Почему это может дать пустой экран — наше предположение, доки об этом молчат: код ждёт событие, которое не пришло, или вызывает mraid там, где его нет, и падает на первой строке. Каркас из спецификации (адаптировано из примера Unity):
// Ждём готовности MRAID, потом настраиваем playable.
if (mraid.getState() === "loading") {
mraid.addEventListener("ready", onReady);
} else {
onReady();
}
function onReady() {
mraid.addEventListener("viewableChange", onViewableChange);
// Стартуем, только если реклама уже видима.
if (mraid.isViewable()) startPlayable();
}
function onViewableChange(viewable) {
if (viewable) startPlayable(); // запуск или продолжение
else pausePlayable(); // пауза и без звука
}
startPlayable() и pausePlayable() в примере Unity не определены, это ваш код. Развёрнутый каркас — в статье про MRAID 3 в playable. Как проверить: добавьте в onReady и onViewableChange вывод на экран отладочной сборки (как window.onerror в проверке 5) и убедитесь на устройстве, что оба срабатывают.
Минимальные версии по спецификации: Android 5 и iOS 13. В списке модерации есть отдельная строка: контент не должен иметь проблем с polyfill для старых версий Android. Какие версии webview стоят на устройствах, Unity не пишет, и что именно считается «проблемой polyfill», тоже.
Как проверить: проверьте целевой уровень JavaScript в сборщике и поищите в итоговом коде свежие методы, например .at( или structuredClone(, которых нет в старых webview. Если подключаете polyfill, проверьте, что он сам не ломает старт. И запустите на самом старом устройстве, какое у вас есть.
В проверках модерации есть пункт: в контенте не должно быть ошибок в консоли. Исключение, брошенное при старте, легко оставляет экран пустым.
Как проверить: на десктопе откройте DevTools, перезагрузите страницу и проверьте консоль сразу после загрузки, после первого тапа и после поворота. Доступна ли отладка webview в Ad Testing app, Unity не описывает. Поэтому для отладочной сборки выведите window.onerror прямо на экран, а в боевой этот вывод уберите.
Playable должен работать в портретной и альбомной ориентации из одной адаптивной сборки и подстраиваться при смене размера и ориентации. На странице Rejected среди частых причин реджекта: реклама некорректно работает при переключении между портретом и альбомом. Отдельные горизонтальный и вертикальный файлы Unity помечает как устаревающие, но уже загруженные продолжают работать.
Как проверить: поверните устройство не до запуска, а посреди игры. Потом ещё раз вернитесь обратно. Смотрите, не пропала ли картинка, не сбросилось ли состояние и не уехали ли кнопки под область, где Unity рисует свои элементы.
В проверках модерации: код минифицирован, а не раскрыт, файл меньше 5 МБ. Спецификация расшифровывает минификацию так: убраны пробелы, имена сокращены. Best practices добавляют: playable должен загружаться и дойти до первого действия меньше чем за 2 секунды на устройстве среднего класса. Что считается «средним классом», как измеряется загрузка и как считается 5 МБ (десятичные или двоичные), доки не говорят, поэтому берите запас.
Как проверить: wc -c < index.html покажет размер в байтах. Не забывайте, что base64 раздувает вложенные картинки примерно на треть. Откройте файл в редакторе: если он читается как обычный код с отступами, сборку нужно минифицировать.
Unity прямо предупреждает: десктопный браузер или симулятор не запускает ваш playable в настоящем рекламном юните, и многие частые причины реджекта видны только на реальном устройстве. Поэтому нужны оба шага. Сначала итоговая сборка должна запускаться и без MRAID, чтобы целиком проверить её в десктопном браузере. Потом нужен реальный телефон: дашборд User Acquisition генерирует QR-код для каждого пака креативов: выберите Show QR code и откройте превью в приложении Ad Testing.
На устройстве проверьте поворот во время игры, паузу и возобновление по viewableChange и то, что кнопка CTA открывает нужную страницу в Google Play и App Store. Как устроено приложение Ad Testing за пределами QR-кода, Unity в этих материалах не объясняет.
Если креативов много, видео в DarkCore Ramet загружается один раз и уходит во все нужные апки. В DarkCore Ramet есть Playable Builder.
Видео загружается один раз и идёт во все нужные апки
DarkCore Ramet заливает видео в Unity Ads через официальный API: загруженное один раз уходит во все нужные апки.
Требования Unity, AppLovin, Meta и Mintegral к playable: формат, размер, MRAID, ориентация, CTA. Одна сборка на все сети по докам не подтверждается.
PlayableMRAID4 мин чтения

MRAID для playable: Unity внедряет его сам. Каркас ready → viewableChange → старт и пауза → mraid.open по тапу на CTA, плюс запуск без MRAID.
MRAIDPlayable5 мин чтения

Playable для Unity Ads: один index.html меньше 5 МБ, base64, MRAID 3.0, без сети, стор по тапу на CTA. Чек-лист по группам и что проверяет модерация.
PlayableМодерация6 мин чтения
