マイクロソフトが買収したことで話題になったPlayFabを使ってみようと思います。
PlayFabは、ニフティクラウドmobile backendなどと同じくmBaaSと呼ばれるカテゴリのサービスで、自分でDBサーバやAPIサーバを用意することなく、ゲームアプリのバックエンドの仕組みを構築することができます。
世界的にはAWSが展開するGameSparksが直接の競合になるでしょうか。
サーバへの接続は、PlayFabが用意している各種プラットフォーム用のSDKが担ってくれるので非常に簡単です。
もちろんUnity用のSDKもありますし、XcodeやAndroid Studio等ネイティブの環境や、PS4/Xboxなどコンソール機にも対応しているようです。
しかも、Unity用のSDKはUWPの書き出しにも対応しているそうなので、HoloLensやWindowsMRアプリのバックエンドとしても有力な選択肢になります。
(少し前に試したところ、ニフティクラウドのSDKはUWP対応されておらず使用できませんでした)
UnityでPlayFabを使う方法ですが、下記に記載されているように、まずはEditor拡張をインストールすることが推奨されています。
Editor拡張のウインドウでPlayFabで登録したアカウント情報を入力して、SDK本体のダウンロードを行います。
そして、上記に記載してあるサンプルコードを実行して動作を確認してください。
サンプルコードから抜粋した下記が重要な部分になります。
public void Start() { var request = new LoginWithCustomIDRequest { CustomId = "GettingStartedGuide", CreateAccount = true}; PlayFabClientAPI.LoginWithCustomID(request, OnLoginSuccess, OnLoginFailure); }
ゲームの起動サイクルとして、まずはユーザー登録とログインが必要になります。
ショッピングアプリなどと異なり、スマホゲームアプリは、ストアからダウンロードして起動した時に「ユーザー登録」を求められることはほぼ皆無です(ユーザー登録時の離脱を防ぐため)。アプリの動きとしては、端末固有のIDを使ってログインを試みて、サーバ側にユーザーが存在しない場合は新規ユーザーの作成を行い、ユーザーが存在する場合はそのユーザーでログインする、ということを行っています。
LoginWithCustomIDは、端末IDではなくアプリ側で決めたCustomIDを使って上記の動き(ユーザーが存在しなければ作成し、存在したらそのIDでログイン)を行っているメソッドです。なので、サンプルコードを1回目に実行した時に、PlayFabにPlayerが生成され、2回目以降の実行では、その生成したユーザーでログインを行う、という動きになります。
サンプルコードではCustomIDでユーザーを作成していますが、例えばiOSの場合はidentifierForVendorという固有のIDを使って同じことを行うのが推奨されます。(LoginWithIOSDeviceIDを使用)
public void LoginWithUUID() { var uuid = UnityEngine.iOS.Device.vendorIdentifier; //SystemInfo.deviceUniqueIdentifierだとEditorでも動作し、iOSでもvendorIdentifierが取得可能のようだ var request = new LoginWithIOSDeviceIDRequest { DeviceId = uuid, CreateAccount = true }; PlayFabClientAPI.LoginWithIOSDeviceID(request, OnLoginSuccess, OnLoginFailure); }
Androidの場合はLoginWithIOSDeviceIDを使用しますが、DeviceIDの取得が若干面倒なようです。
(SystemInfo.deviceUniqueIdentifierで取得できないのか後ほど検証してみます)
AndroidJavaClass clsUnity = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject objActivity = clsUnity.GetStatic<AndroidJavaObject>("currentActivity"); AndroidJavaObject objResolver = objActivity.Call<AndroidJavaObject>("getContentResolver"); AndroidJavaClass clsSecure = new AndroidJavaClass("android.provider.Settings$Secure"); android_id = clsSecure.CallStatic<string>("getString", objResolver, "android_id");
このように各種プラットフォームで暗黙のユーザー登録とログインができるようになれば、そのプレイヤーに紐付いた値(キャラクターのステータスやスコアなどなど)を簡単に読み書きできるようになります。
また、複数のデバイスで使用したかったり、スマホの機種変更を行ってデータを引継ぎしたりするためには、自動的に作られたアカウントに対して、ユーザー名やメールアドレスとパスワードを設定し、明示的なログインを可能にすることが求められます。各種ソーシャルアカウントに関連付けてそれを使ってログインする、という方法もとても便利です。
PlayFabではどちらの機能も用意されているので、かなり柔軟にユーザー管理を行うことが可能になっています。