PR

【Unity】PlayFabでランキングを追加するエディタ拡張

PlayFabのランキングが追加できないので拡張エディタで登録する Unity

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

前回の記事

NCMBが終わるのでPlayFabに移行する方法をお伝えした記事となります。

PlayFabでランキングを作って表示する方法をざっくり紹介しました

 

ランキングに任意にスコアを登録できない

NCMBのウェブサイトだとエクセルのようなテーブルがあり、直接登録されたスコアを登録したり、編集したりが可能でした。

ただPlayFabではそれがブラウザ上でできないため、以前プレイしてくれた方のスコアが消えてしまう可能性がありました。

せっかく頑張ってスコアを残してくれたのに…!

 

鳥フライトのスコアを登録したい

前提としてランキングを実装したのはこちらのアプリです。

 

ただ、さすがに全ランキングを残すことが難しかったので
下記の条件でスコアをPlayFabの方に移植できないかと考えていました。

  • 12/11より前
  • ネームド(名前付き)
  • 1万点以上

伝説の鳥「レジェンド」とつけて登録することにしました!

ツイートはこちら

 

作ったエディタ拡張

さきほどお伝えした通り、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」を選択すると下記のようなウィンドウが開きます。

PlayFabEditorの見た目

項目について説明していきます!

  1. CustomID
    こちらはユーザーを識別するためのユニークなIDです。
    この入力エリアを空にするとユニークなIDが自動生成されて登録されます。
  2. UserName
    こちらはランキングなどで表示するときに表示される名前を入力します。
  3. RankingName
    スコアを登録するランキングの名前を指定します。
  4. Score
    登録するスコアの値を指定します。
  5. Send
    上記パラメータが設定できたら、このボタンでランキングに送信します

ちなみにSendで送信すると、そのアカウントを示すCustomIDが自動で入力欄に表示されます。

 

既存のランキングのスコアを変更できる

ちなみにCustomIDを任意の値を設定するとスコアを上書きすることができます。

PlayFabのウェブ上でアカウントごとのランキングを確認できるのですが、それをコピーしてきてCustomIDに入力してSendすると値を変更したりすることも可能です。

間違えたとしても上書きなどもできますね!

終わりに

いかがでしたでしょうか。

今回はPlayFabでスコアを登録するエディタ拡張を紹介しました。
簡単な処理ですが、作るとなると面倒なのでご活用いただけますと幸いです。

もし要望などありましたらご連絡ください

では今回の記事はここで終わりたいと思います。
この度はここまでお読みいただきありがとうございました。

 

活動内容のPR

下記が本サイトでの活動内容となります。

他の開発動画を見る

 

コメント

スポンサーリンク
タイトルとURLをコピーしました