Integración de anuncios in-game
Última actualización: 2026-08-11
Integra anuncios Banner, intersticial y rewarded mediante el bridge del host de PlayNova. Tu juego se ejecuta en un iframe y se comunica con el host mediante postMessage — no incorpores SDK de anuncios de terceros en el paquete.
Cómo funciona la monetización
PlayNova sirve anuncios en el host y comparte ingresos con creadores certificados (70 % para el creador por defecto). Los juegos solo solicitan show/load; el host gestiona inventario, límites de frecuencia e informes de impresiones/clics.
Sobre para cada mensaje:
{ "source": "...", "type": "...", "payload": { } }- Los juegos deben establecer
sourceenplaynova-game - El host responde con
sourceplaynova-host
Formatos de anuncio:
- Rewarded — opt-in del jugador (revive, doble recompensa, objeto gratis). Concede recompensas solo tras
ads.rewarded_completed. - Intersticial — pausas naturales (nivel completado / game over). Nunca durante la entrada.
- Banner — franja del host; el juego solo solicita show/hide.
Ubicaciones recomendadas
Pasa siempre una cadena placement estable para analíticas y límites. Prefiere los nombres de plataforma siguientes:
| Placement | Caso de uso |
|---|---|
revive | Continuar tras fallar |
double_reward | Bonus al final del nivel |
free_item / unlock | Consumible o desbloqueo de contenido |
level_complete / level_start / game_over / pause | Momentos intersticiales |
banner_bottom / banner_top | Espacios Banner |
Flujo de integración
- En una pausa natural, llama a
ads.load_*conplacement(yrequestIdopcional). - Espera
ads.*_loaded(o gestiona*_failedy continúa sin anuncios). - Llama a
ads.show_*con el mismorequestId/placement. - En rewarded, modifica el estado del juego solo en
ads.rewarded_completed. En dismissed/failed, no concedas la recompensa.
Tipos de mensajes bridge
Las cadenas type canónicas están definidas en playnova-web (ads-bridge). Alinea tu paquete de juego con estos valores exactos.
Juego → host
| type | Propósito |
|---|---|
ads.load_rewarded | Precargar inventario rewarded |
ads.show_rewarded | Mostrar rewarded (conceder solo tras completar) |
ads.load_interstitial | Precargar intersticial |
ads.show_interstitial | Mostrar intersticial en pausa |
ads.show_banner | Solicitar Banner del host visible |
ads.hide_banner | Ocultar Banner del host |
ads.preload | Precargar varios formatos |
ads.get_banner_height | Consultar altura del Banner para el layout |
Host → juego
| type | Propósito |
|---|---|
ads.rewarded_loaded | Rewarded listo para mostrar |
ads.rewarded_failed | Fallo load/show rewarded |
ads.rewarded_completed | Rewarded completado — seguro conceder |
ads.rewarded_dismissed | Rewarded cerrado antes — no conceder |
ads.interstitial_loaded | Intersticial listo |
ads.interstitial_failed | Intersticial fallido |
ads.interstitial_closed | Intersticial cerrado |
ads.banner_shown | Banner visible |
ads.banner_hidden | Banner oculto |
ads.banner_failed | Banner fallido |
Helper copiar y pegar
Pégalo en tu index.html (o módulo). Sustituye la concesión de recompensa por tu lógica de juego.
function pnAds(type, payload) {
parent.postMessage({ source: 'playnova-game', type, payload }, '*');
}
function onPnHost(handler) {
window.addEventListener('message', (e) => {
const d = e.data;
if (!d || d.source !== 'playnova-host') return;
handler(d);
});
}
// Ejemplo: flujo revive
pnAds('ads.load_rewarded', { placement: 'revive' });
onPnHost((msg) => {
if (msg.type === 'ads.rewarded_loaded') {
pnAds('ads.show_rewarded', {
requestId: msg.payload && msg.payload.requestId,
placement: 'revive',
reward: { type: 'life', amount: 1 },
});
}
if (msg.type === 'ads.rewarded_completed') {
// conceder recompensa SOLO aquí
}
});Reglas de producción
- No auto-clic, bucles forzados ni ocultar controles Close / Skip.
- No concedas recompensas sin
ads.rewarded_completedpara eserequestId. - Respeta fallos del host: inventario vacío, continúa el juego con normalidad.
- Prefiere load antes de show para menos espera al activar.
- Paquetes sin SDK de anuncios de terceros, trackers ni scripts pop-under.
- La frecuencia intersticial la impone el host; spam de show puede ignorarse.
FAQ
¿Puedo usar AdMob / Unity Ads dentro del zip?
No. PlayNova agrega demanda en el host. Incrustar otros SDK fallará la revisión y rompe supuestos del sandbox iframe.
¿Qué pasa si el host no responde?
Trata silencio o *_failed como no-fill. Continúa el juego sin bloquear al jugador con un spinner infinito.
¿Dónde veo los ingresos?
Tras publicar anuncios en producción, impresiones e ingresos van a analíticas de creador. Liquidación según términos del programa.
El bridge del host está activo en la página de juego. Los tipos de mensaje anteriores son el contrato de producción — impleméntalos ahora.
