Почему качество сборки имеет значение для Playables
Публикация игры на YouTube Playables не является такой же, как загрузка ее на другие веб-порталы. YouTube проводит свою собственную сертификацию, обязательный технический обзор, который каждая сборка должна пройти, прежде чем она будет доступна. Если сборка не проходит, она возвращается разработчику для исправления, повторной отправки и еще одного раунда обзора. Каждый цикл стоит времени и усилий.
В Mediacube мы проводим предварительное тестирование сертификации для каждой сборки до того, как она попадет на YouTube. Наша команда QA проверила сотни сборок на Unity, Cocos, Phaser, Construct и других движках. Ошибки, перечисленные в этой статье, являются теми, которые мы видим наиболее последовательно во всех студиях, независимо от размера, движка и жанра игры.
Большинство из них можно быстро исправить, как только вы узнаете, на что обратить внимание. Прочитайте это до того, как построите, а не после.
Ошибка #1: Пауза не останавливает игру
Как это выглядит
Когда игрок переключает вкладку, минимизирует приложение или система запрашивает паузу, YouTube Playables отправляет сигнал паузы игре через SDK. Многие игры реагируют на этот сигнал, отображая свой внутренний меню паузы, но основной цикл игры продолжает работать. Физика тикает, таймеры обратного отсчета отсчитывают, анимации продолжают работать. Некоторые интерактивные элементы все еще кликабельны в состоянии паузы.
Другой вариант: Игра визуально замораживается, но очередь ввода во время заморозки. Когда игра возвращается к ней, она выполняет все эти буферизованные действия за один раз — и персонаж внезапно прыгает три раза подряд или стреляет из оружия, которое было нажато во время экрана паузы.
Третий вариант (довольно часто сообщается в нашем QA-пайплайне): Игра правильно отображает внутреннее меню паузы, но кнопки в этом меню полностью кликабельны. Официальная пауза Playables действует, и игрок может использовать это время, чтобы навигировать по меню, изменить настройки или даже перезапустить игру.
Почему она не проходит сертификацию
Контракт паузы SDK Playables строг: когда `ytgame.system.onPause()` срабатывает, игра должна полностью остановиться и не запускать анимацию, физику, обработку ввода и таймеры. Любое отклонение от этого флагируется во время процесса сертификации YouTube.
Контракт паузы SDK Playables строг: когда `ytgame.system.onPause()` срабатывает, игра должна полностью остановиться и не запускать анимацию, физику, обработку ввода и таймеры. Любое отклонение от этого флагируется во время процесса сертификации YouTube.
🛠️ Как исправить
Зарегистрируйте
onPause
колбэк и убедитесь, что он останавливает игровой цикл, заглушает все анимации, отключает обработку ввода и очищает любые очереди ожидания действий. В
onResume
, восстановите состояние с того места, где оно было заморожено: не воспроизводите буферизованные входные данные. Эксплицитно протестируйте это, запустив паузу через
Playables Test Suite
, а не только через свою собственную кнопку паузы в игре.
⚠️ Распространенная ошибка
Считать паузу в SDK YouTube эквивалентной нажатию кнопки паузы в игре. Они не одинаковы. Пауза SDK должна остановить все внутри цикла игрового движка.
Ошибка #2: Состояние без звука не сохраняется
Как это выглядит
YouTube может заглушить аудио игры в любое время через SDK, например, когда игрок смотрит рекламу, переключает контексты или имеет устройство в беззвучном режиме. Игра должна уважать это состояние заглушения и держать аудио выключенным, пока YouTube явно не снимет заглушение.
Наиболее часто встречающиеся режимы отказов:
Сброс заглушения на внутренних событиях. Игра заглушает корректно в ответ на сигнал SDK, но если игрок открывает меню настроек игры, нажимает кнопку перезапуска или переходит на новый уровень, заглушение снимается. Аудио возвращается, хотя YouTube все еще имеет активное заглушение.
Заглушение не сохраняется после перезагрузки страницы. Если страница обновляется, пока игра заглушена (через SDK), игра перезапускается с включенным аудио. Состояние заглушения хранилось в памяти, а не сохранялось, поэтому перезагрузка стирает его.
Внутренняя кнопка заглушения переопределяет заглушение SDK. SDK заглушает игру, но игрок может нажать переключатель аудио в игре, чтобы вернуть звук. Это внутренний контроль, который обходит внешнюю команду SDK.
Почему сертификация не проходит
SDK Playables предоставляет `ytgame.system.isAudioEnabled()`, чтобы проверить текущее состояние аудио, и `ytgame.system.onAudioEnabledChange()`, чтобы слушать изменения. Игры должны полагаться на эти вместо управления своим параллельным состоянием аудио, которое может выйти из синхронизации.
🛠️ Как исправить
Инициализируйте состояние аудио с помощью
ytgame.system.isAudioEnabled()
при запуске игры, до воспроизведения любого звука. Зарегистрируйте
onAudioEnabledChange
и примените новое состояние сразу и глобально, когда оно срабатывает. Сохраните состояние беззвучного режима SDK, чтобы оно сохранилось после перезагрузки страницы: запишите его в
ytgame.game.saveData()
так, чтобы игра могла прочитать его при следующем запуске. Не позволяйте переключателям аудио в игре переопределять состояние SDK; ваша внутренняя кнопка должна работать только тогда, когда у SDK включено аудио.
✅ Список проверки
Тестируйте это конкретно: беззвучный режим через набор тестов, запустите каждое событие в игре (меню, переходы уровней, перезапуски, смерти) и подтвердите, что аудио остается выключенным на протяжении всего процесса. Затем обновите страницу и подтвердите, что оно остается выключенным после перезагрузки.


