1. はじめに
最終更新日: 2022 年 10 月 18 日
PC 版 Google Play Games に向けたゲームの準備
Google Play Games を使えば、モバイルゲームを Windows PC でも簡単にプレイできます。つまり、ゲームを再設計したりビジネスモデルを再設計したりすることなく、プレーヤーのエンゲージメントとオーディエンスを拡大できます。新しい PC プレーヤーに可能な限り最高のエクスペリエンスを提供するには、まだいくつかの変更が必要です。
学習内容
この Codelab では、ゲームをリリースするための要件のチェックリストの基本部分をカバーし、PC 版 Google Play Games 用に独自の Unity ゲームを準備する方法について説明します。Play ゲームのログインや Play Integrity API など、より高度な統合については説明しません。
- Unity から x86 アーキテクチャ用にビルドする方法。
- テスト方法と Google Play Games エミュレータへのデプロイ方法。
- ユーザー インターフェースを変更して PC で見栄えよく見せる方法
- Google Play Games エミュレータで実行中かどうかを検出し、それに応じてゲームを調整する方法
必要なもの
- Unity 2020 LTS インストール(この Codelab は 2020.3.30f1 でビルドされています)。
- Google Play Games エミュレータ。
2. セットアップする
プロジェクトを開くか、新しいプロジェクトを作成する
- 2D Platformer Microgame を使用して新しいプロジェクトを作成するか、独自のプロジェクトを開きます。
- プロジェクトから、[File] ->ビルド設定] に移動し、Android 用のビルドを設定していることを確認します。
3. Google Play Games エミュレータを準備する
まず、エミュレータをダウンロードします。
インストールすると、ウィンドウに Android デスクトップが表示されます。
ゲーム開発に適した、多機能かつ高性能な Android 環境です。Android Debug Bridge(adb)で、localhost 上のデバイスとして表示されます。
❯ adb devices List of devices attached localhost:6520 device
エミュレータを検出するには、最新バージョンの adb が必要です。Android Studio にバンドルされているバージョンは動作しますが、Unity に付属する adb は動作しない場合があります。互換性のあるバージョンはエミュレータにバンドルされており、C:\Program Files\Google\Play Games Developer Emulator\current\emulator
にあります。最適なデベロッパー エクスペリエンスを実現するには、Android Studio をインストールし、Android SDK の管理に使用することをおすすめします。
エミュレータが adb から切断された場合は、次のようにコマンドラインから再接続します。
adb connect localhost:6520
4. エミュレータを直接ビルドしてデプロイするように Unity を構成する(省略可)
Unity に付属する adb のバージョンは、エミュレータと互換性がない可能性があります。確認するには、[ファイル] ->Build Settings に移動し、[Run Device] ダイアログをチェックして、表示されているかどうかを確認します。
プロジェクト、ビルドプロセス、コンフォート レベルに応じて、Google Play Games エミュレータに直接デプロイするように Unity を構成するか、APK をビルドして adb install
で手動でデプロイするかを選択できます。手動でデプロイする場合、必要な変更は最小限ですが、イテレーション サイクルが遅くなる可能性があります。
エミュレータに直接デプロイするには、次の 2 つの手順を行います。
- 別の Unity SDK(Android Studio にインストールされているものが理想的)を使用するように Unity を構成します。
- Unity のバグを回避するように Build Tools のバージョンを更新します。
Unity に付属の Android SDK のバージョンではエミュレータが検出されない可能性が高いため、Android Studio を使用して最新の SDK をインストールします。
- Android Studio を開き、[Edit] ->[設定] ->外部ツール。
Android SDK Tools Installed with Unity
のチェックボックスをオフにし、Android Studio のインストール パス(通常はAppData/Local/Android/sdk
)を指定します。Android NDK
オプションはそのままにします。
接続済みのデバイスを更新すると、ビルド ウィンドウに Google HPE device (localhost:6520)
が表示されます。
このバグの状態と Unity のバージョンによっては、ビルドツールのバージョンの変更も必要になる場合があります。これを行うには、mainTemplate.gradle
と launcherTemplate.gradle
を生成していることを確認します。
- [Player Settings] の [Project Settings] ウィンドウを開き、
Publishing Settings
セクションを見つけます。 - [Build] オプションまで下にスクロールし、[Custom Main Gradle Template] にチェックを入れます。「Custom Launcher Gradle Template」を使用すると、両方の Gradle ファイルが
Assets\Plugins\Android\
に生成されます。
- 文字列
**BUILDTOOLS**
の任意のインスタンスを30.0.0
に置き換えます。どちらのファイルでも、コードのセクションは次のようになります。
android { compileSdkVersion **APIVERSION** buildToolsVersion '30.0.0'
5. Chromebook にデプロイ(省略可)
ChromeOS デバイスを使用すると、Google Play Games エミュレータにアクセスしなくても、Google Play Games のゲームの開発を開始できます。PC 版 Google Play Games と同様に、Chromebook はキーボードとマウスを搭載し、大画面を備え、x86 構成で利用できます。Chromebook では、Android Logcat Unity プラグインを使用します。
- パッケージ マネージャーを開き、
Unity Registry
でAndroid Logcat
を検索します。
また、Android 開発用に Chromebook を構成する必要もあります。最初に Linux を有効にします。
- [設定] ->デベロッパー ->Linux
次に、ADB デバッグを有効にします。
- [設定] ->デベロッパー ->Linux 開発環境 ->Android アプリの開発 ->ADB デバッグを有効にします。
また、Chromebook の IP アドレスも取得します。これを行う最も簡単な方法は、
- ネットワーク情報アイコンをクリックして Chromebook の IP アドレスを取得します。
- [ウィンドウ] ->分析 ->Android Logcat を選択して [Android Logcat] ウィンドウを開きます。
- デバイスリストを開きます。現在、何も接続されていない場合は「
No Device
」と表示されることがあります。
- [その他の接続オプション] をクリックし、Chromebook の IP アドレスを入力します。
- [接続] をクリックします。[Success] ウィンドウが表示されます。
Unity の [Run Device] リストに Chromebook が表示されます(事前に画面の更新が必要になる場合があります)。
Chromebook にゲームをデプロイし、PC のようなハードウェアでテストと開発を始められる。
6. テストビルドをデプロイする
Google Play Games では、ゲームの x86 バージョンをデプロイする必要があります。これは、デスクトップ PC でパフォーマンス ベンチマークを達成する方法の一環です。Unity のすべての LTS バリアントでは、x86 および x86-64 と互換性のある Android ビルド(「Chrome OS」というラベル)を生成できます。Unity バージョン 2018 以前では x86 ビルドを生成できます。これらのアーキテクチャを活用するには、まず IL2CPP スクリプト バックエンドに切り替える必要があります。これは、arm64 をサポートするために本番環境ですでに使用されている可能性が高いです。
- [ファイル] ->Build Settings を実行して [Build Settings] ウィンドウを開き、[Player Settings] をクリックします。
- [Other Settings] セクションに移動し、
Scripting Backend
をIL2CPP
に切り替えます。
x86 または x86-64 のサポートも有効にする必要があります。Google Play Games プラットフォームにリリースするために必要なのは x86 のサポートのみですが、x86-64 をおすすめします。
Frame Pacing ライブラリの Unity バンドルのバージョンも Google Play Games と互換性がないため、起動時にゲームがクラッシュします。
- [Player Settings] ウィンドウでフレーム ペーシングを無効にするには、[Resolution and Presentation] セクションを開き、[Optimized Frame Pacing] チェックボックスをオフにします。
ビルドの準備が整いました。
- [Build Settings] ウィンドウをもう一度開き、[Build And Run] をクリックします。エミュレータ ウィンドウにゲームが表示されます。
ゲームをデプロイできない場合は、「Google HPE device (localhost:6520)」と表示されているかどうかを確認します。[Run Device] に選択します。見つからない場合は、HPE_Dev が実行されており、Android のホーム画面が表示されていることを確認します。まだデバイスリストに表示されない場合は、使用している adb.exe
を指定して adb connect localhost:6520
を実行します。Android Logcat Unity plugin を使用している場合は、[Tools] ->ターミナルを開きます。ターミナルを開き、Unity で使用しているものと同じ adb.exe
があるディレクトリに移動します。
ターミナルを開きます。ハイライト表示されます。style="width: 624.00px"src="img/9101ce3c95fb1aa2.png"srcset="img/9101ce3c95fb1aa2_36.png 36w.サイズ(max-width: 840px)100vw, 856px">
7. ゲームを PC に適応させる
可能であれば、プラットフォームに依存しない指標や、特定の機能の有無に基づいて、ゲームに変更を加えるようにしてください。たとえば、Android のプレーヤーはマウスとキーボードを接続したり、モニターを接続したりできます。そのため、デバイスの設定に応じて操作スキームや HUD 要素を変更すると、サポートされているすべてのプラットフォームで PC 版 Google Play Games の機能を活用できます。
プレーヤーが Google Play Games または ChromeOS を使用しているかどうかに基づいてロジックを変更することが合理的である場合は、このスクリプトを使用して 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% を超える部分を占めないようにすることをおすすめします。多くのモバイルゲームでは [Scale With Screen Size] が使用されるため、これを [Constant Physical Size] に変更します。[固定ピクセルサイズ]を選択します目標達成に向けた適切な第一歩となります
Google Play Games で実行されていることを検出した場合は、実行時に QualitySettings.SetQualityLevel
コマンドを使用して品質設定を動的に設定することもできます。Google Play Games エミュレータは、ANGLE を使用して、OpenGL Unity が出力するネイティブ DirectX または Vulkan コマンドを発行します。そのため、モバイルゲームのビルドよりも高いグラフィックの忠実度を実現できる可能性があります。
8. 入力処理
Google Play Games で配信するゲームは、マウスとキーボードによる入力を中心に構築する必要があります。マウスとキーボードを使用してゲームを操作する方法を計画する必要があるため、この機会に Input SDK の Unity パッケージを入手してください。そのページにダウンロードが表示されない場合は、play-mp-libs グループのアカウントでログインしているかどうかを確認してください。
多くのゲームは、テスト目的で、エディタでの開発用にマウスとキーボードの基本的なコントロールを作成します。可能であれば、ChromeOS デバイスまたは Google Play Games エミュレータで実行するときに有効にすることをおすすめします。
デフォルトでは、Google Play Games と ChromeOS はマウス入力を触覚のシミュレーションに変換します。Input.GetTouch
と Input.touchCount
を使用している場合、ゲームは引き続き想定どおりに動作します。デュアルサム コントロールやピンチによるズームなど、マルチタッチ入力に依存している場合は、アクションをキーの押下にマッピングする必要があります。また、キーの押下によるゲーム内アクションもマッピングする必要があります。たとえば、I キーを押してインベントリを開く、Esc キーでダイアログ ボックスを閉じる、Enter キーを押してゲーム内メッセージを送信するといった具合です。
2D プラットフォーマー マイクロゲームは、矢印で移動し、スペースでジャンプします。独自のゲームを使用する場合は、次のステップで使用するキー バインディングが適切であることを確認してください。
9. Input SDK の統合
マウスとキーボードのコントロールを設定したら、Input SDK のサポートを追加する必要があります。これにより、プレーヤーは便利なポップオーバーで PC の入力を見つけやすくなります。
- 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 { } }
- 次に、ゲームで使用するアクションのリストを
ActionIds
に入力します。2D プラットフォーム マイクロゲームの場合、アクションは「左」、「右」、「ジャンプ」です。
private enum ActionIds { Left, Right, Jump }
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 つしかありませんが、プレーヤーが必要なアクションを見つけられるようにするために必要な数だけ作成できます。次の内容を OnProvideInputMap
に追加します。
var movementInputGroup = new InputGroup { GroupLabel = "Movement", InputActions = new List<InputAction> { leftAction, rightAction, jumpAction } };
- 作成したすべての入力グループを入力マップに追加します。
OnProvideInputMap
の return ステートメントを次のように変更します。
return new InputMap { InputGroups = new List<InputGroup> { movementInputGroup }, MouseSettings = new MouseSettings { InvertMouseMovement = false, AllowMouseSensitivityAdjustment = false } };
- 最後に、作成したスクリプトをゲームに追加します。
- ゲームを再度デプロイするときに、
Shift+Tab
を押してゲーム内オーバーレイを開きます。
- [管理] をクリックして、設定した管理を確認します。
10. 埋め込みウェブビューを削除する
プレーヤーに優れたエクスペリエンスを提供するには、埋め込みウェブビューを削除する必要があります。プライバシー ポリシーや利用規約などのアイテムを表示するために、埋め込みウェブビューを使用するのが一般的です。これらは Google Play Games で動作しますが、埋め込みの「モバイル」に表示されます。ブラウザが使用されるため、PC プレーヤーを混乱させる可能性があります。そのため、Unity で拡張機能を使用して埋め込みブラウザを表示する場合は、Application.OpenURL(url)
にフォールバックします。
11. 権限と機能
Google Play Games でサポートされていない Android の機能や権限がいくつかあります。一般的な経験則として、PC ビルドでは権限ダイアログを決してポップアップしてはなりません。ビルドの準備ができたら、一般的な新規インストールを行い、Todo に追加するダイアログを書き留めておくことをおすすめします。ゲームを送信する際のリストです
一部の Unity ゲームは、Android.Permission API を使用して権限をリクエストします。これらを if (GoogleDeviceUtilities.IsGooglePlayGames)
チェックでラップし、該当する場合は失敗ロジックに直接移動する必要があります。
12. デスクトップの最適化
Google Play Games は、一般的な Android スマートフォンと比べるといくつか異なるため、適宜ゲームを設定してください。
テクスチャ圧縮に DXT に切り替える。ETC などの一般的な Android テクスチャ形式は、プレーヤーの GPU に直接渡すことができない場合、実行時にメモリ内でデコードされます。ASTC はデスクトップに最適な互換性を提供しますが、ゲームで想定される動作を確認するには、デスクトップ GPU プロファイリング ツールを使用する必要があります。
現在はデスクトップ GPU を使用しているため、グラフィックの品質も向上させることをおすすめします。[プロジェクトの設定] の [品質] で直接調整できます。
13. 完了
Google Play Games 向けのゲームの開発を開始する準備が整いました。ゲームのテストと反復処理を開始できます。コードベースは同じでも、ネイティブ PC ゲームのように感じられるようにゲームを調整する必要があることを覚えておいてください。
次のステップ
Google Play Games でゲームをリリースするには、さらに以下のような作業が必要です。
- 最新情報については、クイックスタートをご覧ください。
- Play Games サービス ログイン v2 にアップグレードすると、起動時にプレーヤーが自動的にログインされ、連続性要件を満たすことができます。
- Play Integrity API を実装して、PC でもモバイルと同様のセキュリティを確保します。
Google Play Games をサポートしてきたこれまでの作業の多くは、ChromeOS のリリースにも役立っています。PC とともにこのプラットフォームをサポートすることを検討する必要があります。