すべてを統合する - 毎週のリーダーボード - (Unreal Engine モジュール)
Last updated on February 4, 2026
注釈:本資料はAI技術を用いて翻訳されています。
毎週の定期リーダーボードランキングを取得するためにUIを接続する
-
LeaderboardWeeklyWidget_Starterクラスの CPP ファイルを開き、GetWeeklyRankings()関数に移動して、現在の実装を以下のコードに置き換えます。このコードはPeriodicBoardSubsystem_Starterを使用して毎週のリーダーボードランキングを取得し、完了時に表示します。void ULeaderboardWeeklyWidget_Starter::GetWeeklyRankings()
{
FUniqueNetIdRepl PlayerNetId = GetOwningPlayer()->GetLocalPlayer()->GetPreferredUniqueNetId();
if (!PlayerNetId.IsValid())
{
return;
}
Ws_Leaderboard->SetWidgetState(EAccelByteWarsWidgetSwitcherState::Loading);
PeriodicLeaderboardSubsystem->GetPeriodicRankings(
GetOwningPlayer(),
LeaderboardCode,
CycleId,
ResultLimit,
FOnGetLeaderboardRankingComplete::CreateWeakLambda(this, [this, PlayerNetId](bool bWasSuccessful, const TArray<ULeaderboardRank*> Rankings)
{
if (!bWasSuccessful)
{
Ws_Leaderboard->SetWidgetState(EAccelByteWarsWidgetSwitcherState::Empty);
return;
}
// Add rankings to the leaderboard weekly ranking list.
Lv_Leaderboard->SetListItems(Rankings);
// Get the logged-in player's weekly rank if it is not included in the leaderboard.
const TArray<ULeaderboardRank*> FilteredRank = Rankings.FilterByPredicate([PlayerNetId](const ULeaderboardRank* Temp) { return Temp && Temp->UserId == PlayerNetId; });
const ULeaderboardRank* PlayerRank = FilteredRank.IsEmpty() ? nullptr : FilteredRank[0];
if (!PlayerRank)
{
GetPlayerWeeklyRanking();
}
// Display the weekly rankings if it is not empty.
else
{
DisplayPlayerWeeklyRank(PlayerRank);
Ws_Leaderboard->SetWidgetState(
Lv_Leaderboard->GetNumItems() <= 0 ?
EAccelByteWarsWidgetSwitcherState::Empty :
EAccelByteWarsWidgetSwitcherState::Not_Empty);
}
}
));
} -
GetPlayerWeeklyRanking()関数に移動し、現在の実装を以下のコードに置き換えます。この関数は、GetWeeklyRankings()関数で取得したランキングに現在ログインしているプレイヤーが含まれていない場合にのみ呼び出されます。void ULeaderboardWeeklyWidget_Starter::GetPlayerWeeklyRanking()
{
PeriodicLeaderboardSubsystem->GetPlayerPeriodicRanking(
GetOwningPlayer(),
LeaderboardCode,
CycleId,
FOnGetLeaderboardRankingComplete::CreateWeakLambda(this, [this](bool bWasSuccessful, const TArray<ULeaderboardRank*> Rankings)
{
// Get and display the logged-in player's weekly rank.
DisplayPlayerWeeklyRank((!bWasSuccessful || Rankings.IsEmpty()) ? nullptr : Rankings[0]);
// Display the weekly rankings if it is not empty.
Ws_Leaderboard->SetWidgetState(
Lv_Leaderboard->GetNumItems() <= 0 ?
EAccelByteWarsWidgetSwitcherState::Empty :
EAccelByteWarsWidgetSwitcherState::Not_Empty);
}
));
} -
NativeOnActivated()を以下のコードに置き換えて変更します。このコードでは、Admin Portal で設定した内容に基づいてリーダーボードコードを渡し、統計サイクル名を渡します。void ULeaderboardWeeklyWidget_Starter::NativeOnActivated()
{
// Set leaderboard code based on board-unreal-highestscore-{gamemode} format.
LeaderboardCode = FString::Printf(TEXT("board-unreal-highestscore-%s"), *ULeaderboardsWidget::GetLeaderboardGameMode());
// Reset widgets.
PlayerRankPanel->SetVisibility(ESlateVisibility::Collapsed);
Lv_Leaderboard->ClearListItems();
Ws_Leaderboard->SetWidgetState(EAccelByteWarsWidgetSwitcherState::Loading);
PeriodicLeaderboardSubsystem->GetLeaderboardCycleIdByName(FString("unreal-weekly"), EAccelByteCycle::WEEKLY,
FOnGetLeaderboardsCycleIdComplete::CreateWeakLambda(this, [this] (bool IsSuccessful, const FString& ResultCycleId)
{
if (IsSuccessful && !ResultCycleId.IsEmpty())
{
// Set cycle id to the weekly leaderboard's cycle id.
CycleId = ResultCycleId;
if (FFTUEDialogueModel* FTUELeaderboard = FFTUEDialogueModel::GetMetadataById("ftue_weekly_leaderboard", FTUEDialogues))
{
FTUELeaderboard->Button1.URLArguments[1].Argument = LeaderboardCode;
FTUELeaderboard->Button1.URLArguments[2].Argument = CycleId;
}
Super::NativeOnActivated();
// Get leaderboard weekly rankings.
GetWeeklyRankings();
}
else
{
// Error if cycle ID is not found
Ws_Leaderboard->ErrorMessage = FText(CYCLE_ID_NOT_FOUND_TEXT);
Ws_Leaderboard->SetWidgetState(EAccelByteWarsWidgetSwitcherState::Error);
}
})
);
}
リソース
-
このチュートリアルセクションで使用されているファイルは、Unreal Byte Wars GitHub リポジトリで入手できます。