このトピックでは、Unity ゲームで Play Games サービスのリーダーボードを使用する方法について説明します。
開始する前に
Unity プロジェクトと Unity 用の Google Play Games プラグインをセットアップします。詳細については、スタートガイドをご覧ください。
イベントを作成する
リーダーボードは Google Play Console で作成します。詳細については、Play ゲームサービスのリーダーボードに関するガイドをご覧ください。リーダーボードを作成したら、スタートガイドに記載されているとおり、Android リソースをプラグインに追加します。
リーダーボードにスコアを投稿する
リーダーボードにスコアを投稿するには、Social.ReportScore を呼び出します。
using GooglePlayGames;
using UnityEngine.SocialPlatforms;
...
// Post score 12345 to leaderboard ID "Cfji293fjsie_QA")
Social.ReportScore(12345, "Cfji293fjsie_QA", (bool success) => {
// Handle success or failure
});
スコアを投稿し、メタデータタグを含めるには、PlayGamesPlatform
のインスタンスを直接使用します。
using GooglePlayGames;
using UnityEngine.SocialPlatforms;
...
// Post score 12345 to leaderboard ID "Cfji293fjsie_QA" and tag "FirstDaily")
PlayGamesPlatform.Instance.ReportScore(12345, "Cfji293fjsie_QA", "FirstDaily", (bool success) => {
// Handle success or failure
});
なお、プラットフォームとサーバーは、プレーヤーの既存のハイスコアより低いスコアを自動的に破棄します。そのため、スコアがプレーヤーの既存のスコアより大きいかどうかの確認を一切行わずに、スコアを自由に送信できます。
リーダーボード UI を表示する
すべてのリーダーボードについて組み込みの UI を表示するには、Social.ShowLeaderboardUI を呼び出します。
using GooglePlayGames;
using UnityEngine.SocialPlatforms;
...
// Show leaderboard UI
Social.ShowLeaderboardUI();
すべてのリーダーボードではなく特定のリーダーボードを表示するには、このメソッドにリーダーボード ID を渡します。ただし、これは Play ゲームの拡張機能であるため、最初に Social.Active オブジェクトを PlayGamesPlatform
オブジェクトにキャストする必要があります。
using GooglePlayGames;
using UnityEngine.SocialPlatforms;
...
// Show leaderboard UI
PlayGamesPlatform.Instance.ShowLeaderboardUI("Cfji293fjsie_QA");
リーダーボードのデータにアクセスする
リーダーボードのスコアデータを取得するメソッドは 2 つあります。
Social.ILeaderboard を使用する
このメソッドは ILeaderboard インターフェースを使用して、データを取得するためのスコープとフィルタを定義します。このアプローチでは、以下を構成できます。 1. リーダーボード ID。 2. コレクション(ソーシャルまたは公開)。 3. 期間(日別、週別、全期間)。 4. スコアの取得を開始するランク位置。 5. スコアの数(デフォルトは 25)。 6. ユーザー ID によるフィルタ。
from パラメータが正の値でない場合、返される結果はプレーヤー中心です。つまり、現在のプレーヤーのスコア周辺のスコアが返されます。
ILeaderboard lb = PlayGamesPlatform.Instance.CreateLeaderboard();
lb.id = "MY_LEADERBOARD_ID";
lb.LoadScores(ok =>
{
if (ok) {
LoadUsersAndDisplay(lb);
}
else {
Debug.Log("Error retrieving leaderboardi");
}
});
PlayGamesPlatform.LoadScores() を使用する
このメソッドは PlayGamesPlatform
を直接使用します。これにより、リーダーボードのデータにアクセスする際の柔軟性と情報が増します。
PlayGamesPlatform.Instance.LoadScores(
GPGSIds.leaderboard_leaders_in_smoketesting,
LeaderboardStart.PlayerCentered,
100,
LeaderboardCollection.Public,
LeaderboardTimeSpan.AllTime,
(data) =>
{
mStatus = "Leaderboard data valid: " + data.Valid;
mStatus += "\n approx:" +data.ApproximateCount + " have " + data.Scores.Length;
});
LoadScores() のパラメータは次のとおりです。
- leaderboardId
- 開始位置(トップスコアまたはプレーヤー中心)
- 行数
- リーダーボード コレクション(ソーシャルまたは公開)
- 期間(日別、週別、全期間)
- LeaderboardScoreData オブジェクトを受け入れるコールバック
LeaderboardScoreData
クラスは、スコアを読み込むときに呼び出し元に情報を返すために使用します。メンバーは次のとおりです。
1. Id - リーダーボード ID。
2. Valid - 返されたデータが有効な場合(呼び出しが成功した場合)は true。
3. Status - 呼び出しの ResponseStatus。
4. ApproximateCount - リーダーボードのスコアの概数。
5. Title - リーダーボードのタイトル。
6. PlayerScore - 現在のプレーヤーのスコア。
7. Scores - スコアのリスト。
8. PrevPageToken - スコアの前のページを取得するために LoadMoreScores()
を呼び出す際に使用できるトークン。
9. NextPageToken - スコアの次のページを取得するために LoadMoreScores()
を呼び出す際に使用できるトークン。
void GetNextPage(LeaderboardScoreData data)
{
PlayGamesPlatform.Instance.LoadMoreScores(data.NextPageToken, 10,
(results) =>
{
mStatus = "Leaderboard data valid: " + data.Valid;
mStatus += "\n approx:" +data.ApproximateCount + " have " + data.Scores.Length;
});
}
この呼び出しは、ユーザーが友だちリストをゲームと共有していない場合、ResponseCode.ResolutionRequired
で友だちを読み込もうとしたときに失敗することがあります。その場合は、AskForLoadFriendsResolution
を使用してアクセスをリクエストします。
プレーヤー名を取得する
各スコアには、そのスコアを出したプレーヤーの userId があります。Social.LoadUsers()
を使用すると、プレーヤー プロフィールを読み込むことができます。プレーヤー プロフィールの内容には、プレーヤーのプライバシー設定が適用されます。
internal void LoadUsersAndDisplay(ILeaderboard lb)
{
// Get the user ids
List<string> userIds = new List<string>();
foreach(IScore score in lb.scores) {
userIds.Add(score.userID);
}
// Load the profiles and display (or in this case, log)
Social.LoadUsers(userIds.ToArray(), (users) =>
{
string status = "Leaderboard loading: " + lb.title + " count = " +
lb.scores.Length;
foreach(IScore score in lb.scores) {
IUserProfile user = FindUser(users, score.userID);
status += "\n" + score.formattedValue + " by " +
(string)(
(user != null) ? user.userName : "**unk_" + score.userID + "**");
}
Debug.log(status);
});
}