2019/09/16追記
こちらの記事は以下の環境で動作確認を行っています。
- Unity 2019.1.13 + IL2CPP + iOS 実機
- Unity 2019.1.13 + IL2CPP + Android 実機
まえがき
Unity から PlayFab を利用するとき、コールバックのネストが深くなりやすく、結果としてコードの可読性が悪くなってしまうことが厄介だなと思っています。
下記のコードは PlayFab のログインのサンプルコードですが、Unity から PlayFab を利用する際は何をやるにもこのコードのようにコールバックで処理を継続していくのが基本です。
using PlayFab;
using PlayFab.ClientModels;
using UnityEngine;
public class PlayFabLogin : MonoBehaviour
{
public void Start()
{
PlayFabSettings.staticSettings.TitleId = "xxx";
var request = new LoginWithCustomIDRequest { CustomId = "GettingStartedGuide", CreateAccount = true};
PlayFabClientAPI.LoginWithCustomID(request, OnLoginSuccess, OnLoginFailure);
}
private void OnLoginSuccess(LoginResult result)
{
Debug.Log("Congratulations, you made your first successful API call!");
}
private void OnLoginFailure(PlayFabError error)
{
Debug.LogWarning("Something went wrong with your first API call.");
}
}
async/await を使ったりしてもっとスッキリ書きたいなと思ったのですが、当然同じことを考える人はいるもので、フォーラムでこんなやりとりがありました。
PlayFab には UnitySDK と CSharpSDK が別に存在するので、CSharpSDK を試してみたらどうかとのことです。
CSharpSDK はもともとサーバーサイドなどで使う想定のもののようですが、Unity も最新の C# が使えるようになったので、Unity でも動くんじゃないかということですね。
早速試してみようと思います。
手順
- こちらのページから CSharpSDK をダウンロードする
- CSharpSDK-versioned\PlayFabSDK\source 以下のファイルを Unity のプロジェクトにコピーする
- async/await を使ったコードに書き直してみる
using PlayFab;
using PlayFab.ClientModels;
using System.Threading.Tasks;
using UnityEngine;
public class PlayFabLogin : MonoBehaviour
{
async Task Start()
{
PlayFabSettings.staticSettings.TitleId = "xxx";
var request = new LoginWithCustomIDRequest { CustomId = "GettingStartedGuide", CreateAccount = true };
var result = await PlayFabClientAPI.LoginWithCustomIDAsync(request);
var message = result.Error is null
? $"Login success! My PlayFabID is {result.Result.PlayFabId}"
: $"Login failed... {result.Error.ErrorMessage}";
Debug.Log(message);
}
}
結果
自分は Unity よりもサーバーサイド歴のほうが長いこともあって、async/await を使った書き方のほうが慣れているので、UnitySDK から CSharpSDK に切り替えて行こうかなと思いました。