何をしていたか
Unityで作成しているゲームのマスタデータ管理としてサーバーレスというものに興味があり、
オススメで紹介されていたサービスのうち「PlayFab」というものをいろいろ触っていました。
https://playfab-master.com/unity-baas
これまでGCPやローカルでMySQLによるデータ管理、FireBaseのユーザー管理など
APIでデータを取得する処理などをゴリゴリ書いていましたが、このまわりをUnityからPlayFabAPIを呼び出すことで簡単に実装できるという話は魅力的でした。(特にログインまわりやプレイヤーデータ管理…)
詰まったこと
なんとなくEntityの概念や考え方というものを理解しつつ、基礎的なPlayFabAPIではマスタデータ取得周りで余分なデータも取ってきてしまいそうだったので、ClowdScriptというもので細かいデータ取得などがPlayFab側で用意できないかと思った次第です。
MicroSoftのチュートリアルや、PlayFabについてさまざまなサンプルを挙げてくださっているサイトを参考にし、ローカルに環境も用意し…としていたところで、まず基礎のコードが思うように動かないという壁にぶち当たりました。
テストしようとしたコード1
いたって普通の、json型のデータを受け取ってメッセージ内に出力する処理です。
ここで何に詰まったかというと、変数context がどうあがいてもnullになるという問題です。
https://learn.microsoft.com/ja-jp/azure/azure-functions/create-first-function-vs-code-csharp?pivots=programming-language-csharp&tabs=in-process
HttpTriggerのAzure FunctionをVSCodeでテンプレ生成すると、
これとは異なるコードの同じような「変数を出力する処理」が初期生成されます。
テンプレでは、例えば「{"name":"Test"}」というパラメータを渡してデバッグしてやれば、想定通りキー「name」の値「Test」を取得して結果に反映してくれます。
ただし、上記サイトのソースコードをVSCode上でデバッグしようとすると、内部の「TaskMethodInvoker#InvokeAsync 」にある引数instanceのNullReferenceExceptionが発生しました。
渡すパラメータ構成がおかしいのか、JsonConverterで指定しているクラスが実は古いのか4時間ほど悩みました…。
【CS2AFHelperClasses】
https://github.com/PlayFab/PlayFab-Samples/blob/master/Samples/CSharp/AzureFunctions/CS2AFHelperClasses.cs
解決
VSCodeからデバッグするのは諦め、Azureへデプロイ、PlayFabAPIを使用してUnityからClowdScriptとして呼び出すことで正常に動くことが確認できました。
Unityだけでなく、PlayFabのClowdScriptとして設定が完了すれば、PlayFab上からもテストができます。
なぜ取得したコンテキストが上記クラスにうまく変換されなかったかというと、
VSCodeのデバックではPlayFabのタイトル情報やプレイヤー情報などが一切ないただの「{"name":"Test"}」という文字列だけだったからと理解しました。
CS2AFHelperClassesはUnity(クライアント)側で生成されるExecuteFunctionRequestの情報を前提とした構成だったようで、ただの文字列「{"name":"Test"}」からは、FunctionExecutionContextのプロパティは何も設定できず全部nullになってしまいます。
テストしようとしたコード2
逆にAzureFunctioのテンプレ生成したものは、Unity、PlayFab上から動かすと「{"name":"Test"}」より複雑な構成のパラメータが渡されるため、キー「name」の値をうまく取れません。
(もちろんVSCodeからは動きます。)
今後の展望
デバック環境を作成したのでできることがデプロイのみというのは悲しいので、テストプレイヤー情報を静的に準備し、
UnityやPlayFab上でなくてもデバッグできるようにしたいです。
(ExecuteFunctionRequestの中身をそのままjson化して渡してしまえば上手くいきそうですが…)