自動化

【PlayFab】CloudScriptでAzure Functionsを実行する方法

playfab-azure-cloudscript

2020年2月18日、ついに PlayFab の CloudScript で Azure Functions を実行できるようになりました。

今までは CloudScript で Javascript の言語しか使えずデバッグもできなかったため、手が出しにくい分野でした。

ところが、C# でも使えるようになりデバッグもできるようになったため、より一層使いやすくなりました。

この記事では、「PlayFab + Unity + Azure関数」を使った環境構築をしてきます。

この記事は、公式ドキュメント「クイックスタート: Azure 関数を使用した PlayFab CloudScript の作成」に基づいて記載しています。

JavaScript 版の CloudScript は、Game Manager に「リビジョン」というメニューで出ていますが、2021年の年末くらいに「レガシー(非推奨)」となりました。

今後のサーバー処理は Azure Functions での実装が必須になります。

ねこじょーかー
ねこじょーかー
初めて PlayFab を触る人は、PlayFabの始め方を読んでから戻ってきてください!

では、さっそく見ていきましょう。

Azure Functions を呼び出すための環境構築

Azure まわりの準備

Azure まわりの準備として、あらかじめ Azure サブスクリプションの登録が必要です。

Visual Studio Codeで実行する場合

まずは .NET 6 のインストールをしてください。

Visual Studio Code の拡張機能も必要になるので、以下のインストールをしておきましょう。

Visual Studio Codeで必要な拡張機能

また、Azure Functions を書くために、.NET 6 でローカルプロジェクトの作成をしておきましょう。

ここで作成したプロジェクトに Azure Functions を追加していきます。

作成後、Visual Studio Code のターミナルで以下のコマンドを実行してください。

コマンド実行
dotnet add package PlayFabAllSDK

参考:https://www.nuget.org/packages/PlayFabAllSDK/

これで、ソースコードから PlayFab のモジュール参照ができるようになります。

最後に、CS2AFHelperClasses.cs というクラスが必要になるので、コピーしてプロジェクトに含めてください。

Visual Studio から実行する場合

Visual Studio 2022 をインストールして、公式ドキュメントの「関数アプリプロジェクトを作成する」を参照しながらプロジェクトを作成します。

次に、NuGet パッケージの追加で、PlayFabAllSDK を追加します。

最後に、CS2AFHelperClasses.cs というクラスが必要になるので、コピーしてプロジェクトに含めてください。

CloudScript で Azure Functions を実行する方法

1から10まで説明していると長くなってしまうので、基礎的な説明は省略します。

クライアント側(Unity)の実装

まずは、クライアント側で必要な処理を書いていきましょう。

ログイン処理の実装

ログイン処理については、「何も考えずにログイン処理を実装する」の記事で詳しく解説しているので、合わせて見てみてください。

Azure関数(CloudScript)の呼び出し

次に、実際の呼び出し処理を書いていきます。

private void CallCSharpExecuteFunction()
{
    PlayFabCloudScriptAPI.ExecuteFunction(new ExecuteFunctionRequest()
    { 
        Entity = new PlayFab.CloudScriptModels.EntityKey()
        {
            Id = PlayFabSettings.staticPlayer.EntityId, //Get this from when you logged in,
            Type = PlayFabSettings.staticPlayer.EntityType //Get this from when you logged in
        },
        FunctionName = "HelloWorld", //This should be the name of your Azure Function that you created.
        FunctionParameter = new Dictionary<string, object>() { { "inputValue", "Test" } },
        GeneratePlayStreamEvent = true
    }, (ExecuteFunctionResult result) =>
    {
        if (result.FunctionResultTooLarge != null && (bool)result.FunctionResultTooLarge)
        {
            Debug.Log("This can happen if you exceed the limit that can be returned from an Azure Function," +
                " See PlayFab Limits Page for details.");
            return;
        }
        Debug.Log($"The {result.FunctionName} function took {result.ExecutionTimeMilliseconds} to complete");
        Debug.Log($"Result: {result.FunctionResult.ToString()}");
    }, (PlayFabError error) =>
    {
        Debug.Log($"Opps Something went wrong: {error.GenerateErrorReport()}");
    });

}
うわ、何だか難しそう・・・

