定期的なリーダーボードに SDK を使用する - 毎週のリーダーボード - (Unity モジュール)
注釈:本資料はAI技術を用いて翻訳されています。
ラッパーを開く
このチュートリアルでは、AccelByte Gaming Services (AGS) Software Development Kit (SDK) を使用して、リーダーボードのランキングを取得する AGS リーダーボードの実装方法を学びます。Byte Wars には、PeriodicLeaderboardWrapper クラスで定義されたゲームインスタンスラッパーがあり、定期的なリーダーボードランキングを取得するための完全な機能がすでに含まれています。このチュートリアルでは、PeriodicLeaderboardWrapper クラスのスターターバージョンである PeriodicLeaderboardWrapper_Starter ラッパーを使用して、機能をゼロから実装します。
スターターパックの内容
このチュートリアルに従うには、PeriodicLeaderboardWrapper_Starter というスターターラッパークラスを使用します。このラッパーは以下のファイルで定義されています:
- C# ファイル:
Assets/Resources/Modules/Engagement/PeriodicLeaderboard/Scripts/PeriodicLeaderboardWrapper_Starter.cs
また、ヘルパー定数変数と構造体を含むモデルクラスもあり、以下のファイルで定義されています:
- C# ファイル:
Assets/Resources/Modules/Engagement/LeaderboardEssentials/Scripts/LeaderboardEssentialsModels.cs
PeriodicLeaderboardWrapper_Starter クラスには、いくつかの事前定義されたコンポーネントが含まれています:
-
AGS SDK インターフェースを参照するヘルパー変数。これらの変数は、ラッパーが初期化されるときに割り当てられます:
private Leaderboard leaderboard;
private Statistic statistic;
void Start()
{
leaderboard = AccelByteSDK.GetClientRegistry().GetApi().GetLeaderboard();
statistic = AccelByteSDK.GetClientRegistry().GetApi().GetStatistic();
}
LeaderboardEssentialsModels クラスには、以下のヘルパーが含まれています:
-
UI メッセージの定数と、リーダーボードランキングを取得するリクエストを送信する際に使用されるクエリ制限:
public static readonly int QueryRankingsLimit = 10;
public static readonly string RankedMessage = "Your Rank";
public static readonly string UnrankedMessage = "You Are Unranked"; -
ゲームモードに基づいてリーダーボードコードを取得する関数。これらのコードは、Admin Portal で設定したリーダーボードコードと一致します:
public static string GetLeaderboardCodeByGameMode(InGameMode gameMode)
{
string gameModeSuffx = "unknown";
switch (gameMode)
{
case InGameMode.SinglePlayer:
case InGameMode.LocalElimination:
case InGameMode.LocalTeamDeathmatch:
gameModeSuffx = "singleplayer";
break;
case InGameMode.MatchmakingElimination:
case InGameMode.CreateMatchElimination:
gameModeSuffx = "elimination";
break;
case InGameMode.MatchmakingTeamDeathmatch:
case InGameMode.CreateMatchTeamDeathmatch:
gameModeSuffx = "teamdeathmatch";
break;
}
return $"board-unity-highestscore-{gameModeSuffx}";
} -
選択された期間に基づいてリーダーボードサイクル名を取得する関数。これらの名前は、Admin Portal で設定した統計サイクルと一致します:
public static string GetFormattedLeaderboardPeriod(StatisticCycleType period) => $"unity-{period.ToString()}".ToLower();
統計サイクル設定を取得する
このセクションでは、統計サイクル設定を取得する機能を実装します。
-
PeriodicLeaderboardWrapper_Starterクラスを開き、以下の関数を作成して統計サイクル設定を取得します。この設定は、サイクル ID を取得するために必要であり、後で定期的なリーダーボードランキングリクエストを送信する際に使用できます。public void GetStatCycleConfigByName(string cycleName, ResultCallback<StatCycleConfig> resultCallback)
{
statistic.GetListStatCycleConfigs(result => OnGetStatCycleConfigByNameCompleted(cycleName, result, resultCallback));
} -
次に、リクエストの結果を処理するコールバック関数を作成します。これはリストをフィルタリングし、リクエストされたサイクル名と一致するものだけを返します。
private void OnGetStatCycleConfigByNameCompleted(string cycleName, Result<PagedStatCycleConfigs> result, ResultCallback<StatCycleConfig> customCallback)
{
if (result.IsError)
{
BytewarsLogger.LogWarning($"Get stat cycle config by name failed. Message: {result.Error.Message}");
customCallback.Invoke(Result<StatCycleConfig>.CreateError(result.Error));
return;
}
StatCycleConfig statCycle = result.Value.Data.FirstOrDefault(x => x.Name.Equals(cycleName, StringComparison.OrdinalIgnoreCase));
if (statCycle == null)
{
string errorMessage = $"Stat cycle config with cycle name {cycleName} not found.";
BytewarsLogger.LogWarning($"Get stat cycle config by name failed. Message: {errorMessage}");
customCallback.Invoke(Result<StatCycleConfig>.CreateError(ErrorCode.NotFound, errorMessage));
return;
}
BytewarsLogger.Log("Get stat cycle config by name success!");
customCallback.Invoke(Result<StatCycleConfig>.CreateOk(statCycle));
}
定期的なリーダーボードランキングを取得する
このセクションでは、定期的なリーダーボードランキングを取得する機能を実装します。
-
PeriodicLeaderboardWrapper_Starterクラスを開き、指定されたリーダーボードコードとサイクル ID に基づいて定期的なリーダーボードランキングのリクエストを送信する以下の関数を作成します。リクエストが完了すると、コールバック関数が呼び出されて結果を処理します:public void GetRankingsByCycle(string leaderboardCode, string cycleId, ResultCallback<LeaderboardRankingResult> resultCallback, int offset = default, int limit = default)
{
leaderboard.GetRankingsByCycle(
leaderboardCode,
cycleId,
result => OnGetRankingsByCycleCompleted(result, resultCallback),
offset,
limit
);
} -
次に、リクエストの結果を処理するコールバック関数を作成します。ここでは、リクエストのステータスをログに記録し、コールバックデリゲートを呼び出すだけです:
private void OnGetRankingsByCycleCompleted(Result<LeaderboardRankingResult> result, ResultCallback<LeaderboardRankingResult> customCallback)
{
if (!result.IsError)
{
BytewarsLogger.Log("Get Ranking by Cycle success!");
}
else
{
BytewarsLogger.LogWarning($"Get Rankings by Cycle failed. Message: {result.Error.Message}");
}
customCallback?.Invoke(result);
}
プレイヤーの定期的なリーダーボードランクを取得する
このセクションでは、特定のプレイヤーの定期的なリーダーボードランクを取得する機能を実装します。これは後で、現在ログインしているプレイヤーの定期的なリーダーボードランクを表示するために使用できます。
-
PeriodicLeaderboardWrapper_Starterクラスを開き、プレイヤーのユーザー ID を渡すことで特定のプレイヤーの定期的なリーダーボードランキングのリクエストを送信する以下の関数を作成します。完了すると、コールバック関数が呼び出されて結果を処理します:public void GetUserRanking(string userId, string leaderboardCode, ResultCallback<UserRankingDataV3> resultCallback)
{
leaderboard.GetUserRankingV3(
userId,
leaderboardCode,
result => OnGetUserRankingCompleted(result, resultCallback)
);
} -
次に、リクエスト結果を処理するコールバック関数を作成します。ここでは、リクエストのステータスをログに記録し、コールバックデリゲートを呼び出すだけです。成功した場合、結果にはリーダーボードに関連付けられた各サイクル ID のランク値が含まれます。
private void OnGetUserRankingCompleted(Result<UserRankingDataV3> result, ResultCallback<UserRankingDataV3> customCallback)
{
if (!result.IsError)
{
BytewarsLogger.Log("Get User Ranking V3 successfull.");
}
else
{
BytewarsLogger.LogWarning($"Get User Ranking V3 failed. Message: {result.Error.Message}");
}
customCallback?.Invoke(result);
}
リソース
-
このチュートリアルで使用されるファイルは、Unity Byte Wars GitHub リポジトリで入手できます。