Learn more
Готовы запуститься на YouTube Playables? Создайте аккаунт и получите все необходимое для публикации, монетизации и роста вашей игры во всем мире. [Начать](https://mcplay.mediacube.io/?utm_source=organic&utm_medium=banner&utm_campaign=blog)
ПодробнееОшибка #3: Прогресс не сохраняется между сессиями
Как это выглядит
Игрок проходит уровни 1-5, закрывает браузер, открывает игру снова — и начинает с уровня 1 или, что еще хуже, с туториала. Никакой прогресс не был сохранен. Игра хранила состояние в localStorage или сессионной переменной, оба из которых стираются при закрытии или недоступны в среде Playables.
Почему это проваливает сертификацию
YouTube Playables не позволяет играм использовать браузерное хранилище или внешние серверы сохранения. Все постоянные данные игры должны передаваться через SDK Playables: `ytgame.game.saveData()` и `ytgame.game.loadData()`. Игры, которые не реализуют это, потеряют прогресс игрока в каждой сессии, что является немедленным флагом отклонения.
🛠️ Как исправить
Замените любой
localStorage.setItem()
/
getItem()
вызовы с
ytgame.game.saveData()
и
ytgame.game.loadData()
. Эти функции принимают сериализированную строку до 3МБ — сериализуйте состояние сохранения в формате JSON, загружайте его при запуске и записывайте его всякий раз, когда достигается значительный прогресс (завершение уровня, контрольная точка, значительное достижение). Не ждите конца сессии, чтобы сохранить и использовать
onPause
в качестве дополнительного триггера сохранения, поскольку игра может быть закрыта из паузы.
💡 Советы профессионалов
Если ваша игра была изначально разработана для мобильных или настольных устройств с облачной системой сохранения или хранилищем устройства, потратьте время на переработку этого. Это один из наиболее распространенных источников задержки при сертификации мобильного порта в Playables.
Ошибка #4: Игра пытается загрузить активы из внешних URL
Как это выглядит
Игра не загружается или загружается частично с пропущенной музыкой, пропущенными визуальными активами или беззвучным аудио при запуске в среде Playables. В браузерной консоли вы видите сетевые ошибки: запросы к внешним CDN, серверам активов, API потоковой музыки или сторонним провайдерам шрифтов, которые блокируются.
Иногда это очевидно (игра была разработана для потоковой передачи саундтрека из внешней службы), а иногда это тонко (веб-шрифт, загруженный из Google Fonts, пиксель аналитики, один спрайт-атлас, размещенный на CDN, который никогда не был включен в сборку).
Почему сертификация не проходит
YouTube Playables работает в изолированной среде. Внешние вызовы API и запросы к внешним доменам не допускаются. Все, что необходимо для запуска игры, должно быть включено в сборку самой по себе. Это включает: аудиофайлы, атласы текстур, шрифты, строки локализации, файлы конфигурации и любые сторонние скрипты.
🛠️ Как исправить
Прежде чем отправить, откройте браузер
Сеть
откройте вкладку и пройдите через игру полностью: экран загрузки, главное меню, игровой процесс, смерть/игра окончена и переходы между уровнями. Отфильтруйте любые запросы, отправляемые в внешние домены. Соберите эти активы локально, или если они являются сторонними сервисами (аналитика, реклама, кроме SDK YouTube), удалите их полностью. Запустите тот же проверку после каждого обновления сборки.
📌 Лучшая практика
The YouTube Playables SDK — единственная разрешенная внешняя зависимость. Все остальное должно быть самодостаточным. Это включает музыку. Если ваша игра использует библиотеку потоковой музыки, вам необходимо включить аудиофайлы непосредственно в сборку.
Ошибка #5: Кнопки вознаграждаемых рекламных объявлений подключены неправильно
Как это выглядит
Разработчик добавил кнопку вознаграждаемой рекламы, часто как позднее дополнение специально для Playables, потому что в оригинальной игре не было механики вознаграждения. Кнопка отображается в интерфейсе пользователя, выглядит правильно, но при нажатии на нее ничего не происходит. Никакая реклама не запрашивается, и никакое вознаграждение не предоставляется. Иногда кнопка запускает визуальный эффект (анимацию нажатия), но вызов `requestRewardedAd()` отсутствует, находится в неправильной точке жизненного цикла или обещание не обработано.
Связанный сбой: вознаграждаемая реклама срабатывает, пользователь смотрит рекламу, но вознаграждение никогда не доставляется — значение `isRewardEarned` не проверяется, или код доставки вознаграждения написан, но никогда не подключается к обработчику кнопки.
Почему сертификация не проходит
Набор тестов для сертификации Playables явно проверяет, что запросы на вознаграждаемую рекламу завершают полный цикл: реклама запрашивается, отображается и вознаграждение условно предоставляется на основе возвращаемого значения. Кнопка, которая не производит рекламу при нажатии, — это сбой сертификации.
🛠️ Как исправить
Если вознаграждаемые рекламные объявления новые в механике вашей игры, не добавляйте их как косметический элемент интерфейса пользователя и не отправляйте на сертификацию. Сначала протестируйте полный поток. Используйте набор тестов Playables в режиме песочницы, чтобы проверить, что запрос на рекламу срабатывает, обещание разрешается, и ветка вознаграждения выполняется. Если ваша игра действительно не имеет механики, поддерживающей вознаграждение (нет валюты, нет системы жизней, нет пропускаемого момента), рассмотрите возможность пропуска вознаграждаемой рекламы, вместо того, чтобы реализовывать сломанный.stub.
🎮 MC Play Insight
Вознаграждаемые рекламные объявления, добавленные в последнюю минуту специально для Playables, являются наиболее распространенным источником сломанных интеграций рекламы, которые мы видим. Если вы дорабатываете эту функцию, уделяйте ей такое же внимание при тестировании, как и основной игровой процесс.


Learn more
Опубликуйте свою игру на YouTube Опубликуйте игры быстрее, управляйте монетизацией, получайте быстрые и безопасные выплаты по всему миру и получайте премиум-техническую поддержку от команды, которая помогает разработчикам расти глобально. [Подать заявку](https://mediacube.io/en/form?form=cta&page=playables)
ПодробнееОшибка #6: Изменения ориентации нарушают макет
Как это выглядит — два варианта
Вариант А: контент обрезается. Игра корректно поворачивается при переключении устройства между портретом и ландшафтом, но элементы, расположенные возле краев, обрезаются. Холст игры масштабируется, но слой интерфейса не меняет свое положение, чтобы соответствовать этому, поэтому кнопки оказываются за пределами безопасной зоны, текст частично скрыт, или игровое окно обрезает контент, который был внутри границ до поворота.
Вариант Б: холст поворачивается, интерфейс нет. Игра корректно адаптирует свой холст к новой ориентации, но иконки, элементы HUD и кнопки остаются на своих исходных пиксельных позициях, которые теперь неверны для новых размеров экрана. На небольшом мобильном экране при переключении в портретный режим кнопка, которая была комфортно размера в ландшафте, становится крошечной и неработающей целью для касания.
Почему это важно
YouTube Playables работает на широком диапазоне устройств и соотношений экранов. Игроки плавно перемещаются между ориентациями. Игра, которая ломается при изменении ориентации, создает разочаровывающий опыт и получит более низкий балл вовлеченности от алгоритма, который напрямую влияет на открытие.
🛠️ Как исправить
Используйте паттерны адаптивного макета: привязывайте элементы интерфейса к краям экрана с помощью относительного позиционирования (проценты или flexbox), а не абсолютных значений пикселей. Тестируйте обе ориентации явно с помощью эмуляции устройств в инструментах разработчика браузера. Обратите внимание на вставки безопасной области на мобильных устройствах: вырез и нижняя панель могут сдвигать доступное пространство между ориентациями. Если ваша игра предназначена только для одной ориентации, явно заблокируйте ее и сообщите об этом при отправке сборки.
📋 Совет по тестированию
Обработка ориентации легко упустить из виду во время разработки, когда вы в основном тестируете на браузере для настольных компьютеров. Включите это в свой стандартный чек-лист тестирования.
Ошибка #7: Игра продолжает работать во время интерstitial-рекламы
Как это выглядит
Междустраничная реклама срабатывает, на экране появляется рекламный оверлей, но игра продолжает работать в фоновом режиме. Игрок не может видеть, что происходит, но игровой цикл остается активным. В головоломке это немного раздражает (таймер тикает, пока игрок смотрит рекламу). В игре-экшене или игре-выживании это ошибка, завершающая сессию: персонаж получает ущерб, враги продвигаются вперед, и к моменту окончания рекламы игрок умирает, не имея возможности отреагировать.
Почему это важно
Междустраничная реклама требует, чтобы внимание игрока было сосредоточено на рекламе, а не на игре. Игра, которая не паузируется во время рекламы, наказывает игрока за монетизационное событие, что является точной противоположностью хорошего игрового опыта. YouTube ожидает, что игры будут паузироваться во время всех рекламных событий.
🛠️ Как исправить
Обрабатывайте запрос междустраничной рекламы так же, как сигнал паузы. Перед вызовом
requestInterstitialAd()
сохраните состояние игры и приостановите игровой цикл. После разрешения обещания (независимо от того, показывалась ли реклама), возобновите. Обрабатывайте ошибки с той же логикой возобновления — игра никогда не должна оставаться в приостановленном состоянии из-за ошибки рекламы.
Шаблон реализации:
- `pauseGame(); //` остановите игровой цикл и вводы
- `try { await ytgame.ads.requestInterstitialAd(); } catch (e) { / обработайте корректно / }`
- `resumeGame(); //` всегда возобновляйте, независимо от результата
🎮 Советы, специфичные для жанра
Это особенно критически важно для survival, endless runner, tower defense и любых жанров в реальном времени, где состояние игры меняется самостоятельно со временем. Если ваш тип игры соответствует этому описанию, тестируйте поток интерstitials явно в условиях игрового процесса.
Ошибка #8: Игра работает только в полноэкранном режиме
Как это выглядит
Игра отображает черный экран, бесконечный цикл загрузки или искаженную компоновку при запуске в стандартном встроенном плеере Playables. Открытие одной и той же сборки в полноэкранном режиме делает все работоспособным. Игра была построена с учетом наличия полноэкранного режима, а плеер Playables не гарантирует этого.
Это часто встречается в сборках, портированных из мобильных приложений, которые использовали запуск в полноэкранном режиме, или из настольных игр, где разработчик всегда тестирует в максимизированном окне браузера.
Почему она не проходит сертификацию
YouTube Playables запускает игры в встроенной контейнере внутри интерфейса YouTube. Игра должна отображаться правильно при любых размерах и соотношении сторон, которые предоставляет контейнер. Полноэкранный режим может быть доступен или нет, в зависимости от устройства, платформы и контекста пользователя. Игра, требующая полноэкранного режима для работы, не может пройти сертификацию.
🛠️ Как исправить
Удалите любое требование полноэкранного режима из инициализации вашей игры. Разработайте компоновку, чтобы она работала с размерами, предоставленными контейнером. Используйте события изменения размера холста и ориентации, чтобы адаптироваться динамически. Тестируйте вашу игру в окне браузера, изменяемом в размерах, в нескольких размерах. Если полноэкранный режим является функцией, которую вы хотите предложить (как опцию, а не требование), реализуйте ее как элемент интерфейса пользователя с возможностью выбора, а не как зависимость от запуска.
Чек-лист перед отправкой
Прежде чем отправить вашу сборку нам для предсертификации, выполните этот список:
Пауза:
Активировать паузу через набор тестов Playables. Подтвердить, что игровой цикл останавливается, анимации замораживаются, вводы блокируются, и никакие запланированные действия не срабатывают после возобновления.
Выключить звук:
Выключить звук через набор тестов. Открыть каждый экран и активировать каждое игровое событие, находясь в режиме без звука. Обновить страницу, находясь в режиме без звука. Подтвердить, что звук остаётся выключенным на протяжении всего процесса.
Сохранения:
Пройти несколько уровней, полностью закрыть браузер, снова открыть и подтвердить, что прогресс был восстановлен с помощью ytgame.game.loadData().
Сеть:
Открыть вкладку Сеть браузера и запустить полную игру. Нулевые запросы к внешним доменам (кроме SDK YouTube). Соединить всё локально.
Видео с наградой:
Если реализовано, нажать каждую кнопку видео с наградой и подтвердить полный цикл: видео запрошено, видео показано (в песочнице набора тестов), награда доставлена.
Ориентация:
Тестировать портретную и ландшафтную ориентацию на эмуляции мобильного устройства. Все элементы интерфейса видны, имеют правильный размер и полностью активны в обеих ориентациях.
Интерстициалы:
Запустите интерстициал во время активной игры. Подтвердите, что игра паузируется до показа рекламы и возобновляется правильно после.
Размер контейнера:
Тестируйте в окне браузера, не находящемся в полноэкранном режиме, при нескольких размерах. Игра должна отображаться правильно без необходимости полноэкранного режима.
Как мы помогаем вам пройти сертификацию быстрее
Когда вы публикуете через Mediacube, мы выполняем полный предварительный проход сертификации, используя нашу внутреннюю платформу MC Play, прежде чем ваша сборка окажется на YouTube. Наша команда QA проверяет каждый пункт в списке выше и обнаруживает проблемы до того, как они станут циклами отклонения.
Наш самый быстрый срок сборки в живую составляет 2 рабочих дня. Хорошо подготовленная сборка без проблем QA обычно становится доступна в течение одной недели. Если во время предварительной сертификации обнаруживаются проблемы, мы предоставляем вам подробный отчет (конкретные ошибки, шаги воспроизведения и рекомендуемые исправления), чтобы ваша команда точно знала, что нужно устранить.
Мы являемся официальным партнером YouTube с 2015 года и публикуем на Playables с сентября 2025 года. Каждая игра в нашем портфеле прошла через этот процесс. Мы знаем, на что обращает внимание команда сертификации YouTube, и знаем, как провести сборки.
Начните разговор и подайте заявку .








