先日お伝えしたPlayFabでランキングを実装する方法をお伝えしましたが、自身でも実装していてサイト側でランキングを追加できないことがあったので、それをUnityエディタ拡張を自作してランキングを登録できるようにしたのでそのツールを共有したいと思います。
前回の記事
NCMBが終わるのでPlayFabに移行する方法をお伝えした記事となります。

PlayFabでランキングを作って表示する方法をざっくり紹介しました
ランキングに任意にスコアを登録できない
NCMBのウェブサイトだとエクセルのようなテーブルがあり、直接登録されたスコアを登録したり、編集したりが可能でした。
ただPlayFabではそれがブラウザ上でできないため、以前プレイしてくれた方のスコアが消えてしまう可能性がありました。

せっかく頑張ってスコアを残してくれたのに…!
鳥フライトのスコアを登録したい
前提としてランキングを実装したのはこちらのアプリです。
ただ、さすがに全ランキングを残すことが難しかったので
下記の条件でスコアをPlayFabの方に移植できないかと考えていました。

伝説の鳥「レジェンド」とつけて登録することにしました!
ツイートはこちら
現ランキング(NCMB版)で遊んでくれていた方は
下記条件で「レジェンド」として登録してみます・12/11より前
・ネームド
・1万点以上 pic.twitter.com/LiN6j5YDui— Tadapy@ゲーム制作
作ったエディタ拡張
さきほどお伝えした通り、PlayFabでは登録する機能がなかったのでUnityのエディタ拡張として作成することにしました。

私はこれを使って問題なく登録できました!
ダウンロードはこちら
PlayFabスコア送信用のUnityエディタ拡張
unitypackageのインストールはこちら
スクリプト内容
using UnityEditor;
using UnityEngine;
using PlayFab;
using PlayFab.ClientModels;
using System.Collections.Generic;
using System.Text;
namespace TedLab.Editor
{
public class PlayFabEditor : EditorWindow
{
private const string EditorPrefix = "TedLab_PlayFabEditor_";
private const string KeyCustomId = EditorPrefix + "CustomId";
private const string KeyRankingName = EditorPrefix + "RankingName";
private const string KeyDisplayUserName = EditorPrefix + "DisplayUserName";
private const string KeyScore = EditorPrefix + "Score";
private bool _busy = false;
private string _customId = "";
private string _rankingName = "";
private string _displayUserName = "";
private int _score = 0;
[MenuItem("TedLab/PlayFab Editor")]
private static void OpenWindow()
{
var window = GetWindow();
window.titleContent = new GUIContent("PlayFab Editor");
window.Show();
}
private void OnEnable()
{
// 読み込み
_customId = EditorPrefs.GetString(KeyCustomId, "");
_rankingName = EditorPrefs.GetString(KeyRankingName, "");
_displayUserName = EditorPrefs.GetString(KeyDisplayUserName, "");
_score = EditorPrefs.GetInt(KeyScore, 0);
}
private void OnDisable()
{
// 保存
EditorPrefs.SetString(KeyCustomId, _customId);
EditorPrefs.SetString(KeyRankingName, _rankingName);
EditorPrefs.SetString(KeyDisplayUserName, _displayUserName);
EditorPrefs.SetInt(KeyScore, _score);
}
private void OnGUI()
{
if (_busy)
{
GUILayout.Label("Processing...", EditorStyles.boldLabel);
return;
}
GUILayout.Label("Settings", EditorStyles.boldLabel);
// アカウントID
using (new EditorGUILayout.HorizontalScope())
{
GUILayout.Label("CustomID(空なら自動作成)");
_customId = EditorGUILayout.TextField(_customId);
if (GUILayout.Button("Clear", GUILayout.Width(50f)))
{
_customId = "";
}
}
// ユーザー名
using (new EditorGUILayout.HorizontalScope())
{
GUILayout.Label("UserName");
_displayUserName = EditorGUILayout.TextField(_displayUserName);
}
// ランキング名
using (new EditorGUILayout.HorizontalScope())
{
GUILayout.Label("RankingName");
_rankingName = EditorGUILayout.TextField(_rankingName);
}
// スコア値
using (new EditorGUILayout.HorizontalScope())
{
GUILayout.Label("Score");
_score = int.Parse(EditorGUILayout.TextField(_score.ToString()));
}
// 反映
if (GUILayout.Button("Send", GUILayout.Width(50f)))
{
if(string.IsNullOrEmpty(_customId))
{
_customId = GenerateCustomId();
}
if (!string.IsNullOrEmpty(_customId) && !string.IsNullOrEmpty(_rankingName) && !string.IsNullOrEmpty(_displayUserName))
{
// ログイン
PlayFabClientAPI.LoginWithCustomID(
new LoginWithCustomIDRequest
{
TitleId = PlayFabSettings.TitleId,
CustomId = _customId,
CreateAccount = true,
},
result =>
{
// ユーザー名設定
PlayFabClientAPI.UpdateUserTitleDisplayName(
new UpdateUserTitleDisplayNameRequest
{
DisplayName = _displayUserName
},
result =>
{
// スコア反映
PlayFabClientAPI.UpdatePlayerStatistics(
new UpdatePlayerStatisticsRequest
{
Statistics = new List
{
new StatisticUpdate
{
StatisticName = _rankingName,
Value = _score,
}
}
},
result =>
{
Debug.Log("Sucess!");
_busy = false;
},
EndBusyError
);
},
EndBusyError
);
},
EndBusyError
);
}
}
}
private void EndBusyError(PlayFabError error)
{
Debug.LogWarning("EndBusyError : " + error.ErrorMessage);
_busy = false;
}
// カスタムIDの生成
private const int CustomIdMaxnum = 32;
private static readonly string CustomIdCharacters = "0123456789abcdefghijklmnopqrstuvwxyz";
private static string GenerateCustomId()
{
var stringBuilder = new StringBuilder(CustomIdMaxnum);
var random = new System.Random();
for (var i=0; i<CustomIdMaxnum; i++)
{
stringBuilder.Append(CustomIdCharacters[random.Next(CustomIdCharacters.Length)]);
}
return stringBuilder.ToString();
}
}
}
使い方
Unityエディタのメニューにある「TedLab→PlayFabEditor」を選択すると下記のようなウィンドウが開きます。


項目について説明していきます!
ちなみにSendで送信すると、そのアカウントを示すCustomIDが自動で入力欄に表示されます。
既存のランキングのスコアを変更できる
ちなみにCustomIDを任意の値を設定するとスコアを上書きすることができます。
PlayFabのウェブ上でアカウントごとのランキングを確認できるのですが、それをコピーしてきてCustomIDに入力してSendすると値を変更したりすることも可能です。

間違えたとしても上書きなどもできますね!
終わりに
いかがでしたでしょうか。
今回はPlayFabでスコアを登録するエディタ拡張を紹介しました。
簡単な処理ですが、作るとなると面倒なのでご活用いただけますと幸いです。

もし要望などありましたらご連絡ください
では今回の記事はここで終わりたいと思います。
この度はここまでお読みいただきありがとうございました。
活動内容のPR
下記が本サイトでの活動内容となります。






コメント