UnityからPlayFabのCloudFunctionを呼び出してみる

PlayFabにはCloudFunctionというサーバーサイドで処理するスクリプトを定義できます。
便利そうなので試しにUnityから呼び出してみます。

### 環境

* Unity 2019.2.2f1
* PlayFab SDK 2.75.191001

# 呼び出すスクリプトを確認

まずは管理画面でCloudScriptを確認します。（最初から用意されているものを使います）

自動化 -> Cloud Script -> リビジョン
でソースコードを確認できます。

<img width="680" alt="スクリーンショット 2019-10-07 23.54.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59975/f38c60cd-29bd-79ee-2f05-19c7e6f02ba5.png">


最初からhelloWorldという関数が入っているのでそれを使います。

```hello_world.js
handlers.helloWorld = function (args, context) {
    var message = "Hello " + currentPlayerId + "!";
    log.info(message);

    var inputValue = null;
    if (args && args.inputValue)
        inputValue = args.inputValue;
    log.debug("helloWorld:", { input: args.inputValue });

    return { messageValue: message };
};
```

# Unityから呼び出す

Unity側で以下のようなスクリプトを用意して実行してみます。

```PlayFabDemo.cs
using PlayFab;
using PlayFab.ClientModels;
using UnityEngine;

public class PlayFabDemo : MonoBehaviour
{
    public void Start()
    {
        var loginRequest = new LoginWithCustomIDRequest {CustomId = "MyCustomId", CreateAccount = true};
        PlayFabClientAPI.LoginWithCustomID(loginRequest, OnLoginSuccess, OnError);
    }

    private void OnLoginSuccess(LoginResult loginResult)
    {
        Debug.Log("ログイン成功");

        var helloWorldRequest = new ExecuteCloudScriptRequest()
        {
            FunctionName = "helloWorld",
            FunctionParameter = new {inputValue = "naichilab"},
            GeneratePlayStreamEvent = true
        };
        PlayFabClientAPI.ExecuteCloudScript(helloWorldRequest, OnHelloWorldSuccess, OnError);
    }

    private void OnHelloWorldSuccess(ExecuteCloudScriptResult helloWorldResult)
    {
        Debug.Log(helloWorldResult.FunctionResult);
    }

    private void OnError(PlayFabError error)
    {
        Debug.Log(error.GenerateErrorReport());
    }
}
```

コールバック多くて見辛いですがやってることは以下の２つです。

1. ログインする
2. ログイン成功したらCloudFunction `helloWorld` を呼び出す

実行するとそれっぽいログが出てます。

![スクリーンショット 2019-10-07 23.59.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59975/1f22a876-a3c4-06a0-8aa9-3de615a9cb85.png)

よい〜。

# 何が起きた？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59975/8be30dff-ffce-71d8-2520-45227bfa9520.png)

こんな感じですね。

`PlayFabClientAPI.ExecuteCloudScript` でPlayFab上の `helloWorld` を呼び出しています。

便利〜〜〜

# ログを確認する

CloudFunction側にある以下のログがどこに書かれるか確認してみます。

* `log.info(message);`
* `log.debug("helloWorld:", { input: args.inputValue });`

タイトルの概要 -> PlayStreamモニター
を開いておきます。

<img width="577" alt="スクリーンショット 2019-10-08 0.08.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59975/ae6a546c-704a-cdc7-6907-d5ef62e5b06d.png">

この状態でUnity側を実行すると、イベントストリームが流れます

<img width="519" alt="スクリーンショット 2019-10-08 0.09.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59975/f0ca53e4-27f5-15bd-423f-6cefa31c0d0d.png">

Unity側で `GeneratePlayStreamEvent = true` としておくと、ここにCloudScriptの実行履歴が流れます。

<img width="522" alt="スクリーンショット 2019-10-08 0.09.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59975/2cbc6029-b35b-1148-38df-db4b198cfb4b.png">

そこにある `Information` マークを押すと、実行ログの詳細を確認できます。

<img width="508" alt="スクリーンショット 2019-10-08 0.10.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59975/8098e430-d9ed-f454-b222-e976a8b1c8d7.png">

ちゃんと２件のログが入っていました。

# まとめ

* PlayFab上で関数を定義（jsで書く）
* Unityから `ExecuteCloudScript` を使って関数を実行する

こんな感じで簡単に使えました。引数も戻り値も扱えるのでかなり自由度は高いですね。

便利〜〜〜。

# リンク

* CloudScript概要
    * https://docs.microsoft.com/ja-jp/gaming/playfab/features/automation/cloudscript/