この記事では、PlayFab で Azure Functions をローカルでデバッグする方法について解説していきます。

「え?何の話?」という状態の人は、CloudScriptでAzure Functionsを実行する方法を参照してからまた戻ってきてください。

ローカルデバッグについては詰まりポイントが多く、ゼロから調べてやると挫折してしまう可能性が高いです。

この記事では、挫折ポイントを先回りして解決しているので、スムーズにデバッグ作業に映ることができます。

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

Azure Functions をローカルでデバッグする方法

ローカルデバッグの概念

まずはじめに、ローカルデバッグの概念について理解していきましょう。

簡単な図を作成してみました。

playfab-local-debug

Unity側から Azure Functions を呼び出すと、Azureに登録されている関数が呼び出される、というのは通常の動きですね。

ここでは「通常モード」と呼ぶことにします。

ねこじょーかー
ねこじょーかー
厳密にはCloudScript経由でAzure Functions を呼び出しているのですが、画像を簡略化するために割愛しています!

通常モードとは別に、Azure Functions として登録する前でも、ローカルサーバーとしてデバッグして実行結果を確認することもできます。

ここでは「デバッグモード」と呼ぶことにします。

通常モードの場合でもデバッグできる、という話を聞いたのですが、知識不足でこのやり方はわかっていません。

この記事ではデバッグモードにフォーカスして解説をしていきます。

通常モードとデバッグモードの違い

デバッグモードのときにも、ローカルのHelloWorld関数を自動で呼び出してくれればいいのですが、そうはいきません。

というのも、通常モードとデバッグモードでは、発行されるURLが異なるためです。

URLの違い

HelloWorld関数を呼び出した場合

通常モード
  • https://test.azurewebsites.net/api/HelloWorld が呼び出される
  • 呼び出す関数名によってURLは変わる
デバッグモード
  • http://localhost:7071/api/CloudScript/ExecuteFunction が呼び出される
  • 関数名を変えても、必ずこのURLになる

上記の通り。

通常モードの場合、関数によってURLが変わります。

しかし、デバッグモードの場合は、URLが固定で発行されるため、普通にデバッグしようと思ってもURLが見つからずエラーとなります。

なんだ、デバッグできないのか…

諦めるのはまだ早いです。

ExecuteFunction関数を用意してあげて、そこからHelloWorld関数を呼び出すと、デバッグすることができることを確認しました。

次からはこの方法について解説していきます。

Azure Functions Core Tools のインストール

ソースコードを触る前に、Azure Functions Core Tools のインストールを参考にして、デバッグに必要なツールをインストールしましょう。

「Azure Functions Core Tools のインストール」という段落だけ作業できれば問題ありません。

バージョンは v4.x を想定しています。

ツールの準備はこれで終了です。

ExecuteFunction関数の準備

ペンギンくん
ペンギンくん
でも、デバッグ用に関数を準備するのは大変そうだね。

私も同じことを思い、諦めようかなと考えました。

が、調べに調べ、なんとかExecuteFunctionのサンプルに出会うことができました。

上記ソースコードをコピーして、次に進んでください。

定数の準備

まずはじめに目に留まるのはこの3行。

private const string DEV_SECRET_KEY = "PLAYFAB_DEV_SECRET_KEY";
private const string TITLE_ID = "PLAYFAB_TITLE_ID";
private const string CLOUD_NAME = "PLAYFAB_CLOUD_NAME";

クラウド名はなくても動作したのでよくわかりませんが、シークレットキーとタイトルIDの設定は必要です。

以下から確認することができます。

playfab-local-debug
ねこじょーかー
ねこじょーかー
定数を自分の値に書き換えるだけでしょ。楽勝。

と思っていたのですが、実際の処理を見ると、定数から環境変数を取り出すという処理をしていることに気づきました。

string title = Environment.GetEnvironmentVariable(TITLE_ID, EnvironmentVariableTarget.Process);
var secretKey = Environment.GetEnvironmentVariable(DEV_SECRET_KEY, EnvironmentVariableTarget.Process);

なので、定数に直接自分の値を入れるのではなく、環境変数として登録して上げる必要があります。

Azure Functions を使うときの環境変数の設定方法は、Azure Functionsで環境変数を設定する方法を参照してください。

これで定数の準備は完了です。

