simplestarの技術ブログ

目的を書いて、思想と試行、結果と考察、そして具体的な手段を記録します。

PlayFab:タイトルデータで接続先サーバーを知る

基本はここで学びます。
qiita.com

任意のデータ構造を配列で取得できるようになったら、少し汎用的なタイトルデータ取得コードを記述します。

C#ジェネリックの型名を文字列で取得するには

var type = typeof(T);
var titleData = JsonSerializer.Deserialize<T[]>(result.Data[type.Name]);

これを活用して、関数を一つ書けば、Json シリアライズする型ごとに値を取得することができるようになります。
実装は次の通り

using PlayFab;
using PlayFab.ClientModels;
using UnityEngine;
using UnityEngine.Events;
using Utf8Json;

public class PlayFabTitleData : MonoBehaviour
{
    private void Update()
    {
        // Test コードです
        if (Input.GetKeyDown(KeyCode.A))
        {
            GetTitleData<CubeWalkServer>((titleData) => {
                foreach (var data in titleData)
                {
                    Debug.Log($"name = {data.Name}, host = {data.Host}");
                } 
            });
        }
    }

    /// <summary>
    /// タイトルデータを取得
    /// </summary>
    /// <typeparam name="T">取得したいデータのクラスを指定</typeparam>
    /// <param name="callback">取得成功時の処理</param>
    public static void GetTitleData<T>(UnityAction<T[]> callback)
    {
        PlayFabClientAPI.GetTitleData(new GetTitleDataRequest { }, result => {
            var type = typeof(T);
            var titleData = JsonSerializer.Deserialize<T[]>(result.Data[type.Name]);
            callback?.Invoke(titleData); }, 
            error => { Debug.LogError($"GetTitleData: Fail...{error.GenerateErrorReport()}"); });
    }

    /// <summary>
    /// オンラインチャットサーバー情報:タイトルデータ
    /// </summary>
    public class CubeWalkServer
    {
        public string ID { get; set; }
        public string Name { get; set; }
        public string Type { get; set; }
        public string Host { get; set; }
        public int Port { get; set; }
    }
}