mcpField
P
playgama-bridge-js-sdk

playgama-bridge-js-sdk

github.com/hungify開発016 回インストール1 週間前に更新
リポジトリ

playgama-bridge-js-sdk について

複数の配信プラットフォーム向けに、単一の HTML5 ゲームを構築するための JavaScript SDK スキルです。API 呼び出しを各プラットフォームのネイティブスクリプトへ振り分け、非対応環境では mock プラットフォームを使います。

主な機能

  1. 01対応プラットフォーム共通の API
  2. 02ネイティブスクリプトの自動読み込み
  3. 03非対応環境での mock フォールバック
  4. 04プレイヤー認証と ID データ
  5. 05ローカルまたはプラットフォームストレージ
  6. 06インタースティシャル、リワード、バナー広告

活用シーン

  1. 01単一の HTML5 ビルドを複数プラットフォームで公開
  2. 02ローカルまたはクラウドストレージへの進行状況保存
  3. 03プラットフォームのログインとプレイヤー ID の処理
  4. 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');

これにより、プラットフォームのローダーが閉じます。これは必須です。送信しないと、ほとんどのプラットフォームでゲームの上にスプラッシュ画面が表示されたままになります。

必須の連携チェックリスト

すべてのゲームで、次の手順を実施してください。

  1. SDK をインストールし、playgama-bridge-config.json を作成します。
  2. bridge.initialize() の完了を待ちます。
  3. bridge.platform.language を読み取り、ローカライズを適用します。
  4. bridge.storage.get(...) でセーブデータを読み込みます。
  5. 最初にプレイ可能なフレームが描画された時点で、bridge.platform.sendMessage('game_ready') を送信します。
  6. AUDIO_STATE_CHANGED イベントと PAUSE_STATE_CHANGED イベントに対応します。
  7. 自然な区切り(レベルの切り替え、ゲームオーバー、メニューとゲームプレイの切り替え)でインタースティシャル広告を表示します。

収益分配を受けるには、インタースティシャル広告が必須です。広告がないゲームは、審査で却下される可能性があります。

プラットフォームモジュール — 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文字列 | nullURL 起動時のペイロード(紹介コード、ディープリンク)。形式はプラットフォームによって異なります
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.idstring | nullプラットフォームのプレイヤー ID。認証済みの場合のみ設定されます
bridge.player.namestring | nullプラットフォーム上の表示名
bridge.player.photosstring[]解像度の低い順に並んだアバターの URL。存在しない場合は []
bridge.player.extraobjectプラットフォーム固有の認証/検証データ
bridge.player.isAuthorizationSupportedbooleanホストがログインフローに対応しているかどうか
bridge.player.isAuthorizedbooleanプレイヤーが現在認証済みかどうか
// 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_gamesetScore(...)を呼び出し、getEntries(...)から独自のUIを描画する
nativesetScore(...)のみを呼び出す — プラットフォームがボードを描画する
native_popupsetScore(...)と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フラグがあります。必ず確認し、サポートされていない場合はボタンを非表示にしてください。直接のユーザー操作によってのみ実行してください。

機能対応表
機能フラグ主な対応プラットフォーム
シェアisShareSupportedVK、Facebook、MSN
コミュニティに参加isJoinCommunitySupportedVK、OK、Facebook
友達を招待isInviteFriendsSupportedVK、OK、Facebook
投稿を作成isCreatePostSupportedVK、OK
お気に入りに追加isAddToFavoritesSupportedVK、Yandex
ホーム画面に追加isAddToHomeScreenSupportedYandex、GameSnacks
ゲームを評価isRateSupportedVK、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

ベストプラクティスのチェックリスト

  1. API を使用する前に、bridge.initialize() の完了を待ちます。
  2. ローカライズには bridge.platform.language を適用します。
  3. ゲームプレイを表示する前に、bridge.storage.get(...) から保存済みの状態を読み込みます。
  4. 最初のプレイ可能なフレームがレンダリングされたら、bridge.platform.sendMessage('game_ready') を送信します。
  5. AUDIO_STATE_CHANGED と PAUSE_STATE_CHANGED を購読し、すぐに対応します。
  6. インタースティシャル広告は自然な区切りで表示し、ゲームプレイ中には表示しません。
  7. ゲーム開始時に showInterstitial() を呼び出してはいけません。
  8. opened ではミュートして一時停止し、closed/failed/rewarded では元に戻します。
  9. 報酬を付与するのは、rewarded 状態の場合のみです。
  10. フレームごとではなく、重要なイベント時にストレージへ保存します。
  11. 消費型購入のアイテムを付与した後、consumePurchase(id) を呼び出します。
  12. 中断された購入を復旧するため、起動時と再接続時に getPurchases() を呼び出します。
  13. すべての is*Supported フラグを確認し、サポートされていない機能の UI を非表示にします。
  14. ソーシャルアクションと payments.purchase() は、ユーザーの直接操作からのみ実行します。
  15. Remote Config のすべてのキーに、ハードコードされたデフォルト値を用意します。
  16. プラットフォームメッセージ(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/

コメント