ローカルデバッグを有効化する(Visual Studio)

Visual Studio Code を使用している人は、この後の「Enable local debugging」という手順でファイルが自動生成されるので、手動で作成して配置する必要はありません。

デバッグをするには、playfab.local.settings.json というファイルを作成して、所定のフォルダに配置する必要があります。

以下の内容でファイルを作成しましょう。

playfab.local.settings.json
{ "LocalApiServer": "http://localhost:7071/api/" }

あとはこのファイルを所定のフォルダに置くのですが、Mac と Windows で場所が変わります。

Mac の人は、以下のコマンド「TMPDIR」というフォルダを開き、ファイルを配置してください。

open $TMPDIR

Windows の人は、「TEMP」というフォルダを開き、ファイルを配置してください。

具体的な手順は、Windows 10 ユーザーのTempフォルダー(一時フォルダ)を開く方法が参考になりそうです。

これでようやくExecuteFunctionの準備が整いました。

ローカルデバッグを有効化する(Visual Studio Code)

Visual Studio Code を使用する場合は、手動で playfab.local.settings.json を作成しなくても、以下の操作でファイルを生成できます。

  1. 左のPlayFabアイコンをクリック
  2. 反映したいタイトルを右クリック
  3. Enable local debuggingをクリック
playfab-local-debug

ローカルデバッグを開始する

F5で実行して30秒くらいすると、ターミナルが以下の状態になります。

playfab-local-debug

この状態になったら、あとはUnityから実行してみましょう。

デバッグをすると、まず最初にExecuteFunctionが実行されます。

playfab-local-debug

ExecuteFunctionを経由して、ローカルのHelloWorld関数が呼び出されます。

playfab-local-debug

実行後は、通常モードと同様に同じようなログが出力されることが確認できます。

playfab-local-debug

これでひと通りの作業は完了です。

M1 MacのVisual Studio で実行したときに、次のエラーが出ることがあります。

System.Private.CoreLib: Exception while executing function: ExecuteFunction. PlayFabAllSDK: Invalid JSON string (Parameter 'json').

デバッグで追ってみると、ExecuteFunction.cs の GetHostRoutePrefix にて、host.json のデシリアライズで落ちていることがわかります。

なので、デシリアライズしている部分をコメントアウトして、_defaultRoutePrefix を固定で返すようにすると、エラーなく動作します。

private static string GetHostRoutePrefix()
{
    string hostFileContent = null;
    string currDir = Directory.GetCurrentDirectory();
    string currDirHostFile = Path.Combine(currDir, "host.json");

    if (File.Exists(currDirHostFile))
    {
        hostFileContent = ReadAllFileText(currDirHostFile);
    }

    // ↓ここをコメントアウト
    // var hostModel = PluginManager.GetPlugin<ISerializerPlugin>(PluginContract.PlayFab_Serializer).DeserializeObject<HostJsonModel>(hostFileContent);
    // return hostModel?.extensions?.http?.routePrefix ?? _defaultRoutePrefix;

    // ↓ここを追記
    return _defaultRoutePrefix;
}

ローカルデバッグをやめる

ローカルデバッグをやめるときは、先ほど配置した playfab.local.settings.json を削除してください。

Visual Studio Code を使用している人は、「Enable local debugging」の下の「Disable local debugging」という操作をすることでも、「playfab.local.settings.json」 を削除することができます。

playfab-local-debug

まとめ

Azure Functions をローカルでデバッグする方法について解説しました。

3行でまとめると以下のとおりです。

ローカルデバッグの方法まとめ
  1. Azure Functions Core Tools をインストール
  2. ExecuteFunction 関数の用意
  3. デバッグする

ゼロから調べると大変ですが、この記事を見ながらやればそこまで時間はかからないはずです。

毎回 Azure にアップロードして実行するのも面倒ですからね。

PlayFab では現状、Azure Functions を使わないとデバッグができないので、ぜひこの機会に Azure Functions を導入してみましょう。

PlayFab の書籍も好評発売中!
playfab-book

PlayFab のことをもっと皆さんに知ってもらいたくて、合計500ページ以上にもなる書籍を5冊に分けて執筆しました。

私の知識をすべて詰め込んでいるので、ゲーム開発をさらに加速させたい方はぜひご覧ください。