自動化

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

playfab-azure-cloudscript

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

今までは CloudScript で Javascript の言語しか使えなかったため、手が出しにくい分野でした。

ところが、C# でも使えるようになったため、Unity を使っている人はより一層使いやすくなりました。

さらにデバッグもできるようになるので、Azure関数を使うメリットはかなり大きいです。

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

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

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

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

アカウント登録やインストール系が多いです。上から一つずつやっていきましょう。

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

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

VSCodeで必要な拡張機能

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

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

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

コマンド実行
dotnet add package PlayFabAllSDK

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

コマンド実行
dotnet add package PlayFabCloudScriptPlugin --version 1.53.190627-alpha

参考:https://www.nuget.org/packages/PlayFabCloudScriptPlugin/1.53.190627-alpha

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

最後に、プロジェクトファイル(〜.csproj)に DefineConstants のタグを追加してください。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <AzureFunctionsVersion>v3</AzureFunctionsVersion>
    <DefineConstants>NETCOREAPP3_1</DefineConstants><!--この1行を追加!!-->

 

以上でひと通り環境構築は終わりです。

Azure 関数で CloudScript を実行する方法

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 関数)の実装

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

HelloWorld の実装

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

まずは公式ドキュメントに記載の通り、こちらを実装します。

    [FunctionName("HelloWorld")]
    public static async Task<dynamic> Run(
        [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequestMessage req,
        ILogger log)
    {
      /* Create the function execution's context through the request */
      var context = await FunctionContext<dynamic>.Create(req);
      var args = context.FunctionArgument;

      var message = $"Hello {context.CurrentPlayerId}!";
      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 関数名を実行し
引数で受け取った inputValue をログ出力しつつ
自分のプレイヤー ID を返り値として返す

難しくないですね。

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

Azure関数の登録

HelloWorld が書けたら、Azure へのサインインAzure にプロジェクトを発行するを参考に、Azure 関数を登録します。

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

PlayFab の CloudScript に登録

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

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

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

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

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

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

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

Azure関数を実行

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

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

まとめ

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

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

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

こう見ると、そこまで難しくないですね。

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

オンライン書籍「猫でもわかる PlayFab 入門」
playfab-book

日本で初めて、PlayFab の参考書を発売しました。

100時間以上の学習内容を凝縮した参考書です。入門として必要な知識は、すべてこの本に記載しました。

 

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です