PC 版 Unity と Google Play ゲームを使ってみる

1. はじめに

Google Play ゲームのロゴ

最終更新日: 2022 年 4 月 25 日

PC 版 Google Play ゲーム向けにゲームを準備するにはどうすればよいですか。

Google Play ゲームを利用すると、モバイルゲームを Windows PC に簡単に移行できます。つまり、ゲームの再構築やビジネスモデルの再設計を行わなくても、プレーヤーのエンゲージメントやユーザーを増やすことができます。新しい PC プレーヤーに最適なエクスペリエンスを提供するには、いくつかの点を変更する必要があります。

学習内容

この Codelab では、ゲームを軌道に乗せるための要件チェックリストの基本部分を取り上げ、PC 版 Google Play ゲーム向けに独自の Unity ゲームを準備する方法について説明します。Play ゲームへのサインオンや Play Integrity API など、より深い統合については説明しません。

  • Unity から x86 アーキテクチャ用にビルドする方法
  • Google Play ゲーム エミュレータをテストしてデプロイする方法。
  • ユーザー インターフェースを変更して PC で最適に表示されるようにする方法。
  • Google Play ゲーム エミュレータで動作しているかどうかを検出し、それに応じてゲームを調整する方法。

必要なもの

2. 設定する

新しいプロジェクトを開く、作成する

  1. 2D Platformer Microgame を使って新しいプロジェクトを作成するか、独自のプロジェクトを開きます。

Unity の [new project] 画面では、作成するテンプレートとして [2D Platformer Microgame] が選択されています。

  1. プロジェクトで [File] -> [Build Settings] を選択し、Android 用にビルドするように設定されていることを確認します。

Unity の [Build Settings] ウィンドウのスクリーンショット。[Android] プラットフォームが有効になっています。

3. Google Play ゲーム エミュレータを準備する

まず、こちらのページからエミュレータをダウンロードします。ダウンロード リンクが表示されない場合は、play-mp-emu グループに追加されているアカウントでログインしていることを確認してください。このエミュレータ アップデートが利用可能になると、このグループのメンバーに通知が届きます。そのため、play-mp-emu@googlegroups.com からメールを受信できることを確認してください。

インストールすると、Android デスクトップがウィンドウに表示されます。

Google Play ゲーム エミュレータ ウィンドウのスクリーンショット。Android のホーム画面が表示されています。

これは、ゲーム開発に適した多機能の高性能 Android 環境です。Android Debug Bridge(adb)に、ローカルホストでデバイスとして表示されます。

❯ adb devices
List of devices attached
localhost:6520  device

エミュレータを検出するには、最新バージョンの adb が必要です。Android Studio にバンドルされているバージョンは機能しますが、Unity に付属する adb は機能しません。互換性のあるバージョンはエミュレータにバンドルされており、C:\Program Files\Google\HPE_Dev\emulator で入手できます。快適にご利用いただくには、Android Studio をインストールして Android SDK を管理することをおすすめします。

エミュレータが adb から切断された場合は、次のようにコマンドラインから再接続します。

adb connect localhost:6520

4.直接エミュレータをビルドしてデプロイするように Unity を構成する(省略可)

Unity に付属の adb のバージョンは、エミュレータと互換性がない場合があります。確認するには、[File] -> [Build Settings] を選択し、[Run Device] ダイアログにリストが表示されるかどうかを確認します。

[Build Settings] ウィンドウの [Run Device] で、[Run Device] が選択されていて、表示される要素は [Default device] と [Allcompatible devices] のみです。

プロジェクト、ビルドプロセス、快適度に応じて、Unity を構成して Google Play ゲーム エミュレータに直接デプロイするか、APK をビルドして adb install で手動でデプロイするかを選択できます。手動でのデプロイにはごくわずかの変更が必要ですが、イテレーション サイクルは遅くなる可能性があります。

次の 2 つの手順でエミュレータに直接デプロイします。

  1. 別の Unity SDK(理想的には Android Studio によってインストールされた SDK)を使用するように Unity を構成します。
  2. Unity のバグを回避するように、ビルドツールのバージョンを更新します。

Unity に付属の Android SDK のバージョンではエミュレータが検出されない可能性があるため、Android Studio を使用して最新の SDK をインストールしています。

  1. Android Studio を開き、[Edit] -> [Preferences] -> [External Tools] を選択します。
  2. Android SDK Tools Installed with Unity のチェックボックスをオフにして、Android Studio のインストールへのパス(通常は AppData/Local/Android/sdk)を指定します。 Android NDK オプションはそのままにします。

