すべてを統合する - 統計データを追跡し表示する - (Unreal Engine モジュール)
Last updated on February 4, 2026
注釈:本資料はAI技術を用いて翻訳されています。
プレイヤー統計を表示するためにUIを接続する
-
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);
} -
同じファイル内で、
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);
} -
次に、プロジェクトをコンパイルし、エラーがないことを確認します。
リソース
- このチュートリアルセクションで使用されているファイルは、Byte Wars GitHub リポジトリで入手できます。