10
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-07-20

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 に切り替えて行こうかなと思いました。

10
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?