Help us understand the problem. What is going on with this article?

Unity+PlayFabでasync/awaitを使う方法

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 でも動くんじゃないかということですね。

早速試してみようと思います。

手順

  1. こちらのページから CSharpSDK をダウンロードする
  2. CSharpSDK-versioned\PlayFabSDK\source 以下のファイルを Unity のプロジェクトにコピーする
  3. 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);
    }
}

結果

特に問題なく動くようですね。
image.png

自分は Unity よりもサーバーサイド歴のほうが長いこともあって、async/await を使った書き方のほうが慣れているので、UnitySDK から CSharpSDK に切り替えて行こうかなと思いました。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away