と思った人も安心してください。

簡単に言うと、以下のことを処理しているだけです。

実行したログインユーザー1人に対して
引数 inputValue という名前に Test という文字列を入れて
HelloWorld という関数を呼び出す

こうして文字に起こしてみると簡単ですね。

あとは成功したときと失敗したときにそれぞれログが出力されるようになっています。

これをログイン成功時に差し込んであげましょう。

private void OnLoginSuccess(LoginResult result)
{
    CallCSharpExecuteFunction();
}

あとは、Start メソッドにログイン処理を入れたら、クライアント側の準備は完了です。

エンティティについては、エンティティのクイックスタートを参照してください。

あとは、以下のツイートでも少し解説しています。

サーバー側(Azure Functions)の実装

次に、サーバー側の実装をしていきます。

HelloWorld の実装

最初につくるメソッドと言えば「HelloWorld」ですね。

次のとおり記載してください。

[FunctionName("HelloWorld")]
public static async Task<dynamic> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
        ILogger log)
{
    string body = await req.ReadAsStringAsync();
    var context = JsonConvert.DeserializeObject<FunctionExecutionContext<dynamic>>(body);
    var args = context.FunctionArgument;
    var message = $"Hello {context.CallerEntityProfile.Lineage.MasterPlayerAccountId}!";
    log.LogInformation(message);

    dynamic inputValue = null;
    if (args != null && args["inputValue"] != null)
    {
        inputValue = args["inputValue"];
    }
    log.LogDebug($"HelloWorld: {new { input = inputValue } }");

    return new { messageValue = message };
}

 

簡単に言うと、以下のことを処理しています。

HelloWorld という Azure Functions を実行し
引数で受け取った inputValue をログ出力しつつ
自分のプレイヤー ID を返り値として返す

この状態でクライアントから実行すると、Azure に登録されている HelloWorld が呼び出されて、上記のメソッドが呼び出されるという仕組みです。

Azure関数の登録

HelloWorld が書けたら、Azure Functions を登録します。

Visual Studio Code と Visual Studio で手順が異なるので注意してください。

初回は5分くらい時間がかかりましたが、2回目以降は30秒くらいで終わりました。

PlayFab の CloudScript に登録(Visual Studio Code)

Azure Functions を登録するだけではダメで、さらに PlayFab の CloudScript と紐付けをする必要があります。

まずは Visual Studio Code で、Azure に登録した関数の URL を取得します。

  1. 左の Azure アイコンをクリック
  2. 反映したい関数を右クリック
  3. Copy Function Url をクリック

次に、コピーした URL を PlayFab に登録します。

  1. 左の PlayFab アイコンをクリック
  2. 反映したいタイトルを右クリック
  3. Register HTTP function をクリック

その後、先ほどコピーした URL とファンクション名を入力すれば、登録完了です。

PlayFab の画面上からも登録されたことが確認できます。

PlayFab の CloudScript に登録(Visual Studio)

Azure 内で関数を確認する」を参照しながら、Azure Functions の URL をコピーしてきます。

PlayFab の Game Manager を開いて、関数を登録してください。

playfab-azure-cloudscript

Azure Functions を実行

Unity を実行して、Azure Functions を呼び出してみましょう。

成功すると、以下のようにログが出力されます。

まとめ

CloudScript で Azure Functions を実行する方法を見てきました。

簡単にまとめると、以下のようになります。

CloudScript で Azure Functions を実行する流れ
  1. クライアント側(Unity)に、CloudScript を呼び出す処理を書く
  2. サーバー側(Azure Functions)に、実態の処理を書く
  3. Azure Functions を Azure に登録
  4. Azure Functions を PlayFab の CloudScript として登録

みなさんも CloudScript と Azure Functions を連携させて、サーバー処理とクライアント処理を C# で統一していきましょう。

PlayFab の書籍も好評発売中!
playfab-book

PlayFab のことをもっと皆さんに知ってもらいたくて、合計500ページ以上にもなる書籍を5冊に分けて執筆しました。

私の知識をすべて詰め込んでいるので、ゲーム開発をさらに加速させたい方はぜひご覧ください。

COMMENT

メールアドレスが公開されることはありません。