인게임 광고 연동
최종 업데이트: 2026-08-11
PlayNova 호스트 Bridge를 통해 Banner, 전면 및 보상형 광고를 연동합니다. 게임은 iframe에서 실행되며 postMessage로 호스트와 통신합니다 — 패키지 내에 서드파티 광고 SDK를 포함하지 마세요.
수익화 방식
PlayNova는 호스트 측에서 광고를 채우고 인증된 크리에이터와 수익을 분배합니다(기본 크리에이터 70%). 게임은 show/load만 요청; 재고, 빈도 제한, 노출/클릭 보고는 호스트가 처리합니다.
모든 메시지의 봉투:
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는 플레이 페이지에서 가동 중. 위 메시지 타입이 프로덕션 계약 — 지금 구현하세요.
