メインコンテンツまでスキップ

すべてを統合する - 毎週のリーダーボード - (Unreal Engine モジュール)

Last updated on February 4, 2026

注釈:本資料はAI技術を用いて翻訳されています。

毎週の定期リーダーボードランキングを取得するためにUIを接続する

  1. 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);
    }
    }
    ));
    }
  2. 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);
    }
    ));
    }
  3. 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);
    }
    })
    );
    }

リソース