Integrasi iklan in-game
Terakhir diperbarui: 2026-08-11
Integrasikan iklan Banner, interstitial, dan rewarded melalui bridge host PlayNova. Game Anda berjalan di iframe dan berkomunikasi dengan host via postMessage — jangan sematkan SDK iklan pihak ketiga di paket.
Cara monetisasi bekerja
PlayNova mengisi iklan di sisi host dan membagi pendapatan dengan kreator bersertifikat (default 70% kreator). Game hanya meminta show/load; host menangani inventaris, batas frekuensi, dan pelaporan impression/klik.
Envelope untuk setiap pesan:
{ "source": "...", "type": "...", "payload": { } }- Game harus mengatur
sourcekeplaynova-game - Host membalas dengan
sourceplaynova-host
Format iklan:
- Rewarded — opt-in pemain (revive, hadiah ganda, item gratis). Berikan hadiah hanya setelah
ads.rewarded_completed. - Interstitial — jeda alami (level selesai / game over). Jangan saat input.
- Banner — strip milik host; game hanya meminta show/hide.
Placement yang direkomendasikan
Selalu kirim string placement stabil untuk analitik dan batas. Utamakan nama platform di bawah:
| Placement | Kasus penggunaan |
|---|---|
revive | Lanjut setelah gagal |
double_reward | Bonus akhir level |
free_item / unlock | Consumable atau buka konten |
level_complete / level_start / game_over / pause | Momen interstitial |
banner_bottom / banner_top | Slot Banner |
Alur integrasi
- Pada jeda alami, panggil
ads.load_*denganplacement(danrequestIdopsional). - Tunggu
ads.*_loaded(atau tangani*_faileddan lanjut tanpa iklan). - Panggil
ads.show_*denganrequestId/placementyang sama. - Untuk rewarded, ubah status game hanya pada
ads.rewarded_completed. dismissed/failed jangan beri hadiah.
Jenis pesan bridge
String type kanonik didefinisikan di playnova-web (ads-bridge). Selaraskan paket game dengan nilai persis ini.
Game → host
| type | Tujuan |
|---|---|
ads.load_rewarded | Preload inventaris rewarded |
ads.show_rewarded | Tampilkan rewarded (beri hanya setelah selesai) |
ads.load_interstitial | Preload interstitial |
ads.show_interstitial | Tampilkan interstitial saat jeda |
ads.show_banner | Minta Banner host terlihat |
ads.hide_banner | Sembunyikan Banner host |
ads.preload | Preload beberapa format |
ads.get_banner_height | Tanyakan tinggi Banner untuk layout |
Host → game
| type | Tujuan |
|---|---|
ads.rewarded_loaded | Rewarded siap ditampilkan |
ads.rewarded_failed | Rewarded load/show gagal |
ads.rewarded_completed | Rewarded selesai — aman beri hadiah |
ads.rewarded_dismissed | Rewarded ditutup lebih awal — jangan beri |
ads.interstitial_loaded | Interstitial siap |
ads.interstitial_failed | Interstitial gagal |
ads.interstitial_closed | Interstitial ditutup |
ads.banner_shown | Banner terlihat |
ads.banner_hidden | Banner disembunyikan |
ads.banner_failed | Banner gagal |
Helper salin-tempel
Tempel ke index.html (atau modul). Ganti pemberian hadiah dengan logika game Anda.
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);
});
}
// Contoh: alur 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') {
// beri hadiah HANYA di sini
}
});Aturan production
- Jangan auto-klik, loop paksa, atau tutupi kontrol Close / Skip.
- Jangan beri hadiah tanpa
ads.rewarded_completeduntukrequestIditu. - Hormati kegagalan host: inventaris kosong, lanjutkan game dengan baik.
- Utamakan load sebelum show agar pemain kurang menunggu.
- Paket bebas SDK iklan pihak ketiga, tracker, atau skrip pop-under.
- Frekuensi interstitial ditegakkan host; spam show bisa diabaikan.
FAQ
Bisakah saya pakai AdMob / Unity Ads di zip?
Tidak. PlayNova mengagregasi demand di host. Menyematkan SDK lain gagal review dan melanggar asumsi sandbox iframe.
Bagaimana jika host tidak menjawab?
Anggap diam atau *_failed sebagai no-fill. Lanjutkan gameplay tanpa memblokir pemain dengan spinner tak berujung.
Di mana melihat pendapatan?
Setelah iklan live di production, impression dan pendapatan masuk ke analitik kreator. Penyelesaian sesuai syarat program.
Host bridge live di halaman main. Jenis pesan di atas adalah kontrak production — implementasikan sekarang.
