Azure PlayFab をサーバーサイド（ASP.NET Core Web API）から利用する

## はじめに
この記事ではサーバーサイドから PlayFab を利用する方法を紹介します。

サーバーサイドの言語や FW は何でも良いのですが、今回は C# (ASP.NET Core) を使って Web API を用意してみます。

サンプルでは用意した Web API を通して PlayFab の TitleInternalData（クライアントでは扱うことができない内部データ）を取得して表示します。

対象読者は PlayFab やサーバーサイドの初心者の方です。
これらにある程度詳しい方には以下の 3 行の情報で事足りると思います。

- タイトルの SecretKey を発行する
- サーバーサイドで PlayFabSettings.staticSettings.DeveloperSecretKey に SecretKey をセットする
- サーバーサイドで PlayFabServerAPI を使って PlayFab へアクセスする

## 環境
- Windows 10
- .NET Core 3.1
- Visual Studio Community 2019 16.4.1

## 手順
### 1. タイトルの Secret Key を発行する
GameManager にログインして、自分のタイトルを開いて [歯車アイコン] を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/0ef72913-a873-841b-169a-c1e93e7d0756.png)

[タイトルの設定] を押します。
![image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/c3136003-cf18-522d-d191-40956469d579.png)

[シークレットキー] を押します。
![image (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/7712bff4-a898-e1ad-d8c7-1f3f804edea2.png)

[名前] に任意の名前を入力して [シークレットキーを保存] を押します。
![image (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/ffab2011-fa28-191a-6906-9cb4b5d2fb36.png)

発行されたシークレットキーを控えてこきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/e2c3490e-6a0c-da8a-6c8a-fae738c299bc.png)


### 2. Web API を作成する
#### 2.1. プロジェクトを作成する
Visual Studio を起動して [新しいプロジェクトの作成] を押します。
![image (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/4ece7270-75d9-c9f6-c7c7-12ea3b6bf4b4.png)

[web] を検索して [ASP.NET Core Web アプリケーション] を選択して [次へ] を押します。
![image (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/d97e4519-e6f6-611c-6d23-1f1906c600cf.png)

任意の [プロジェクト名] [場所] [ソリューション名] を入力して [作成] を押します。
![image (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/266d5a05-a7f7-0b56-fd9d-cf0572590af3.png)

[API] を選択して [作成] を押します。
![image (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/d2247e99-40b9-3a86-f42e-04e03462b3cd.png)

暫く待つとプロジェクトが作成されてこのような画面が表示されます。
![image (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/ac4a413e-7da2-d9e2-40a0-5c2fdeda3358.png)

#### 2.2. NuGet から PlayFabAllSDK をインストールする
NuGet パッケージマネージャーを開きます。
![image (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/cb6d249d-fec1-2e0e-6c0e-a69ba3e00889.png)

[参照] を押してから [PlayFab] を検索します。
[PlayFabAllSDK] が表示されたら選択してインストールします。
![image (11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/36022d79-2b4a-3510-7653-7d3640ab8a1c.png)

[OK] を押します。
![image (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/94edd1f9-0044-19bf-2970-018a6c1c55a0.png)

#### 2.3. TitleInternalData を取得する API を作成する
ソリューションエクスプローラーで [Controllers] を右クリックし、コントローラーを追加します。
![image (13).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/5882a2f7-4042-83a1-8d7b-21221f7baf96.png)

[読み取り/書き込みアクションがある API コントローラー] を選択して [追加] を押します。
![image (14).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/8217c607-d8a9-7786-b6e6-81a3cd040b96.png)

任意のコントローラー名を入力して [追加] を押します。
![image (15).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/a1997362-69ac-151b-047a-3978a609d62a.png)

TitleDataController.cs を開いて using を追加します。

```C#
using PlayFab;
using PlayFab.ServerModels;
```

TitleDataConrtoller.cs の最初の Get メソッドを下記の通りに書き換えます。

```C#
// GET: api/TitleData
[HttpGet]
public async Task<Dictionary<string, string>> Get()
{
    var request = new GetTitleDataRequest();
    var titleInternalData = await PlayFabServerAPI.GetTitleInternalDataAsync(request);

    return titleInternalData.Result.Data;
}
```

#### 2.4. PlayFab の接続情報を設定する

Startup.cs を開いて using を追加します。

```C#
using PlayFab;
```

Configure メソッドで PlayFab の接続情報（TitleID と SecretKey）を設定します。

```C#
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // 下 2 行を追加
    PlayFabSettings.staticSettings.TitleId = "ここに Title Id を入れます";
    PlayFabSettings.staticSettings.DeveloperSecretKey = "ここに Secret Key を入れます";
    // サンプルなので雑管理だけど許して欲しい

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseHttpsRedirection();

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}
```

### 3. 動作確認してみる

GameManager で タイトル内部データに任意のデータを登録します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/df41c407-f119-af5b-d7e5-a81692c662a0.png)

Visual Studio でデバッグ実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/f45adec0-2805-a6ae-1ef8-6349c92f7e04.png)

ブラウザが起動したら /api/titledata へアクセスすると PlayFab から取得した TitleInternalData が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/50f8994a-5506-c499-0ce1-f1a7a9f7e695.png)

## あとがき
Unity への導入も簡単ですがサーバーサイドへの導入も簡単ですね。
ゲーム以外の Web アプリなどのバックエンドとして使っても良いかなと思いました。