[Preferences] ウィンドウの [External Tools] のスクリーンショット

接続済みのデバイスを更新すると、ビルド ウィンドウに Google HPE device (localhost:6520) が表示されます。

[Build Settings] ウィンドウのスクリーンショット [Run Device] の [Google HPE] が表示されています。

このバグの状態と Unity のバージョンによっては、ビルドツールのバージョンも変更する必要があります。これを行うには、mainTemplate.gradlelauncherTemplate.gradle を生成していることを確認します。

  1. [Project Settings] ウィンドウを開いて [Player Settings] に移動し、[Publishing Settings] セクションを見つけます。
  2. [Build] オプションまで下にスクロールし、[Custom Main Gradle Template] と [Custom Launcher Gradle Template] をオンにします。これにより、両方の Gradle ファイルが Assets\Plugins\Android\ に生成されます。

[プロジェクト設定] ウィンドウの [プレーヤー] セクションのスクリーンショット。  [Custom Main Gradle Template] と [Custom Launcher Gradle Template] の両方のチェックボックスがオンになっている。

  1. 文字列 **BUILDTOOLS** の任意のインスタンスを 30.0.0 に置き換えます。どちらのファイルでも、コードのセクションは次のようになります。
android {
    compileSdkVersion **APIVERSION**
    buildToolsVersion '30.0.0'

5. Chromebook へのデプロイ(省略可)

Chrome OS デバイスを使用すると、Google Play ゲーム エミュレータにアクセスせずに Google Play ゲーム向けのゲームの開発を開始できます。PC 版 Google Play ゲームと同様に、Chromebook はキーボードとマウスを備え、大画面で、x86 構成で利用できます。ここでは、Chromebook で Android Logcat Unity プラグインを使用します。

  1. パッケージ マネージャーを開き、Unity RegistryAndroid Logcat を検索します。

[Package Log] ウィンドウがインストールされ、[Android Logcat] が選択されている。

また、Android 開発用に Chromebook を設定する必要があります。まず、Linux を有効にします。

  1. [設定] -> [デベロッパー] -> [Linux] を選択

Linux のサポートを有効にする方法を示すアニメーション画像。  [設定] ウィンドウでデベロッパーを選択。[Linux 開発環境] で [オンにする] をクリックします。

ADB デバッグを有効にします。

  1. [設定] -> [デベロッパー] -> [Linux 開発環境] -> [Android アプリの開発] -> [ADB デバッグを有効にする] を選択します。

ADB デバッグは、デベロッパー メニューから有効にできます。

また、Chromebook の IP アドレスを取得する必要があります。最も簡単な方法は、

  1. ネットワーク情報アイコンをクリックして、Chromebook の IP アドレスを取得します。

Chromebook で開かれているネットワーク ウィンドウのスクリーンショット。

ネットワーク情報ボタンをクリックすると、IP アドレスが表示されます。

  1. [Window] -> [Analysis] -> [Android Logcat] を選択して、[Android Logcat] ウィンドウを開きます。

[Window] > [Analysis を開きます Unity] で、[Android Logcat] が選択されています。

  1. デバイスリストを開くと、現在接続されていない場合は No Device と表示されることがあります。

[Android Logcat] ウィンドウが表示され、デバイス プルダウンが選択されています。

  1. [その他の接続オプション] をクリックして、Chromebook の IP アドレスを入力します。

[その他の接続] ウィンドウが開きます。IP アドレスを入力します。

  1. [接続] をクリックします。[Success] ウィンドウが表示されます。

成功を示すダイアログ ボックスが表示されます。

これで Unity の [Run Device] リストに Chromebook が表示されます(画面を更新することが必要な場合があります)。

Unity の [Build Settings] ウィンドウが開いています。[Run Device] プルダウンに Chrome OS デバイスが表示されます。

Chromebook にゲームをデプロイし、PC のようなハードウェアでテストや開発を開始できます。

6. テストビルドをデプロイする

Google Play ゲームを利用するには、x86 バージョンのゲームをデプロイする必要があります。これは、デスクトップ パソコンでパフォーマンス ベンチマークを達成する方法のひとつです。 Unity の LTS バリアントはすべて、x86 および x86-64 と互換性のある Android ビルド(「Chrome OS」というラベルが付いています)を生成し、Unity バージョン 2018 以前で x86 ビルドを生成できます。これらのアーキテクチャを利用するには、まず IL2CPP スクリプト バックエンドに切り替える必要があります。本番環境では arm64 をサポートしており、IL2CPP スクリプトのバックエンドをすでに使用している可能性が高いです。

  1. [File] -> [Build Settings] を選択して [Build Settings] ウィンドウを開き、[Player Settings] をクリックします。

[Player Settings] ボタンに焦点を当てた [Build Settings] ウィンドウのスクリーンショット。

  1. [Other Settings] セクションに移動し、Scripting BackendIL2CPP に切り替えます。

[Player Settings] の [Other Settings] セクションのスクリーンショット

また、x86 または x86-64 のサポートを有効にする必要もあります。Google Play ゲーム プラットフォームで配布するには x86 のみをサポートする必要がありますが、x86-64 を推奨します。

プレーヤー設定「Scripting Backend」の構成セクションのスクリーンショットが「IL2CPP」に設定されており、ターゲット アーキテクチャで「x86(Chrome OS)」が選択され、「x86-64(Chrome OS)」がハイライト表示されています。

Unity バンドルの Frame Pacing ライブラリのバージョンも Google Play ゲームと互換性がなく、リリース時にゲームがクラッシュします。

  1. [Player Settings] ウィンドウでフレーム ペーシングを無効にするには、[Resolution and Presentation] セクションを開き、[Optimized Frame Pacing] チェックボックスをオフにします。

[Optimized Frame Pacing(最適化されたフレーム ペーシング)] のチェックボックスがオフになっている場合の [Resolution and Presentation](スクリーンショット)

これでビルドの準備が整いました。

  1. [Build Settings] ウィンドウを再度開き、[Build And Run] をクリックします。エミュレータ ウィンドウにゲームが表示されます。

「2D Platformer Microgame」が稼働している Google Play ゲーム エミュレータのスクリーンショット

ゲームをデプロイできない場合は、[Run Device] リストに [Google HPE device (localhost:6520)] が表示されるかどうかを確認します。見つからない場合は、HPE_Dev が実行されていることを確認し、Android のホーム画面が表示されることを確認してください。それでもデバイスリストに表示されない場合は、使用している adb.exe を指定して adb connect localhost:6520 を実行します。Android Logcat Unity プラグインを使用している場合は、[Tools] -> [Open Terminal] を選択して、同じ adb.exe を使用するディレクトリへのターミナルを開きます。

[ツール] > [ターミナルを開く] がハイライトされた [Android Logcat] Unity ウィンドウのスクリーンショット

7. PC 向けにゲームを適応させる

可能であれば、プラットフォームに依存しない指標や、特定の機能の有無に基づいてゲームに変更を加えるようにしてください。たとえば、Android のプレーヤーはマウスとキーボードを接続したり、モニターを接続したりできます。そのため、デバイス設定に応じてコントロール スキームや HUD 要素を変更すると、サポートされているすべてのプラットフォームで PC 版 Google Play ゲームを活用できます。

プレーヤーが Google Play ゲームまたは Chrome OS を使用しているかどうかに基づいてロジックを変更するのが適している場合、このスクリプトは HPE_EXPERIENCE のシステム機能をチェックすることで検出するのに役立ちます。

using UnityEngine;

public class GoogleDeviceUtilities
{
#if UNITY_ANDROID && !UNITY_EDITOR
    private static AndroidJavaObject PackageManager
    {
        get
        {
            var unityPlayerClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            var currentActivity = unityPlayerClass.GetStatic<AndroidJavaObject>("currentActivity");
            return currentActivity.Call<AndroidJavaObject>("getPackageManager");
        }
    }

    public static bool IsChromeOS => PackageManager.Call<bool>("hasSystemFeature", "org.chromium.arc");

    public static bool IsGooglePlayGames =>
        PackageManager.Call<bool>("hasSystemFeature", "com.google.android.play.feature.HPE_EXPERIENCE");

    public static bool HasKeyboard
    {
        get
        {
            var unityPlayerClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            var currentActivity = unityPlayerClass.GetStatic<AndroidJavaObject>("currentActivity");
            var resources = currentActivity.Call<AndroidJavaObject>("getResources");
            var configuration = resources.Call<AndroidJavaObject>("getConfiguration");
            var keyboard = configuration.Get<int>("keyboard");
            return keyboard == 2; // Configuration.KEYBOARD_QWERTY
        }
    }
#else
    public static bool IsChromeOS => false;
    public static bool IsGooglePlayGames => false;
    public static bool HasKeyboard => true;
#endif
}

PC は、一般的な Android スマートフォンよりも大型です。可能であれば、HUD が画面の 20% を超えないようにすることをおすすめします。多くのモバイルゲームでは [画面サイズに合わせて調整] を使用しているため、これを実現するにはまず [固定サイズの物理サイズ] または [固定ピクセルサイズ] に変更することをおすすめします。

[UI スケールモード] が表示されている [キャンバス スケーラー] インスペクタのスクリーンショットは、[固定ピクセルサイズ]、[固定画面サイズ]、および [物理物理サイズ] です。[固定ピクセルサイズ] を選択しました。

Google Play ゲームでの実行を検出した場合、実行時に QualitySettings.SetQualityLevel コマンドを使用して品質設定を動的に設定することもできます。Google Play ゲーム エミュレータは、ANGLE を使用して OpenGL Unity が出力するネイティブ DirectX または Vulkan コマンドを発行するため、モバイルゲームのビルドよりも高いグラフィック フィデリティを実現できます。

8. 入力の処理

Google Play ゲームで出荷されるゲームは、マウスとキーボードでの入力を中心に構築する必要があります。マウスとキーボードでゲームを操作する方法を計画する必要があるので、時間をかけて Input SDK unitypackage を入手してください。このページでダウンロードが表示されない場合は、play-mp-libs グループのアカウントでログインしていることを確認してください。

テストを目的として、多くのゲームはエディタで開発するための基本的なマウスおよびキーボード コントロールを構築します。可能であれば、Chrome OS デバイスまたは Google Play ゲーム エミュレータで実行するときに有効にすることをおすすめします。

Google Play ゲームと Chrome OS では、デフォルトでマウス入力がシミュレートされたタッチに変換されます。Input.GetTouchInput.touchCount を使用する場合、ゲームは期待どおりに動作します。デュアルサム コントロールやピンチ操作によるズームなどのマルチタッチ入力に依存している場合は、アクションをキーの押下にマッピングする必要があります。ゲーム内のアクションをキーの押下にマッピングすることもできます。たとえば、I キーを押して在庫を開き、Esc キーを押してダイアログ ボックスを閉じ、Enter キーを押すことです。ゲーム内メッセージを送信します。

2D プラットホーム マイクロゲームは、矢を使って移動、ジャンプします。独自のゲームを使用している場合は、次のステップで使用する優先キー バインディングがあることを確認します。

9. Input SDK の統合

マウスとキーボードのコントロールのセットアップが完了したので、Input SDK のサポートを追加する必要があります。これによりプレーヤーは、便利なポップオーバーで PC 入力を検出できます。

  1. SDK をプロジェクトにインポートしたら、InputMappingProviderBehaviour.cs という名前のファイルを作成して、以下の内容を追加します。
using System.Collections.Generic;
using Google.Play.InputMapping;
using UnityEngine;
using Input = Google.Play.InputMapping.Input;

public class InputMappingProviderBehaviour : MonoBehaviour
{
    private void Start()
    {
        Input.GetInputMappingClient().RegisterInputMappingProvider(new MyInputMappingProvider());
    }

    private class MyInputMappingProvider : InputMappingProvider
    {
        public InputMap OnProvideInputMap()
        {
            return new InputMap
            {
                InputGroups = new List<InputGroup> { },
                MouseSettings = new MouseSettings
                {
                    InvertMouseMovement = false,
                    AllowMouseSensitivityAdjustment = false
                }
            };
        }
    }

    private enum ActionIds
    {
    }
}
  1. ActionIds で、ゲームで使用しているアクションのリストを入力します。2D プラットホーム マイクロゲームの場合、アクションは「左」、「右」、「ジャンプ」です。
private enum ActionIds
{
    Left,
    Right,
    Jump
}
  1. OnProvideInputMap で、アクションごとに InputAction を作成します。そのためには、アクションの名前、入力、それにバインドするマウスボタンまたはキーコードが必要です。サンプルゲームの場合:
var leftAction = new InputAction
{
    ActionLabel = "Walk Left",
    UniqueId = (int)ActionIds.Left,
    InputControls = new InputControls
    {
        AndroidKeycodes = new[]
        {
            AndroidKeyCode.KEYCODE_DPAD_LEFT
        }
    }
};

var rightAction = new InputAction
{
    ActionLabel = "Walk Right",
    UniqueId = (int)ActionIds.Right,
    InputControls = new InputControls
    {
        AndroidKeycodes = new[]
        {
            AndroidKeyCode.KEYCODE_DPAD_RIGHT
        }
    }
};

var jumpAction = new InputAction
{
    ActionLabel = "Jump",
    UniqueId = (int)ActionIds.Jump,
    InputControls = new InputControls
    {
        AndroidKeycodes = new[]
        {
            AndroidKeyCode.KEYCODE_SPACE
        }
    }
};
  1. 次に、これらの入力アクションをグループに分類します。

マイクロゲームの場合は、グループは 1 つしかありませんが、プレーヤーが必要なアクションを見つけやすくなるように、必要なだけグループを作成できます。これを OnProvideInputMap に追加します。

var movementInputGroup = new InputGroup
{
    GroupLabel = "Movement",
    InputActions = new List<InputAction>
    {
        leftAction, rightAction, jumpAction
    }
};
  1. 作成したすべての入力グループを入力マップに追加します。OnProvideInputMap の return ステートメントを次のように変更します。
return new InputMap
{
    InputGroups = new List<InputGroup> { movementInputGroup },
    MouseSettings = new MouseSettings
    {
        InvertMouseMovement = false,
        AllowMouseSensitivityAdjustment = false
    }
};
  1. 最後に、作成したスクリプトをゲームに追加します。

「入力マッピング プロバイダの動作」が指定された「InputSdk」というノードのスクリーンショット

  1. ゲームを再度デプロイしたら、Shift+Tab を押してゲーム内オーバーレイを開きます。

Google Play ゲーム エミュレータの [ゲーム オプション] オーバーレイのスクリーンショット

  1. 設定したコントロールを表示するには、[コントロール] をクリックします。

Google Play ゲーム エミュレータの [Controls] オーバーレイのスクリーンショット

10. 広告と埋め込みウェブビューを削除する

更新する必要のあるロジックのすべては説明しませんが、すぐに承認してアプリを承認し、プレーヤーに素晴らしいエクスペリエンスを提供するためにすぐに対処できるアイテムが 2 つあります。

まず、プライバシー ポリシーや利用規約のような項目の表示には、埋め込みのウェブビューを使うのが一般的です。Google Play ゲームでは機能しますが、プレーヤーが使用するデスクトップ ブラウザではなく、組み込みの「モバイル」ブラウザに表示されるため、PC プレーヤーが混乱する可能性があります。そのため、Unity では、拡張機能を使用して埋め込みブラウザを表示する場合は Application.OpenURL(url) にフォールバックします。

第 2 に、Google Play ゲームでは、広告は現在許可されていません。ただし、モバイル SDK と Chrome OS プレーヤーでは、広告 SDK をそのままにしておくことができます。GoogleDeviceUtilities.IsGooglePlayGames を使用して、ゲーム内広告を含めるかどうかを決定します。その他の支払い関連の API(Google Pay など)は想定どおりに機能します。

11. 権限と機能

Google Play ゲームでは、多くの Android 機能と権限がサポートされています。一般的な経験則としては、PC のビルドで権限ダイアログをポップアップ表示しないでください。これでビルドの準備が整いました。通常の新規インストールを行い、表示されたダイアログを書き留め、「ゲーム」を送信するために「ToDo」リストに追加してください。

一部の Unity ゲームでは、Android.Permission API を使用して権限をリクエストします。可能な場合は、これらのイベントを if (GoogleDeviceUtilities.IsGooglePlayGames) チェック内にラップし、エラーロジックに直接移動してください。

12. パソコン向けの最適化

Google Play ゲームには、一般的な Android スマートフォンと比べていくつかの違いがあるため、それに応じてゲームを設定することをおすすめします。

テクスチャ圧縮の場合は DXT に切り替えます。ETC などの一般的な Android テクスチャ形式は、プレーヤーの GPU に直接渡すことができない場合、実行時にメモリ内でデコードされます。ASTC は卓越した互換性を備えていますが、ゲームで想定される動作を確認するにはデスクトップ GPU プロファイリング ツールを使用する必要があります。

Unity の [Build Settings] ウィンドウが開いて、[Texture Compression] が展開されています。「DXT(Tegra)」は、ハイライト表示されたテクスチャ圧縮のオーバーライドです。

現在はデスクトップ GPU を使用しているため、グラフィックの品質を向上させることをおすすめします。この設定は、[プロジェクトの設定] の [画質] で直接調整できます。

[プロジェクト設定] の [品質] セクションのスクリーンショット

13. 完了

Google Play ゲームのゲームの作成を開始するための準備がすべて整いました。ゲームのテストとイテレーションを開始できます。同じコードベースを維持することもできますが、ゲームはネイティブの PC ゲームのように感じられるように調整する必要があります。

次のステップ

Google Play ゲームでゲームを販売するためには、次の作業が必要です。

最後に、Google Play ゲームのサポートに関するこれまでの作業の多くが、ChromeOS へのリリースに役立つため、PC と同様にプラットフォームをサポートすることも検討してください。