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

すべてを統合する - 統計データを追跡し表示する - (Unreal Engine モジュール)

Last updated on February 4, 2026

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

プレイヤー統計を表示するためにUIを接続する

  1. StatsProfileWidget_Starter クラスの CPP ファイルを開きます。QueryLocalUserStats() 関数を以下のコードに置き換えます。この関数は、すべてのゲームモードの統計コードを収集し、それらをクエリしてプレイヤーの統計値リストを取得します。クエリが完了すると、OnQueryLocalUserStatsComplete() 関数を呼び出して統計を表示します。

    void UStatsProfileWidget_Starter::QueryLocalUserStats()
    {
    UAccelByteWarsGameInstance* GameInstance = Cast<UAccelByteWarsGameInstance>(GetGameInstance());
    if (!GameInstance)
    {
    UE_LOG_STATSESSENTIALS(Warning, TEXT("Failed to query local user stats. Game instance is invalid."));
    Ws_Loader->SetWidgetState(EAccelByteWarsWidgetSwitcherState::Error);
    return;
    }

    TArray<FString> StatsCodes{};
    for (const TTuple<FName, UDynamicEntryBox*>& EntryList : StatsDataEntryList)
    {
    FGameStatsData StatsData{};
    if (GameInstance->GetGameStatsDataById(EntryList.Key, StatsData))
    {
    StatsCodes.Append(StatsData.GetStatsCodes());
    }
    }

    if (StatsCodes.IsEmpty())
    {
    UE_LOG_STATSESSENTIALS(Warning, TEXT("Failed to query local user stats. No statistics code to query."));
    Ws_Loader->SetWidgetState(EAccelByteWarsWidgetSwitcherState::Empty);
    return;
    }

    const bool bStarted = StatsEssentialsSubsystem->QueryLocalUserStats(
    AccelByteWarsUtility::GetLocalUserNum(GetOwningPlayer()),
    StatsCodes,
    FOnlineStatsQueryUsersStatsComplete::CreateUObject(this, &ThisClass::OnQueryLocalUserStatsComplete));

    Ws_Loader->SetWidgetState(bStarted ? EAccelByteWarsWidgetSwitcherState::Loading : EAccelByteWarsWidgetSwitcherState::Error);
    }
  2. 同じファイル内で、OnQueryLocalUserStatsComplete() 関数を以下のコードに置き換えます。この関数は、ゲームモードに基づいて、それぞれの Dynamic Entry Box に統計値を表示します。特定の統計が見つからない場合は、0 の値が表示されます。統計が見つからない場合は、空の状態が表示されます。

    void UStatsProfileWidget_Starter::OnQueryLocalUserStatsComplete(
    const FOnlineError& ResultState,
    const TArray<TSharedRef<const FOnlineStatsUserStats>>& UsersStatsResult)
    {
    if (!ResultState.bSucceeded)
    {
    UE_LOG_STATSESSENTIALS(Warning, TEXT("Failed to handle on-complete query local user stats. Error: %s"), *ResultState.ErrorMessage.ToString());
    Ws_Loader->SetWidgetState(EAccelByteWarsWidgetSwitcherState::Error);
    return;
    }

    UAccelByteWarsGameInstance* GameInstance = Cast<UAccelByteWarsGameInstance>(GetGameInstance());
    if (!GameInstance)
    {
    UE_LOG_STATSESSENTIALS(Warning, TEXT("Failed to handle on-complete query local user stats. Game instance is invalid."));
    Ws_Loader->SetWidgetState(EAccelByteWarsWidgetSwitcherState::Error);
    return;
    }

    FUniqueNetIdPtr UserId = AccelByteWarsUtility::GetUserId(GetOwningPlayer());
    if (!UserId.IsValid())
    {
    UE_LOG_STATSESSENTIALS(Warning, TEXT("Failed to handle on-complete query local user stats. User ID is invalid."));
    Ws_Loader->SetWidgetState(EAccelByteWarsWidgetSwitcherState::Error);
    return;
    }

    // Get stats for the target user.
    TSharedPtr<const FOnlineStatsUserStats> TargetUserStats = nullptr;
    for (TSharedRef<const FOnlineStatsUserStats> const& UserStats : UsersStatsResult)
    {
    if (UserStats.Get().Account.Get() == UserId.ToSharedRef().Get())
    {
    TargetUserStats = UserStats;
    break;
    }
    }
    if (!TargetUserStats)
    {
    UE_LOG_STATSESSENTIALS(Warning, TEXT("Failed to handle on-complete query local user stats. Local users' statistics are not found."));
    Ws_Loader->SetWidgetState(EAccelByteWarsWidgetSwitcherState::Empty);
    return;
    }

    // Generate stats entries.
    for (const TTuple<FName, UDynamicEntryBox*>& EntryList : StatsDataEntryList)
    {
    FGameStatsData StatsData{};
    TWeakObjectPtr<UDynamicEntryBox> TargetStatsList = EntryList.Value;
    if (!TargetStatsList.IsValid() || !GameInstance->GetGameStatsDataById(EntryList.Key, StatsData))
    {
    UE_LOG_STATSESSENTIALS(Warning, TEXT("Failed to handle on-complete query local user stats. Invalid properties to generate widget entry."));
    continue;
    }

    TargetStatsList->Reset(true);
    for (const FGameStatsModel& StatsModel : StatsData.GetStatsModels())
    {
    float StatsValue = 0;
    if (const FVariantData* Stats = TargetUserStats->Stats.Find(StatsModel.CodeName))
    {
    Stats->GetValue(StatsValue);
    }

    const TWeakObjectPtr<UStatsProfileWidgetEntry> WidgetEntry = TargetStatsList->CreateEntry<UStatsProfileWidgetEntry>();
    WidgetEntry->Setup(StatsModel.DisplayName, FText::AsNumber(StatsValue));
    }
    }

    Ws_Loader->SetWidgetState(UsersStatsResult.IsEmpty() ? EAccelByteWarsWidgetSwitcherState::Empty : EAccelByteWarsWidgetSwitcherState::Not_Empty);
    }
  3. 次に、プロジェクトをコンパイルし、エラーがないことを確認します。

リソース