ゲーム内広告連携
最終更新: 2026-08-11
PlayNova ホスト Bridge 経由で Banner、インタースティシャル、リワード広告を連携します。ゲームは iframe 内で動作し、postMessage でホストと通信します — パッケージ内に第三者広告 SDK を埋め込まないでください。
収益化の仕組み
PlayNova はホスト側で広告を配信し、認定クリエイターと収益を分配します(デフォルト クリエイター 70%)。ゲームは load/show のみ要求;在庫、頻度制限、インプレッション/クリック報告はホストが処理します。
すべてのメッセージのエンベロープ:
json
{ "source": "...", "type": "...", "payload": { } }- ゲームは
sourceをplaynova-gameに設定する必要があります - ホストは
sourceplaynova-hostで応答します
広告フォーマット:
- リワード — プレイヤーのオプトイン(復活、報酬2倍、無料アイテム)。
ads.rewarded_completed後のみ報酬を付与。 - インタースティシャル — 自然な区切り(ステージクリア / ゲームオーバー)。操作中は表示しない。
- Banner — ホスト所有の帯;ゲームは表示/非表示のみ要求。
推奨配置
分析と上限のため、常に安定した placement 文字列を渡してください。以下のプラットフォーム名を推奨:
| Placement | 用途 |
|---|---|
revive | 失敗後の続行 |
double_reward | ステージ終了ボーナス |
free_item / unlock | 消耗品またはコンテンツ解除 |
level_complete / level_start / game_over / pause | インタースティシャル表示タイミング |
banner_bottom / banner_top | Banner スロット |
連携フロー
- 自然な区切りで
ads.load_*をplacement(任意でrequestId)付きで呼び出す。 ads.*_loadedを待つ(または*_failedを処理し、広告なしで続行)。- 同じ
requestId/placementでads.show_*を呼び出す。 - リワードは のみ
ads.rewarded_completedでゲーム状態を変更。dismissed/failed では報酬を付与しない。
Bridge メッセージタイプ
正規の type 文字列は playnova-web(ads-bridge)で定義されています。ゲームパッケージはこれらの値と厳密に一致させてください。
ゲーム → ホスト
| type | 目的 |
|---|---|
ads.load_rewarded | リワード在庫をプリロード |
ads.show_rewarded | リワードを表示(完了後のみ付与) |
ads.load_interstitial | インタースティシャルをプリロード |
ads.show_interstitial | 区切りでインタースティシャルを表示 |
ads.show_banner | ホスト Banner の表示を要求 |
ads.hide_banner | ホスト Banner を非表示 |
ads.preload | 複数フォーマットをプリロード |
ads.get_banner_height | レイアウト用 Banner 高さを照会 |
ホスト → ゲーム
| type | 目的 |
|---|---|
ads.rewarded_loaded | リワード表示準備完了 |
ads.rewarded_failed | リワード load/show 失敗 |
ads.rewarded_completed | リワード視聴完了 — 付与可能 |
ads.rewarded_dismissed | リワード早期終了 — 付与しない |
ads.interstitial_loaded | インタースティシャル準備完了 |
ads.interstitial_failed | インタースティシャル失敗 |
ads.interstitial_closed | インタースティシャル終了 |
ads.banner_shown | Banner 表示中 |
ads.banner_hidden | Banner 非表示 |
ads.banner_failed | Banner 失敗 |
コピペ用ヘルパー
index.html(またはモジュール)に貼り付け。報酬付与は独自のゲームロジックに置き換えてください。
js
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);
});
}
// 例:復活フロー
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') {
// ここでのみ報酬を付与
}
});本番ルール
- 自動クリック、強制ループ、Close / Skip コントロールの隠蔽は禁止。
- その
requestIdのads.rewarded_completedを受信するまで報酬を付与しない。 - ホスト失敗を尊重:在庫が空ならゲームを正常に続行。
- show の前に load して、トリガー時の待ち時間を短縮。
- パッケージに第三者広告 SDK、トラッカー、ポップアンダースクリプトを含めない。
- インタースティシャル頻度はホストが制御;show の連打は無視される場合あり。
FAQ
zip 内で AdMob / Unity Ads は使えますか?
いいえ。PlayNova はホスト側で需要を集約します。他 SDK の埋め込みは審査不合格となり、iframe サンドボックスの前提も破ります。
ホストが応答しない場合は?
無応答または *_failed は no-fill として扱い、無限スピナーでプレイヤーをブロックせずゲームを続行。
収益はどこで確認?
本番で広告が稼働後、インプレッションと収益はクリエイター分析に集計されます。精算はクリエイタープログラム規約に従います。
ホスト Bridge はプレイページで稼働中。上記メッセージタイプが本番契約 — 今すぐ実装してください。
