Перейти к содержимому

Playable пустой экран Unity Ads: что проверить

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

Опубликовано
7 мин чтения
7 мин чтения
English
Українська
В статье
  1. Восемь проверок в одной таблице
  2. 1. Ссылка на ассет по пути или URL
  3. Остальные семь проверок: что это за пункты
  4. 2. Сетевые запросы
  5. 3. MRAID: ждите ready и видимость
  6. 4. Старые Android, iOS 13 и polyfill
  7. 5. Ошибки в консоли
  8. 6. Поворот экрана
  9. 7. Минификация и размер
  10. 8. Проверка только в десктопном браузере
  11. Что в доках не сказано

Когда 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

1. Ссылка на ассет по пути или URL

Это единственный пункт, где 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.

2. Сетевые запросы

Согласно спецификации, playable работает без сетевых запросов (XHR) и не может подгружать с сервера картинки, конфиг или другой контент во время показа. Unity может разрешить аналитические вызовы, которые собирают данные о действиях игрока, но без персональных данных. Свою атрибуцию (старт, просмотр, клик) playable не шлёт: это Unity считает на своей стороне. В проверках модерации то же правило: никаких XHR, кроме разрешённых аналитических вызовов.

Как проверить: откройте файл в браузере с DevTools на вкладке Network, перезагрузите страницу и посмотрите, что кроме самого документа ничего не запрашивалось. Затем включите режим Offline и перезагрузите ещё раз. Если playable в офлайне ведёт себя иначе, что-то подтягивалось по сети: шрифт по URL, JSON с настройками, скрипт счётчика.

3. MRAID: ждите 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) и убедитесь на устройстве, что оба срабатывают.

4. Старые Android, iOS 13 и polyfill

Минимальные версии по спецификации: Android 5 и iOS 13. В списке модерации есть отдельная строка: контент не должен иметь проблем с polyfill для старых версий Android. Какие версии webview стоят на устройствах, Unity не пишет, и что именно считается «проблемой polyfill», тоже.

Как проверить: проверьте целевой уровень JavaScript в сборщике и поищите в итоговом коде свежие методы, например .at( или structuredClone(, которых нет в старых webview. Если подключаете polyfill, проверьте, что он сам не ломает старт. И запустите на самом старом устройстве, какое у вас есть.

5. Ошибки в консоли

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

Как проверить: на десктопе откройте DevTools, перезагрузите страницу и проверьте консоль сразу после загрузки, после первого тапа и после поворота. Доступна ли отладка webview в Ad Testing app, Unity не описывает. Поэтому для отладочной сборки выведите window.onerror прямо на экран, а в боевой этот вывод уберите.

6. Поворот экрана

Playable должен работать в портретной и альбомной ориентации из одной адаптивной сборки и подстраиваться при смене размера и ориентации. На странице Rejected среди частых причин реджекта: реклама некорректно работает при переключении между портретом и альбомом. Отдельные горизонтальный и вертикальный файлы Unity помечает как устаревающие, но уже загруженные продолжают работать.

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

7. Минификация и размер

В проверках модерации: код минифицирован, а не раскрыт, файл меньше 5 МБ. Спецификация расшифровывает минификацию так: убраны пробелы, имена сокращены. Best practices добавляют: playable должен загружаться и дойти до первого действия меньше чем за 2 секунды на устройстве среднего класса. Что считается «средним классом», как измеряется загрузка и как считается 5 МБ (десятичные или двоичные), доки не говорят, поэтому берите запас.

Как проверить: wc -c < index.html покажет размер в байтах. Не забывайте, что base64 раздувает вложенные картинки примерно на треть. Откройте файл в редакторе: если он читается как обычный код с отступами, сборку нужно минифицировать.

8. Проверка только в десктопном браузере

Unity прямо предупреждает: десктопный браузер или симулятор не запускает ваш playable в настоящем рекламном юните, и многие частые причины реджекта видны только на реальном устройстве. Поэтому нужны оба шага. Сначала итоговая сборка должна запускаться и без MRAID, чтобы целиком проверить её в десктопном браузере. Потом нужен реальный телефон: дашборд User Acquisition генерирует QR-код для каждого пака креативов: выберите Show QR code и откройте превью в приложении Ad Testing.

На устройстве проверьте поворот во время игры, паузу и возобновление по viewableChange и то, что кнопка CTA открывает нужную страницу в Google Play и App Store. Как устроено приложение Ad Testing за пределами QR-кода, Unity в этих материалах не объясняет.

Что в доках не сказано

  • Нет раздела с разбором пустого экрана и списка его причин, кроме ссылки на ассет.
  • Неизвестно, как модерация тестирует playable.
  • Не указано, в каких версиях webview Unity Ads подставляет MRAID.
  • Нет описания, можно ли смотреть консоль в Ad Testing app.

Если креативов много, видео в DarkCore Ramet загружается один раз и уходит во все нужные апки. В DarkCore Ramet есть Playable Builder.

В DarkCore Ramet

Видео загружается один раз и идёт во все нужные апки

DarkCore Ramet заливает видео в Unity Ads через официальный API: загруженное один раз уходит во все нужные апки.

Все статьи