PlayFabでタイトルデータを扱う(Unity初心者)

 はじめに

Unityでゲーム開発をしていて、ランキングやログイン機能などのサーバーと連携する必要がある場合、私はPlayFabというBaaSを利用している。

今回はこのPlayFabを利用して、ゲーム上で制作したステージデータをタイトルデータとして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について

0から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のタイトルデータを取得して表示する




コメント