Unity で Google Play Instant を使用する

Unity 用の Google Play Instant プラグインは、Instant App 版のゲーム作成用に Unity プロジェクトを設定します。このガイドでは、Google Play Instant プラグインをインストールして使用する方法を説明します。

プラグインをダウンロードしてインポートする

このプラグインは、Google Play の Unity 向けプラグインの一部です。プラグインをインポートする手順は、次のとおりです。

  1. Google Play の Unity 向けプラグインのリリースから最新のリリースをダウンロードします。
  2. Unity IDE メニュー オプションの [Assets] > [Import Package] > [Custom Package] を選択し、すべてのアイテムをインポートして、.unitypackage ファイルをインポートします。

Unity エディタの機能

プラグインをインポートして、Unity で [Google] > [Play Instant] サブメニューを追加します。このサブメニューには次のオプションがあります。

ビルド設定

[Installed] と [Instant] の開発モードを切り替えるウィンドウを開きます。[Instant] に切り替えると、次の変更が行われます。

  • #if PLAY_INSTANT#endif を使用したスクリプト記述に使用できる、PLAY_INSTANT というスクリプト定義シンボルを作成します。
  • android:targetSandboxVersion など、必要な特定の変更に対する AndroidManifest.xml の更新を管理します。

プレーヤー設定

図 1 のプレーヤー設定ダイアログには、Google Play Instant のサポートの最適化、より互換性の高いグラフィック API での開発、APK のサイズの縮小に役立つヒントが表示されます。

具体的には、OpenGL ES 2.0 のみの使用や、マルチスレッド レンダリングの無効化などです。
図 1. プレーヤー設定ダイアログ

これらのプレーヤー設定は、必須設定と推奨設定に分類されます。設定の更新ボタンがある場合は、クリックして設定を希望の値に変更できます。

APK のサイズをさらに縮小するには、Unity Package Manager を開いて未使用のパッケージを削除します。

Quick Deploy

Quick Deploy は、一部のアセットを AssetBundle にパッケージ化することにより、Unity ベースの Instant App のサイズを縮小できます。Quick Deploy を使用すると、Unity のゲームエンジンと読み込み画面が Instant App APK にパッケージ化され、Instant App の起動後に AssetBundle がサーバーから取得されます。

インストールのワークフローをサポートする

多くの場合、Instant App の目標は、ユーザーが完全版のインストールに先駆けてアプリを体験できるようにすることです。Unity 用の Google Play Instant プラグインは、Play ストアのインストール ダイアログの表示、Instant App からインストール済みアプリへの状態の移行のための API を備えています。

インストール メッセージを表示する

Instant App にインストール ボタンがある場合、インストール ボタンのクリック ハンドラから次のコードを呼び出すことで、Play ストアのインストール ダイアログを表示できます。

Google.Play.Instant.InstallLauncher.ShowInstallPrompt();

ShowInstallPrompt() メソッドのオーバーロードでは、次の 1 つ以上の操作が可能です。

  • ユーザーがインストール プロセスを無効にしたかどうかを判断する。Instant App のメイン アクティビティで、onActivityResult() をオーバーライドし、指定した requestCodeRESULT_CANCELED を確認します。
  • referrer パラメータを使用してインストール リファラー文字列を渡す。
  • 現在のゲーム セッションの状態を PutPostInstallIntentStringExtra() 経由で渡す。

次の例で説明します。

using Google.Play.Instant;
...
const int requestCode = 123;
var sessionInfo = /* Object serialized as a string representing player's current location, etc. */;
using (var activity = UnityPlayerHelper.GetCurrentActivity())
using (var postInstallIntent = InstallLauncher.CreatePostInstallIntent(activity))
{
    InstallLauncher.PutPostInstallIntentStringExtra(postInstallIntent, "sessionInfo", sessionInfo);
    InstallLauncher.ShowInstallPrompt(activity, requestCode, postInstallIntent, "test-referrer");
}

ユーザーがアプリのインストールを完了すると、Play ストアは提供された postInstallIntent を使用してアプリを再起動します。インストール済みのアプリは、以下のコードを使用して postInstallIntent に設定された値を取得できます。

var sessionInfo = InstallLauncher.GetPostInstallIntentStringExtra("sessionInfo");

注:

  • ユーザーがアプリをインストールした後に起動をキャンセルした場合、postInstallIntent に含まれるエクストラがインストール済みのアプリに届かないことがあります。インテント エクストラを渡すには、永続的な状態を保持するよりもアクティブなセッション状態を保持する方法が適しています。永続的な状態を保持する場合については、Cookie API を参照してください。
  • どなたでも、追加フィールドを使用してインテントを作成し、インストール済みのアプリを起動できます。そのため、価値を持つペイロードは、一度しか使用できないように設計します。また、暗号技術を使って署名し、サーバー上で署名を検証するようにします。

Cookie API は、Instant App から対応するインストール済みのアプリに Cookie(プレーヤー ID やステータスを補完するデータなど)を渡すためのメソッドを提供します。postInstallIntent エクストラとは異なり、Cookie の状態はユーザーがインストール済みのアプリをすぐに起動しなくても使用できます。たとえば、Instant App では、インストール ボタンのクリック ハンドラから次のコードを呼び出すことができます。

using Google.Play.Instant;
...
var playerInfo = /* Object serialized as a string representing game levels completed, etc. */;
var cookieBytes = System.Text.Encoding.UTF8.GetBytes(playerInfo);
try
{
    var maxCookieSize = CookieApi.GetInstantAppCookieMaxSize();
    if (cookieBytes.Length > maxCookieSize)
    {
        UnityEngine.Debug.LogErrorFormat("Cookie length {0} exceeds limit {1}.", cookieBytes.Length, maxCookieSize);
    }
    else if (CookieApi.SetInstantAppCookie(cookieBytes))
    {
        UnityEngine.Debug.Log("Successfully set cookie. Now display the app install dialog...");
        InstallLauncher.ShowInstallPrompt();
    }
    else
    {
        UnityEngine.Debug.LogError("Failed to set cookie.");
    }
}
catch (CookieApi.InstantAppCookieException ex)
{
    UnityEngine.Debug.LogErrorFormat("Failed to set cookie: {0}", ex);
}

ユーザーがアプリのインストールを完了すると、インストール済みのアプリは以下のコードを使用して Cookie データを取得できるようになります。

var cookieBytes = CookieApi.GetInstantAppCookie();
var playerInfoString = System.Text.Encoding.UTF8.GetString(cookieBytes);
if (!string.IsNullOrEmpty(playerInfoString))
{
    // Initialize game state based on the cookie, e.g. skip tutorial level completed in instant app.
}