PlayFabでタイトルデータを扱う(Unity初心者)
はじめに
Unityでゲーム開発をしていて、ランキングやログイン機能などのサーバーと連携する必要がある場合、私はPlayFabというBaaSを利用している。
今回はこのPlayFabを利用して、ゲーム上で制作したステージデータをタイトルデータとしてPlayFabに保存して、その保存したデータからステージを作成しようと思う。
PlayFabについて
タイトルデータの作成
タイトルデータはゲーム上であまり変動がない値を設定するデータであるからして、Unityに導入されたPlayFabSDKにはタイトルデータをゲーム側から設定する処理がない。
基本的な使い方はPlayFabのダッシュボード上で手動でkeyとvalueを登録する。
しかし、今回はゲーム中で作成したステージデータを一時保存用にタイトルデータにJSONデータとして保存したい。
なので、REST APIを用いてタイトルデータの作成を行なった。
以下はPlayFabのタイトルデータを送信する全体のコード
[Header("タイトルデータ用API情報")]
[SerializeField] string setTitleData_endPoint;
[SerializeField] string developerSecretKey;
///タイトルデータを登録する
public async UniTask SetTitleDataFromJsonAsync(string _json)
{
//現在のタイムスタンプを使用して一意のキーを作成
string key = DateTime.Now.ToString("yyyy/MM/dd[HH:mm:ss.fff]");
//リクエストの作成
string requestBody = $"{{\"Key\":\"{key}\",\"Value\":\"{_json.Replace("\"", "\\\"")}\"}}"; //JSON
// string requestBody = $"{{\"Key\":\"{_key}\",\"Value\":\"{_value}\"}}"; //単体Value
UnityWebRequest request = new UnityWebRequest(setTitleData_endPoint, "POST");
byte[] bodyRaw = System.Text.Encoding.UTF8.GetBytes(requestBody);
request.uploadHandler = new UploadHandlerRaw(bodyRaw);
request.downloadHandler = new DownloadHandlerBuffer();
request.SetRequestHeader("X-SecretKey", developerSecretKey);
request.SetRequestHeader("Content-Type", "application/json");
//リクエストを送る
// Debug.Log("リクエスト送信開始");
await request.SendWebRequest();
// Debug.Log("リクエスト送信完了");
//結果
if (request.result != UnityWebRequest.Result.Success)
{
// Debug.LogError("Error updating title data: " + request.error);
}
else
{
// Debug.Log("データの送信成功です。");
}
}
REST APIについて
①タイトルデータの送信
string requestBody = $"{{\"Key\":\"{key}\",\"Value\":\"{_json.Replace("\"", "\\\"")}\"}}"; //JSON
// string requestBody = $"{{\"Key\":\"{_key}\",\"Value\":\"{_value}\"}}"; //単体Value
requestBodyに登録するKeyとValueをセットする。
今回では自作のステージデータをJSON形式にして送るため上のJSONデータの方を実装しているが、単体の文字列ならコメントアウトしている方でいける。JSONの方では\をエスケープしたりしないとうまくValueが設定できない。
UnityWebRequest request = new UnityWebRequest(setTitleData_endPoint, "POST");
UnityWebRequestでHTTP通信を行う。このときsetTitleData_endPointはPlayFabのドキュメントに書いているAPIのURLを書く。
Title-Wide Data Management - Set Title Data
byte[] bodyRaw = System.Text.Encoding.UTF8.GetBytes(requestBody);
リクエストボディをHTTPで送信するバイト配列に変換。
request.uploadHandler = new UploadHandlerRaw(bodyRaw);
request.downloadHandler = new DownloadHandlerBuffer();
リクエストのアップロードとダウンロードを処理する。アップロード側に上記のバイト配列をセット。
request.SetRequestHeader("X-SecretKey", developerSecretKey);
request.SetRequestHeader("Content-Type", "application/json");
リクエストヘッダーの設定。developerSecretKeyはUnityにPlayFabのSDKを導入していたら、UnityエディターのPlayFabのログインしているインスペクターがあると思うのでそこにDEVELOPER SECRET KEYがあるので、それを利用する。
//リクエストを送る
// Debug.Log("リクエスト送信開始");
await request.SendWebRequest();
// Debug.Log("リクエスト送信完了");
//結果
if (request.result != UnityWebRequest.Result.Success)
{
// Debug.LogError("Error updating title data: " + request.error);
}
else
{
// Debug.Log("データの送信成功です。");
}
リクエストの送信を送信するまでまって結果を確認する。
送信が完了したらPlayFabの管理画面に以下のように設定したKeyとValueが登録されていると思う。
コンテンツ>タイトルデータ
②タイトルデータの取得
送信ができたので、次はPlayFabに登録されているタイトルデータをUnity側で取得する。
取得する際はUnityのPlayFabSDKにPlayFabClientAPI.GetTitleDataの処理があるので、こちらを利用する。ちなみに、PlayFabClientAPIを利用するには先にクライアント側でPlayFabにログインする必要があるので、取得処理をする前にログイン処理を行う。(ログイン処理はここでは書かない)
以下取得する際の全体コード
///全てのタイトルデータを取得する
public async UniTask<List<string>> GetStageDataFromPlayFab()
{
//リクエストの作成
var request = new GetTitleDataRequest();
GetTitleDataResult result = null;
PlayFabError error = null;
Debug.Log("データの取得開始");
PlayFabClientAPI.GetTitleData(request, x => result = x, x => error = x);
await new WaitUntil(() => result != null || error != null);
Debug.Log("データの取得終了");
List<string> resultJsons = new List<string>();
if(result != null)
{
StringBuilder sb = new StringBuilder();
sb.Append("データの数" + result.Data.Count.ToString());
sb.Append("\n");
// result.Data の各要素をログに出力
foreach (var item in result.Data)
{
sb.Append($"キー: {item.Key}, 値: {item.Value}\n");
resultJsons.Add(item.Value);
}
Debug.Log(sb);
}
else if (error != null)
{
Debug.Log("エラー。タイトルデータを取得失敗");
}
return resultJsons;
}
取得できたら、result.Dataの中に全てのタイトルデータが入っているので、そこからKeyとValueを指定して対象のタイトルを取得する。今回は全てのデータを一括で欲しかったので、この仕様でおこなった。
以上。これでタイトルデータの作成と取得ができるようになった。
タイトルデータはユーザーデータとは違い、基本的にはゲーム中に不変のデータを入れるものなので、今回の使い方は少し違うかもしれない。ただ、自分がやりたいことはできたので、これはこれでよし。
参考サイト
UnityでPlayFabのタイトルデータを取得して表示する
コメント
コメントを投稿