PlayFabのクラウドスクリプトでアイテムを渡してみる

Microsoftのモバイルゲームバックエンドサービス(mBaaS)のAzure PlayFab。
扱いやすさとMAUベースの個人開発者に優しい料金体系から注目が広まっており、最近は情報共有も盛んになってきて本当に助かります。

[UnityでPlayFabを使い始める方法（インストール〜匿名ログイン）](https://qiita.com/naichilab/items/b286babac60932792f0a)
[個人のゲーム開発者がAzure PlayFabに入門してみた4つの理由](https://qiita.com/_y_minami/items/6baa0445c2b161aeec65)

この記事や、リンクから飛べる記事で

* unityとの連携
* 匿名ログイン
* ユーザーデータの操作

あたりはサクっと出来ちゃう感じ。結構ビビります。

#サーバーでアイテムをプレイヤーに渡したい
「サーバー上でアイテムをプレイヤーに渡す処理」を作ってみたいなと思いました。という事で

* アイテム
* クラウドスクリプト

のとっかかりを記載してみます。間違いや非効率な部分があったらすみません。


##カタログを作ってみる
まず、アイテムを作るにはそのアイテムを管轄する「カタログ」が必要なそうで。

* エコノミー→カタログ→新しいカタログ

![カタログ１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507462/1b285c9b-b331-cd9c-17e5-683a27f8a4a7.png)

カタログバージョンを入力せよとの事
![カタログ2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507462/da3d4b4b-e9a3-7305-ee44-571ea2639b08.png)

アイテムカタログ…カタログとは…
ネットを検索したらニッセン春号が出たので何も考えずに[nissen_spring]と付けました。秋なのに。

「バージョン」と書いてますが文字列で大丈夫みたいです。
![カタログ3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507462/b334ce70-1e3e-0285-3496-9b4b10e70cd7.png)
##アイテムを作ってみる
次にカタログに内包されるアイテムを作ります。
カタログの右上に新しいアイテムの作成ボタンがあります。

![カタログ4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507462/37204ecd-4f50-9e15-6d7b-9a59c2ffe233.png)

最近は魚がおいしいのでsanmaを登録。表示名も記載してみる。
![カタログ5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507462/34d1969b-709f-0c44-ab81-ddc06f59af32.png)

アイテムクラスや、タグなどもこの先使うのだろうけど今のところはまだ使っていません。

下の方にアイテムの保存があるので、それを押すとアイテムが登録されます。
スタック可能や、トレード可能などのオプションもあるようです。

他のアイテムも登録。

![カタログ8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507462/53d6a0a0-c083-ab08-b22f-dc35c417ba33.png)
**アイテムカタログニッセン春号（内容：鮪・鮭・秋刀魚）**が爆誕。

##クラウドスクリプト
作ったアイテムを、プレイヤーに対して渡す方法としてクラウドスクリプトを使ってみました。
playfabは、ダッシュボードからプレイヤーに対してクラウドスクリプトを実行できるようでそれで試してました。
もちろん、クラウドスクリプトはunityから呼び出す事も出来ます。

まずはクラウドスクリプトを作ります。

* 自動化→cloudScript→リビジョン

でエディタが開きます。ここにスクリプトを記載できるようです。
![クラウドスクリプト１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507462/00ece486-880e-39ec-cbb7-3705d042dfc6.png)

こんな感じに記載しました。
![クラウドスクリプト2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507462/cae1893f-47c3-fcec-9130-051f35281d23.png)

```Javascript
// 初めてのクラウドスクリプト
handlers.getNissenFish = function (args, context) {

    // requestに全て詰め込む
    var request = {
        "CatalogVersion": "nissen_spring",  //カタログバージョンを指定
        // ItemGrant型配列を定義
        "ItemGrants": [
            {
                "PlayFabId": currentPlayerId,
                "ItemId": "maguro"
            },
            
             {
                "PlayFabId": currentPlayerId,
                "ItemId": "sanma"
            }           
        ]
    };

    // 全て詰め込んだ request を引数にserver.GrantItemsToUsersを呼び出す。
    var playerStatResult = server.GrantItemsToUsers(request);        
        
    };
```

###解説
```Javascript:一行目
handlers.getNissenFish = function (args, context) {
```
この記載で、**getNissenFish**がスクリプト呼び出し名となります。

```Javascript:最後
var playerStatResult = server.GrantItemsToUsers(request); 
```
最後のこの「server.GrantItemsToUsers」がユーザーにアイテムを与える命令になります。引数としてパッケージングされものをrequestとして入れています。（その結果をplayerStatResultが受け取る形になる）

さて、プレイヤーにアイテムを渡すAPI「GrantItemsToUsers」の説明はこちらです。
[playFabのGrantItemsToUsersのリファレンス]
(https://docs.microsoft.com/en-us/rest/api/playfab/server/player-item-management/grantitemstousers?view=playfab-rest)

自分が英語が出来ないので機械翻訳でなんとか読み取ると…

* 「CatalogVersion（string）」と「ItemGrants（ItemGrant配列）」が必要
* ItemGrant配列には「PlayFabId」（操作が実行されるプレイヤーID）や渡すべき「ItemId」など、様々なものが入れられるらしい。

「"ItemId": "maguro"」のようにkeyとvalueの対で記載。
currentPlayerIdは実行したプレイヤー自身のID。これに対し、maguroとsanmaを渡します。

```Javascript
    // requestに全て詰め込む
    var request = {
        "CatalogVersion": "nissen_spring",  //カタログバージョンを指定
        // ItemGrant型配列を定義
        "ItemGrants": [
            {
                "PlayFabId": currentPlayerId,
                "ItemId": "maguro"
            },

             {
                "PlayFabId": currentPlayerId,
                "ItemId": "sanma"
            }           
        ]
    };
```

スクリプティングが終わったら、上にあるリビジョン〇として保存、を押す
![クラウドスクリプト3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507462/0edafde5-97dc-268f-e676-d2e17475aa5e.png)

**その後デプロイを押す（忘れないように）**
![クラウドスクリプト4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507462/aeff4e7a-b19e-b217-e6d0-d68ef2187354.png)

任意のプレイヤーのページに進み、CloudScriptを実行
![プレイヤー１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507462/b394c313-baa1-c2b0-cd30-b0487145ab42.png)

getNissenFish を選択し、スクリプト実行
![プレイヤー3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507462/c531cb4d-c607-9ee8-af19-35175a27e22b.png)

**秋刀魚とまぐろが手に入った！**
![プレイヤー4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507462/9c7b8e60-c0b0-b822-dc5c-c830ceddb916.png)


###おまけ：アイテムのカスタムパラメータ
playFabのアイテムはカスタムパラメータが持てる。つまり、レベルだけ持ってるみたいな簡単なキャラクターはアイテムとして実装するのがいいっぽい。
![カタログ6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507462/c8ce6c97-243c-a586-96f7-555d4d0f4cbe.png)

![カタログ7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507462/a5f39131-91bd-a470-39f4-705d48b801d3.png)

キャラをアイテムとして持つ的な質問があるフォーラム（要翻訳）
https://community.playfab.com/questions/18917/getting-data-about-all-characters.html
https://community.playfab.com/questions/29930/save-character-as-items.html