playgama-bridge-js-sdk について
複数の配信プラットフォーム向けに、単一の HTML5 ゲームを構築するための JavaScript SDK スキルです。API 呼び出しを各プラットフォームのネイティブスクリプトへ振り分け、非対応環境では mock プラットフォームを使います。
主な機能
- 01対応プラットフォーム共通の API
- 02ネイティブスクリプトの自動読み込み
- 03非対応環境での mock フォールバック
- 04プレイヤー認証と ID データ
- 05ローカルまたはプラットフォームストレージ
- 06インタースティシャル、リワード、バナー広告
活用シーン
- 01単一の HTML5 ビルドを複数プラットフォームで公開
- 02ローカルまたはクラウドストレージへの進行状況保存
- 03プラットフォームのログインとプレイヤー ID の処理
- 04広告とライフサイクルイベントの組み込み
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ hungify/ playables-skills --skill playgama-bridge-js-sdkインストール後、Claude Code で/playgama-bridge-js-sdkを入力して読み込まれたか確認します。
詳細
Playgama Bridge JS SDK
Playgama Bridge は、1 つの HTML5 ビルドを 20 以上のプラットフォーム(Playgama、Yandex Games、Crazy Games、Facebook Gaming、YouTube Playables、Telegram、Poki、Y8、Lagged、MSN、Microsoft Store、Discord、GameSnacks、Xiaomi、Huawei、JioGames、BitQuest、Reddit、Game Distribution、Playhop、Aha Games など)で実行できる統合 JS SDK です。
ゲームが対応プラットフォームで実行されると、Bridge はそのプラットフォームのネイティブスクリプトを自動で読み込み、API 呼び出しをそのプラットフォームにルーティングします。未対応の環境(ローカル開発、未知のホスト)では、Bridge は mock プラットフォームを使用し、例外を発生させず安全な既定値(false、reject など)を返すため、どこでも同じコードが動作します。
JS SDK(JS Core)が基盤であり、各エンジン向けパッケージ(Unity、Godot、Construct、GDevelop、GameMaker、Defold、Cocos Creator、Scratch)は薄いラッパーです。PlayCanvas、Phaser、LayaAir、Three.js、Babylon.js などの Web エンジンでは、JS Core を直接使用してください。
インストール
index.html の <head> に、ゲームコードより前に script タグを追加します。
<html>
<head>
<script src="https://bridge.playgama.com/v1/stable/playgama-bridge.js"></script>
</head>
<body>
...
</body>
</html>
CDN の選択肢:
| URL | 使用する場面 |
|---|---|
https://bridge.playgama.com/v1/stable/playgama-bridge.js | 推奨。 最新の安定版 v1.x.x |
https://bridge.playgama.com/latest/playgama-bridge.js | 最新の開発版 — テスト専用 |
https://bridge.playgama.com/v1.27.0/playgama-bridge.js | 特定のバージョンに固定 |
スクリプトの読み込み後、SDK はグローバルな bridge オブジェクトを公開します。
設定ファイル
Bridge はビルドのルートから playgama-bridge-config.json を読み込みます。このファイルでは、プラットフォーム ID、IAP カタログ、広告プレースメント、リーダーボード、その他の設定を宣言します。設定エディターで生成または編集してください。
ひな形:
{
"platforms": {
"playgama": { "options": {} },
"yandex": { "options": {} }
},
"advertisement": {
"interstitial": { "minimumDelay": 60 },
"advancedBanners": {/* see Advanced Banners */}
},
"payments": [
{
"id": "coins_100",
"playgama": { "amount": 1 },
"playdeck": { "amount": 1, "description": "100 Coins" }
}
],
"leaderboards": [{ "id": "high_score" }]
}
初期化
bridge.initialize() を呼び出し、他の API を使用する前に 必ず promise の完了を待ってください。
bridge
.initialize()
.then(() => {
// SDK is ready, all bridge.* APIs are usable now
})
.catch((error) => {
// Initialization failed — handle gracefully (the SDK still falls back to mock)
});
初期化後、ゲームの読み込みが完全に終わり、プレイヤーが操作できるようになった時点で game_ready を一度送信します。
bridge.platform.sendMessage('game_ready');
これにより、プラットフォームのローダーが閉じます。これは必須です。送信しないと、ほとんどのプラットフォームでゲームの上にスプラッシュ画面が表示されたままになります。
必須の連携チェックリスト
すべてのゲームで、次の手順を実施してください。
- SDK をインストールし、
playgama-bridge-config.jsonを作成します。 bridge.initialize()の完了を待ちます。bridge.platform.languageを読み取り、ローカライズを適用します。bridge.storage.get(...)でセーブデータを読み込みます。- 最初にプレイ可能なフレームが描画された時点で、
bridge.platform.sendMessage('game_ready')を送信します。 AUDIO_STATE_CHANGEDイベントとPAUSE_STATE_CHANGEDイベントに対応します。- 自然な区切り(レベルの切り替え、ゲームオーバー、メニューとゲームプレイの切り替え)でインタースティシャル広告を表示します。
収益分配を受けるには、インタースティシャル広告が必須です。広告がないゲームは、審査で却下される可能性があります。
プラットフォームモジュール — bridge.platform
プロパティ
| プロパティ | 型 | 説明 |
|---|---|---|
bridge.platform.id | 文字列 | 現在のプラットフォーム ID。次のいずれかです:playgama、vk、ok、yandex、facebook、crazy_games、game_distribution、playdeck、telegram、y8、lagged、msn、microsoft_store、poki、qa_tool、discord、gamepush、bitquest、huawei、jio_games、reddit、youtube、mock、xiaomi |
bridge.platform.sdk | オブジェクト | null | ネイティブプラットフォーム SDK(Bridge が公開している場合)。Bridge がラップしていない機能にのみ使用します |
bridge.platform.language | 文字列 | ISO 639-1 ユーザー言語(en、ru、...)。ブラウザーの言語にフォールバックします |
bridge.platform.payload | 文字列 | null | URL 起動時のペイロード(紹介コード、ディープリンク)。形式はプラットフォームによって異なります |
bridge.platform.tld | 文字列 | null | ホストから提供される場合のトップレベルドメイン(com、ru、...) |
bridge.platform.isAudioEnabled | ブール値 | ホストプラットフォームが現在ゲーム音声を許可しているかどうか |
bridge.platform.isGetAllGamesSupported | ブール値 | getAllGames() の機能フラグ |
bridge.platform.isGetGameByIdSupported | ブール値 | getGameById() の機能フラグ |
メソッド
// Server time — UTC ms — use for daily rewards / cooldowns instead of local clock
bridge.platform
.getServerTime()
.then((utcMs) => console.log(utcMs))
.catch((error) => {});
// All games by the same developer (for "More games" screens)
bridge.platform.getAllGames().then((games) => {
// platform-specific shape, on yandex: { appID, title, url, coverURL, iconURL }
});
// One game by ID (cross-promotion)
bridge.platform.getGameById({ gameId: '111111' }).then((game) => {
// { appID, title, url, coverURL, iconURL, isAvailable }
});
// Lifecycle messages — see table below
bridge.platform.sendMessage('game_ready');
// Custom messages — used by Advanced Banners config
bridge.platform.sendCustomMessage('shop_opened');
組み込みのライフサイクルメッセージ
| メッセージ | ペイロード | 送信するタイミング |
|---|---|---|
game_ready | — | ゲームの読み込みが完了し、ロード画面が終了して、プレイヤーが操作できる状態になったとき(必須) |
in_game_loading_started | — | サブ読み込みが始まったとき(例:レベルの読み込み) |
in_game_loading_stopped | — | サブ読み込みが完了したとき |
gameplay_started | — | アクティブなゲームプレイが始まったとき |
gameplay_stopped | — | アクティブなゲームプレイが終了したとき(メニュー、一時停止、ゲームオーバー) |
player_got_achievement | — | 重要な瞬間(ボスの撃破、記録の達成) |
level_started | { world, level } (optional) | レベルが始まったとき |
level_completed | { world, level } | レベルをクリアしたとき |
level_failed | { world, level } | レベルに失敗したとき |
level_paused | { world, level } | ポーズメニューを開いたとき |
level_resumed | { world, level } | 一時停止から再開したとき |
これらは Advanced Banners の配置も自動的にトリガーします。
イベント
// Audio mute/unmute requests from the host
bridge.platform.on(bridge.EVENT_NAME.AUDIO_STATE_CHANGED, (isEnabled) => {
if (!isEnabled) muteGameAudio();
else restoreGameAudio();
});
// Pause/resume requests (tab switch, platform overlay, etc.)
bridge.platform.on(bridge.EVENT_NAME.PAUSE_STATE_CHANGED, (isPaused) => {
if (isPaused) pauseGame();
else resumeGame();
});
どちらのイベントも処理が必須です。多くのプラットフォームでは、モデレーション時にこれが必須とされています。
プレイヤーモジュール — bridge.player
プレイヤーの識別情報とプラットフォームの認証情報です。
| プロパティ | 型 | 説明 |
|---|---|---|
bridge.player.id | string | null | プラットフォームのプレイヤー ID。認証済みの場合のみ設定されます |
bridge.player.name | string | null | プラットフォーム上の表示名 |
bridge.player.photos | string[] | 解像度の低い順に並んだアバターの URL。存在しない場合は [] |
bridge.player.extra | object | プラットフォーム固有の認証/検証データ |
bridge.player.isAuthorizationSupported | boolean | ホストがログインフローに対応しているかどうか |
bridge.player.isAuthorized | boolean | プレイヤーが現在認証済みかどうか |
// Trigger only from a direct user action (button tap)
bridge.player
.authorize({})
.then(() => {
// bridge.player.id, .name, .photos now populated
})
.catch((error) => {
// Cancelled or failed
});
一部のプラットフォームでは、認証前でもゲストデータ(name、一部の id)が公開されます。これらを検証済みとして扱わないでください。信頼できるのは認証後のデータのみです。
バックエンドでの検証
サーバーでプレイヤーの識別情報を検証するには、bridge.player.extra を使用してください。現在、Playgama の検証 API がサポートしているのは playgama、msn、microsoft_store のみです。
curl -X POST 'https://playgama.com/api/bridge/v1/verify' \
-H 'Content-Type: application/json' \
-d '{"platform":"<PLATFORM_ID>","type":"authorization","data":{ <...bridge.player.extra> }}'
# Response: { success, errorMessage?, playerId?, publisherPlayerId? }
デバイスモジュール — bridge.device
bridge.device.type; // 'mobile' | 'tablet' | 'desktop' | 'tv'
UI の大まかな調整(タッチ操作かキーボード操作か、アセットの品質、レイアウトなど)に使用してください。デバイスの種類に基づいてビジネスロジックを決定しないでください。
ストレージモジュール — bridge.storage
プレイヤーの永続データ(進行状況、設定、通貨)を扱います。ほとんどすべてのゲームで必要です。
2 種類のストレージ
| 種類 | 永続性 | デバイス間での同期 | 使用するタイミング |
|---|---|---|---|
local_storage | ブラウザーの localStorage | いいえ | オフラインで単一デバイスに保存する場合のデフォルト |
platform_internal | プラットフォームのクラウドサーバー | はい | プレイヤーが認証済みで、クラウド同期を利用したい場合 |
bridge.storage.defaultType;
// 'local_storage' or 'platform_internal' — host's preferred type
bridge.storage.isAvailable('local_storage');
bridge.storage.isAvailable('platform_internal');
// Check before forcing a specific type
読み込み
// Single key
bridge.storage.get('level').then((value) => {
// value === null when key is missing — always have a default in your game state
});
// Multiple keys — returns array, same order
bridge.storage.get(['level', 'coins', 'settings']).then(([level, coins, settings]) => {});
// Force specific storage type (third arg)
bridge.storage.get('level', 'local_storage');
保存
bridge.storage.set('level', 'dungeon_3');
bridge.storage
.set(['level', 'coins', 'tutorial_done'], ['dungeon_3', 42, true])
.then(() => {
/* persisted */
})
.catch((error) => {});
bridge.storage.set('level', 'dungeon_3', 'platform_internal');
意味のある状態変化(レベルクリア、購入、設定変更)があったときに保存します。毎フレーム保存しないでください。
削除
bridge.storage.delete('level');
bridge.storage.delete(['level', 'coins']);
広告モジュール — bridge.advertisement
playgama-bridge-config.json で広告枠を設定します。ゲームプレイ中は広告を表示しないでください — 自然な休止時のみ表示します。
フォーマットの概要
| フォーマット | 状態 | 表示するタイミング |
|---|---|---|
| インタースティシャル広告 | 必須 | レベル遷移、ゲームオーバー、メニュー↔ゲームプレイ |
| リワード広告 | 推奨 | プレイヤーがゲーム内報酬を得るために選択した場合 |
| バナー広告 | 推奨 | 待機画面(メニュー、ロビー、一時停止) |
| アドバンスドバナー | 推奨 | 複数の位置に配置するカスタムのレスポンシブバナーレイアウト |
| AdBlock チェック | 任意 | 広告がブロックされている場合に UI を調整 |
インタースティシャル広告 — 必須
bridge.advertisement.isInterstitialSupported; // boolean
bridge.advertisement.minimumDelayBetweenInterstitial; // default 60 seconds
bridge.advertisement.setMinimumDelayBetweenInterstitial(30); // override
bridge.advertisement.interstitialState;
// 'loading' | 'opened' | 'closed' | 'failed'
bridge.advertisement.on(bridge.EVENT_NAME.INTERSTITIAL_STATE_CHANGED, (state) => {
if (state === 'opened') {
muteGameAudio();
pauseGame();
} else if (state === 'closed' || state === 'failed') {
restoreGameAudio();
resumeGame();
}
});
// Optional placement string
bridge.advertisement.showInterstitial('level_complete');
ゲーム開始時に showInterstitial() を呼び出さないでください。起動時のインタースティシャル広告に対応しているプラットフォームでは、自動的に表示されます。明示的に呼び出すと、広告が重複して表示されます。
また、初期化直後に interstitialState を確認してください。すでに opened の場合は、すぐにミュートして一時停止します。
リワード広告
bridge.advertisement.isRewardedSupported;
bridge.advertisement.rewardedState;
// 'loading' | 'opened' | 'closed' | 'rewarded' | 'failed'
bridge.advertisement.rewardedPlacement; // current placement string
bridge.advertisement.on(bridge.EVENT_NAME.REWARDED_STATE_CHANGED, (state) => {
switch (state) {
case 'opened':
muteGameAudio();
pauseGame();
break;
case 'rewarded':
// ONLY here grant the reward
grantReward(bridge.advertisement.rewardedPlacement);
break;
case 'closed':
case 'failed':
restoreGameAudio();
resumeGame();
break;
}
});
bridge.advertisement.showRewarded('double_coins');
重要: 報酬を付与するのは rewarded 状態の場合のみです。closed 状態で付与すると、プレイヤーは広告を見ずに報酬を獲得できてしまいます。
バナー広告
bridge.advertisement.isBannerSupported;
let position = 'bottom'; // 'top' | 'bottom', default 'bottom'
let placement = 'menu'; // optional
bridge.advertisement.showBanner(position, placement);
bridge.advertisement.hideBanner();
bridge.advertisement.bannerState;
// 'loading' | 'shown' | 'hidden' | 'failed'
bridge.advertisement.on(bridge.EVENT_NAME.BANNER_STATE_CHANGED, (state) => {});
アドバンスドバナー
設定に基づいて、複数の位置に配置するレスポンシブバナーレイアウトです。インタースティシャル広告/リワード広告の表示中は自動的に非表示になり、終了後に自動的に再表示されます。画面の向きやサイズ変更に応じて再評価します(デバウンスは 200ms)。
bridge.advertisement.isAdvancedBannersSupported;
// Method 1 — explicit
bridge.advertisement.showAdvancedBanners('main_menu');
bridge.advertisement.hideAdvancedBanners();
// Method 2 — automatic via platform messages (recommended)
bridge.platform.sendMessage('gameplay_stopped'); // shows if configured
bridge.platform.sendMessage('gameplay_started'); // hides if action: 'hide'
bridge.platform.sendCustomMessage('shop_opened');
// State
bridge.advertisement.advancedBannersState;
bridge.advertisement.on('advanced_banners_state_changed', (state) => {});
設定例:
{
"advertisement": {
"advancedBanners": {
"disable": false,
"placementFallback": "main_menu",
"main_menu": {
"default": [{ "width": "20%", "height": "25%", "top": "10%", "right": "10%" }]
},
"gameplay_stopped": {
"action": "show",
"default": [{ "width": "20%", "height": "25%", "bottom": "10%", "right": "5%" }],
"mobile:portrait": [
{ "width": "100%", "height": "8%", "bottom": "0", "left": "0" }
],
"desktop:landscape:w>1200": [
{ "width": "10%", "height": "60%", "top": "10%", "left": "1%" },
{ "width": "10%", "height": "60%", "top": "10%", "right": "1%" }
]
},
"gameplay_started": { "action": "hide" }
}
}
}
条件キー
コロンで区切られたセグメントで、すべての条件に一致する必要があります:
| セグメント | 例 |
|---|---|
| デバイスタイプ | mobile、desktop、tablet、tv |
| 画面の向き | portrait、landscape |
| 幅 | w>600、w<=1024、w>=768 |
| 高さ | h>400、h<=900 |
| アスペクト比 | ar>1.5、ar>=1.78、ar<=1.0 |
| キャンバスモード | canvas(ウィンドウの代わりにキャンバスサイズを使用) |
優先度:デバイスタイプ +4、画面の向き +2、キャンバス +1、各 w/h/ar 条件 +1。同点の場合は、セグメント数が多い条件が優先され、次に実際の値に近いしきい値が優先されます。default はフォールバックです(-1)。
バナーオブジェクト
CSS の位置指定:width、height、top、bottom、left、right — すべて文字列("300px"、"100%"、"0")。
AdBlock 検出
bridge.advertisement.checkAdBlock().then((isBlocked) => {
// true | false — informational only, doesn't suppress ads
});
決済モジュール — bridge.payments
ゲーム内購入です。任意ですが、最も収益性の高い機能となることがよくあります。
商品タイプ
| 種類 | 例 | ライフサイクル |
|---|---|---|
| 永続商品 | 「広告削除」、DLC | 一度だけ購入します。起動するたびに getPurchases() で所有状況を確認します |
| 消費型商品 | コイン、ジェム、エネルギー | 購入 → 付与 → consumePurchase(id) で必ず消費します。消費するまでは、同じ商品の再購入に失敗します |
API
bridge.payments.isSupported;
// Catalog — localized prices, currencies, metadata
bridge.payments.getCatalog().then((items) => {
items.forEach((item) => {
console.log(item.id);
console.log(item.price); // formatted string
console.log(item.priceCurrencyCode); // ISO 4217
console.log(item.priceValue); // numeric value
});
});
// Purchase — only from a direct user action
bridge.payments
.purchase('coins_100')
.then((purchase) => {
// Platform-specific shape, always has .id
grantItems(purchase.id);
// For consumables, immediately consume:
return bridge.payments.consumePurchase(purchase.id);
})
.catch((error) => {
// Cancelled or failed
});
// Consume a consumable after granting items
bridge.payments.consumePurchase('coins_100').then((purchase) => {});
// Active purchases — call on every launch and after reconnect
// to recover items from purchases interrupted by disconnects
bridge.payments.getPurchases().then((purchases) => {
purchases.forEach((p) => {
// Permanent: check ownership here
// Consumable: grant items + consume
});
});
カタログ設定
{
"payments": [
{
"id": "coins_100",
"playgama": { "amount": 1 },
"playdeck": { "amount": 1, "description": "100 Coins" }
}
]
}
idはゲーム内で使用する識別子です。プラットフォームごとのキーには、プラットフォーム固有の価格やメタデータが含まれます。
バックエンドでの検証
curl -X POST 'https://playgama.com/api/bridge/v1/verify' \
-H 'Content-Type: application/json' \
-d '{"platform":"<PLATFORM_ID>","type":"purchase","data":{ <...purchase> }}'
# Response: { success, errorMessage?, orderId?, productId?, externalId? }
現在、playgama、msn、microsoft_storeをサポートしています。
リーダーボードモジュール — bridge.leaderboards
任意です。最初にbridge.leaderboards.typeを確認してください。
| タイプ | 操作 |
|---|---|
not_available | リーダーボードのUIをすべて非表示にする |
in_game | setScore(...)を呼び出し、getEntries(...)から独自のUIを描画する |
native | setScore(...)のみを呼び出す — プラットフォームがボードを描画する |
native_popup | setScore(...)とshowNativePopup(...)を呼び出し、オーバーレイを開く |
API
bridge.leaderboards.type;
bridge.leaderboards.setScore('high_score', 1000).then(() => {});
// Only when type === 'in_game'
bridge.leaderboards.getEntries('high_score').then((entries) => {
entries.forEach((e) => {
console.log(e.id);
console.log(e.name);
console.log(e.photo);
console.log(e.score);
console.log(e.rank);
});
});
// Only when type === 'native_popup'
bridge.leaderboards.showNativePopup('high_score');
設定
{
"leaderboards": [
{
"id": "high_score",
"<PLATFORM_ID>": "<NATIVE_ID_FOR_PLATFORM>"
}
]
}
コードではゲーム内のidを使用してください。プラットフォームごとのオーバーライドは、ネイティブのリーダーボードIDが異なる場合に対応します。
実績モジュール — bridge.achievements
任意です。実績IDはplaygama-bridge-config.jsonではなく、各プラットフォームの開発者ダッシュボードで設定します。
bridge.achievements.isSupported;
bridge.achievements.isGetListSupported;
bridge.achievements.isNativePopupSupported;
// Unlock — send each achievement only once
let options = {};
switch (bridge.platform.id) {
case 'y8':
options = { achievement: 'ACHIEVEMENT_NAME', achievementkey: 'ACHIEVEMENT_KEY' };
break;
case 'lagged':
options = { achievement: 'ACHIEVEMENT_ID' };
break;
}
bridge.achievements.unlock(options).then(() => {});
// List (platform-specific shape)
bridge.achievements.getList({}).then((list) => {});
// Native overlay
bridge.achievements.showNativePopup({});
ゲーム内に定数ファイルを用意し、内部のマイルストーンとプラットフォームごとの実績IDを対応付けてください。
ソーシャルモジュール — bridge.social
すべて任意です。各メソッドにはis*Supportedフラグがあります。必ず確認し、サポートされていない場合はボタンを非表示にしてください。直接のユーザー操作によってのみ実行してください。
機能対応表
| 機能 | フラグ | 主な対応プラットフォーム |
|---|---|---|
| シェア | isShareSupported | VK、Facebook、MSN |
| コミュニティに参加 | isJoinCommunitySupported | VK、OK、Facebook |
| 友達を招待 | isInviteFriendsSupported | VK、OK、Facebook |
| 投稿を作成 | isCreatePostSupported | VK、OK |
| お気に入りに追加 | isAddToFavoritesSupported | VK、Yandex |
| ホーム画面に追加 | isAddToHomeScreenSupported | Yandex、GameSnacks |
| ゲームを評価 | isRateSupported | VK、GameSnacks、Yandex |
| 外部リンク | isExternalLinksAllowed | 大半の非ポータル型プラットフォーム |
シェア
let options = {};
switch (bridge.platform.id) {
case 'vk':
options = { link: 'https://...' };
break;
case 'facebook':
options = { image: 'base64...', text: 'Check this game!' };
break;
case 'msn':
options = { title: '...', image: 'base64 or URL', text: '...' };
break;
}
bridge.social.share(options).then(() => {});
コミュニティに参加
let options = {};
switch (bridge.platform.id) {
case 'vk':
case 'ok':
options = { groupId: 123456 };
break;
case 'facebook':
options = { isPage: true };
break; // false → group
}
bridge.social.joinCommunity(options);
友達を招待
let options = {};
switch (bridge.platform.id) {
case 'ok':
options = { text: 'Hello!' };
break;
case 'facebook':
options = { image: 'base64...', text: 'Join me!' };
break;
}
bridge.social.inviteFriends(options);
投稿を作成
// OK example with mixed media
bridge.social.createPost({
media: [
{ type: 'text', text: 'Hello!' },
{ type: 'link', url: 'https://...' },
{
type: 'poll',
question: 'Like the game?',
answers: [{ text: 'Yes' }, { text: 'No' }],
options: 'SingleChoice,AnonymousVoting'
}
]
});
その他のソーシャル機能
bridge.social.addToFavorites().then(() => {});
bridge.social.addToHomeScreen().then(() => {});
bridge.social.rate().then(() => {});
リモート設定モジュール — bridge.remoteConfig
任意です。再ビルドせずに、実行時にゲーム設定(難易度、ドロップ率、機能フラグ、A/Bテストの値)を読み取れます。
bridge.remoteConfig.isSupported;
let options = {};
switch (bridge.platform.id) {
case 'yandex':
options = {
clientFeatures: [{ name: 'levels', value: '5' }]
};
break;
}
bridge.remoteConfig
.get(options)
.then((data) => {
// e.g. { showFullscreenAdOnStart: 'no', difficulty: 'hard' }
})
.catch((error) => {});
すべてのキーには必ずハードコードされたデフォルト値を用意してください。リクエストが失敗したり、データが一部しか返されなかったりする場合があります。
イベント名
bridge.EVENT_NAME.AUDIO_STATE_CHANGED;
bridge.EVENT_NAME.PAUSE_STATE_CHANGED;
bridge.EVENT_NAME.INTERSTITIAL_STATE_CHANGED;
bridge.EVENT_NAME.REWARDED_STATE_CHANGED;
bridge.EVENT_NAME.BANNER_STATE_CHANGED;
bridge.EVENT_NAME.ADVANCED_BANNERS_STATE_CHANGED;
bridge.platform.on(...)とbridge.advertisement.on(...)では、イベント名の文字列も受け付けます。
状態値の一覧
| モジュール | 状態 |
|---|---|
| インタースティシャル | loading、opened、closed、failed |
| リワード広告 | loading、opened、closed、rewarded、failed |
| バナー | loading、shown、hidden、failed |
| アドバンスドバナー | loading、shown、hidden、failed |
| リーダーボードのタイプ | not_available、in_game、native、native_popup |
| ストレージのタイプ | local_storage、platform_internal |
ベストプラクティスのチェックリスト
- API を使用する前に、
bridge.initialize()の完了を待ちます。 - ローカライズには
bridge.platform.languageを適用します。 - ゲームプレイを表示する前に、
bridge.storage.get(...)から保存済みの状態を読み込みます。 - 最初のプレイ可能なフレームがレンダリングされたら、
bridge.platform.sendMessage('game_ready')を送信します。 AUDIO_STATE_CHANGEDとPAUSE_STATE_CHANGEDを購読し、すぐに対応します。- インタースティシャル広告は自然な区切りで表示し、ゲームプレイ中には表示しません。
- ゲーム開始時に
showInterstitial()を呼び出してはいけません。 openedではミュートして一時停止し、closed/failed/rewardedでは元に戻します。- 報酬を付与するのは、
rewarded状態の場合のみです。 - フレームごとではなく、重要なイベント時にストレージへ保存します。
- 消費型購入のアイテムを付与した後、
consumePurchase(id)を呼び出します。 - 中断された購入を復旧するため、起動時と再接続時に
getPurchases()を呼び出します。 - すべての
is*Supportedフラグを確認し、サポートされていない機能の UI を非表示にします。 - ソーシャルアクションと
payments.purchase()は、ユーザーの直接操作からのみ実行します。 - Remote Config のすべてのキーに、ハードコードされたデフォルト値を用意します。
- プラットフォームメッセージ(
level_started、gameplay_stoppedなど)を送信します。これらは分析と Advanced Banners を動かします。
ローカル開発
Bridge が認識しない環境では、mock にフォールバックします。API は例外をスローせず安全なデフォルト値を返すため、公開前にローカルで開発およびデバッグできます。bridge.platform.id === 'mock' はこの状態を示します。
リソース
- 設定エディター:
https://playgama.github.io/bridge-config-editor/ - Wiki:
https://wiki.playgama.com/