Azure PlayFab上にテストユーザーを大量生成してギフトをさくっと一括配布してみた

## 前書き
PlayFab には `スケジュール済みタスク` という無料で使える便利な機能があります。
今回はこれを使ってゲーム内の全ユーザーにギフトを一括配布してみようと思います。

せっかくなので実運用を見据えて

- 数千人規模に一括で配布して大丈夫なのか
- 配布にどれくらいの時間がかかるのか

という点も検証してみます。

## 時間がない人のための結論
- 1000ユーザーに2分でギフトを配れました。
- 3000ユーザーには6分で配れたので件数と処理時間は比例しそうです。
- ノンコーディングで簡単に使えて便利。とても良いです。

※ギフト配布はノンコーディングでできますが、ゲーム内でインベントリにアクセスするコードは必要です。

## 目次
- コンソールアプリから PlayFab にアクセスする準備をする
- ユーザーを PlayFab 上に大量生成してみる
- GameManager で全ユーザーにギフトを配布してみる
- さらに多くのユーザーにギフトを配布してみる

## コンソールアプリから PlayFab にアクセスする準備をする
PlayFab に入門されたばかりの方は、Unity から SDK を使って PlayFab にアクセスする方が多いと思います。

ですが今回は Unity を使う必要はないので VisualStudio でコンソールアプリを作り、そちらから PlayFab にアクセスしてみます。

早速コンソールアプリ（.NET Core）のプロジェクトを作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/d0af6cc8-ebe8-5d65-d120-03622e33b9d0.png)

プロジェクトができたら NuGet から PlayFabAllSDK をインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/b913dcfc-3ee1-403c-e0be-b888ce56900a.png)

これで準備は完了です。

## ユーザーを PlayFab 上に大量生成してみる
Program.cs を雑に書き換えて1000ユーザー作ってみます。

```C#
using PlayFab;
using PlayFab.ClientModels;
using System;
using System.Threading.Tasks;

public static class Program
{
    static async Task Main(string[] args)
    {
        // TitleIdは自分のIDに書き換えてください
        PlayFabSettings.staticSettings.TitleId = "xxx";

        var createUserNum = 1000;
        
        for (int i = 0; i < createUserNum; i++)
        {
            var request = new LoginWithCustomIDRequest { CustomId = $"CustomID-{i}", CreateAccount = true };
            await PlayFabClientAPI.LoginWithCustomIDAsync(request);

            Console.WriteLine(i);
        }

        Console.WriteLine($"{createUserNum} user created !!");
        Console.ReadLine();
    }
}
```
実行して暫く待つと `1000 user created !!` と表示されて処理が完了します。

GameManager を開いて、ユーザーが作成できたか確認してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/4b93eb33-757a-8ae6-7e1d-5e2849e88a17.png)
無事に1000人のユーザーが作成されていますね。

## GameManager で全ユーザーにギフトを配布してみる
まずは新しいスケジュール済みタスクを登録します。

ボタンのテキストはスケーリング済みタスクになっていますが、気にしないでおきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/af2644ad-bf47-c71b-567e-bd13dd08684a.png)

ギフトを配るタスクの設定を行います。
配るアイテムなどを正しく設定したら保存して実行してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/20bf1983-e3cd-8124-88a9-4190cd343236.png)

このような画面に遷移します。
ステータスを見るとギフトを配布中であることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/3a4d3d7f-2204-a382-5882-c5a4a0be7aa7.png)
ちなみに黒塗り部分はタスクを実行したユーザーの名前が表示されています。
こうした作業の記録が自動的に残るのも地味に嬉しいですね。

さて、2分ほど待つとステータスが成功に変わりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/a27a69e8-b86c-dd92-7624-f7774b634444.png)

適当なユーザーのインベントリを開くと、ちゃんとギフトが届いていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/de5e8311-aeea-cfe8-27fe-a1d6be7fb6ae.png)

とってもお手軽ですね！

ちなみに1度登録したタスクを再実行するときは、対象のタスクにチェックを入れて `タスク実行` をワンぽちするだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/1836277f-77ba-a3e0-35cd-cbc021f8e65f.png)
とってもお手軽ですね！（2回目）

## さらに多くのユーザーにギフトを配布してみる
ユーザー数を約3000人に増やしてギフトを再度配布してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/a29237b4-594d-8d4a-e1fc-b8bbf6cc5e85.png)
実行時間は6分でした。

ユーザー数が3倍になったことで、時間も3倍かかっているようですね。
これ以降も件数と処理時間が比例するなら、ユーザー数が1万になると実行時間は20分程度になります。

これはもう少し早くなってほしいところですね。
でも有料プランならタスクの並列実行などもできるようなので、大きなタイトルを運用する場合は何かしらの対応手段はありそうです。

## まとめ
カジュアルゲームでもソーシャルゲームでもMMOでも必須なギフト機能をこんなにお手軽に使うことができました。
こんな機能が無料で使えるなんて素晴らしいですね。

自分が制作中のゲームにも早速組み込んでみようと思います。