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

マッチ後のメニュー - ピアツーピアでのクイックマッチ - (Unreal Engine モジュール)

Last updated on February 4, 2026

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

マッチロビーUIについて

Byte Warsプロジェクトでは、マッチロビーは、専用サーバー(DS)またはピアツーピア(P2P)サーバー(ホストまたはリッスンサーバーとも呼ばれます)のいずれかのゲームサーバーに正常に接続したプレイヤーの情報を表示するウィジェットです。このウィジェットには必要な機能が設定されているため、このセクションでは、このウィジェットがどのように構築されているかを学習します。このウィジェットはリソースセクションで利用可能で、以下のファイルで構成されています:

  • Header file: /Source/AccelByteWars/Core/UI/MainMenu/MatchLobby/MatchLobbyWidget.h
  • CPP file: /Source/AccelByteWars/Core/UI/MainMenu/MatchLobby/MatchLobbyWidget.cpp
  • Blueprint widget: /Content/ByteWars/UI/MainMenu/MatchLobby/W_MatchLobby.uasset

マッチロビーウィジェットのBlueprintファイルを開くと、ウィジェットがどのように構築されているかを確認できます。

Preview of Match Lobby widget Unreal Byte Wars quick match peer-to-peer

上記のプレビューからわかるように、このウィジェットには2つの主要なボタンがあります:1つはゲームを開始してプレイヤーをゲームプレイレベルに移動させるボタン、もう1つはゲームサーバーを終了するボタンです。これらのボタンの宣言はHeaderファイルで確認できます:

private:
// ...
UPROPERTY(BlueprintReadOnly, meta = (BindWidget, BlueprintProtected = true, AllowPrivateAccess = true))
UCommonButtonBase* Btn_Start;

UPROPERTY(BlueprintReadOnly, meta = (BindWidget, BlueprintProtected = true, AllowPrivateAccess = true))
UCommonButtonBase* Btn_Quit;

開始と終了の機能は、以下の関数で定義されています。OnQuitLobbyDelegateという名前のデリゲートを発火することに注意してください。これを使用して後でセッションを離脱します。

void UMatchLobbyWidget::StartMatch() 
{
if (AAccelByteWarsPlayerController* PC = Cast<AAccelByteWarsPlayerController>(GetOwningPlayer()))
{
PC->TriggerLobbyStart();
OnMatchStartedDelegate.Broadcast();
}
}
void UMatchLobbyWidget::LeaveMatch()
{
if (OnQuitLobbyDelegate.IsBound())
{
OnQuitLobbyDelegate.Broadcast(GetOwningPlayer());
}

GameInstance->GoToMainMenu();
}

マッチロビーでプレイヤーの情報を生成するには、以下の関数を使用します:

void UMatchLobbyWidget::GenerateMultiplayerTeamEntries(const TMap<FUniqueNetIdRepl, FGameplayPlayerData>& AdditionalMembersInfo)
{
// Safety.
// Could happen when the query response triggers after the map just changed.
if (!IsActivated())
{
return;
}

// Generate team entries only on game clients.
// Also, don't attempt to generate entries when the Listen Server is tearing down.
ENetMode NetMode = GetOwningPlayer()->GetNetMode();
if ((NetMode != ENetMode::NM_Client && NetMode != ENetMode::NM_ListenServer) || GetWorld()->bIsTearingDown)
{
return;
}

ResetTeamEntries();

// Spawn team and player entry widgets.
const FUniqueNetIdRepl LocalPlayerNetId = GetGameInstance()->GetPrimaryPlayerUniqueIdRepl();
int32 PlayerIndex = 0;
for (const FGameplayTeamData& Team : GameState->Teams)
{
if (Team.TeamMembers.IsEmpty()) continue;

const TWeakObjectPtr<UTeamEntryWidget> TeamEntry = MakeWeakObjectPtr<UTeamEntryWidget>(CreateWidget<UTeamEntryWidget>(this, TeamEntryWidget.Get()));
Panel_TeamList->AddChild(TeamEntry.Get());

const FLinearColor TeamColor = GameInstance->GetTeamColor(Team.TeamId);
TeamEntry->SetTeamEntryColor(TeamColor);

// Spawn team entry widget.
for (const FGameplayPlayerData& Member : Team.TeamMembers)
{
PlayerIndex++;

FGameplayPlayerData* AdditionalInfo = nullptr;
if (AdditionalMembersInfo.Contains(Member.UniqueNetId))
{
AdditionalInfo = new FGameplayPlayerData(AdditionalMembersInfo[Member.UniqueNetId]);
}

FString PlayerName = FString::Printf(TEXT("Player %d"), PlayerIndex);
const bool bIsLocalPlayer = LocalPlayerNetId.IsValid() && LocalPlayerNetId == Member.UniqueNetId;
if (bIsLocalPlayer)
{
PlayerName = NSLOCTEXT("AccelByteWars", "Match Lobby Widget Local Player Identifier", "You").ToString();
}
else if (!Member.PlayerName.IsEmpty())
{
PlayerName = Member.PlayerName;
}

// Spawn player entry and set the default username.
const TWeakObjectPtr<UPlayerEntryWidget> PlayerEntry = MakeWeakObjectPtr<UPlayerEntryWidget>(CreateWidget<UPlayerEntryWidget>(this, PlayerEntryWidget.Get()));
TeamEntry->AddPlayerEntry(PlayerEntry.Get());
PlayerEntry->SetUsername(FText::FromString(PlayerName));
PlayerEntry->SetAvatar(AdditionalInfo ? AdditionalInfo->AvatarURL : Member.AvatarURL);
PlayerEntry->SetAvatarTint(Member.AvatarURL.IsEmpty() ? TeamColor : FLinearColor::White);
PlayerEntry->SetTextColor(TeamColor);
PlayerEntry->SetNetId(Member.UniqueNetId.GetUniqueNetId());
PlayerEntry->ActivateWidget();
}
}

Ws_TeamList->SetWidgetState(EAccelByteWarsWidgetSwitcherState::Not_Empty);
}

上記のコードから、プレイヤー情報エントリを表示するためにTeamEntryWidgetPlayerEntryWidgetタイプのウィジェットを作成していることがわかります。これらのウィジェットがどのように構築されているかを見てみましょう。

チームエントリUI

マッチロビーは1つのチームだけでなく複数のチームを表示できるため、このチームエントリウィジェットは、プレイヤー情報エントリをチームごとにグループ化するために使用されます。このウィジェットはリソースセクションで利用可能で、以下のファイルで構成されています:

  • Header file: /Source/AccelByteWars/Core/UI/Components/MultiplayerEntries/TeamEntryWidget.h
  • CPP file: /Source/AccelByteWars/Core/UI/Components/MultiplayerEntries/TeamEntryWidget.cpp
  • Blueprint widget: /Content/ByteWars/UI/Components/MultiplayerEntries/W_TeamEntry.uasset

ウィジェットのプレビューは以下の通りです。

Preview of Team Entry widget Unreal Byte Wars quick match peer-to-peer

プレイヤーエントリUI

このウィジェットは、プレイヤーの表示名やアバターなどのプレイヤー情報を表示するために使用されます。このウィジェットはチームエントリウィジェットにスポーンされ、プレイヤーをチームごとにグループ化します。このウィジェットはリソースセクションで利用可能で、以下のファイルで構成されています:

  • Header file: /Source/AccelByteWars/Core/UI/Components/MultiplayerEntries/PlayerEntryWidget.h
  • CPP file: /Source/AccelByteWars/Core/UI/Components/MultiplayerEntries/PlayerEntryWidget.cpp
  • Blueprint widget: /Content/ByteWars/UI/Components/MultiplayerEntries/W_PlayerEntry.uasset

ウィジェットのプレビューは以下の通りです。

Preview of Player Entry widget Unreal Byte Wars quick match peer-to-peer

ポーズUIについて

Byte Warsプロジェクトでは、ポーズUIは、プレイヤーがゲームを一時停止したときに表示されるウィジェットです。このウィジェットには、再開、再起動、終了などのアクションを実行するボタンが表示されます。このウィジェットには必要な機能が設定されているため、このセクションでは、このウィジェットがどのように構築されているかのみを学習します。このウィジェットはリソースセクションで利用可能で、以下のファイルで構成されています:

  • Header file: /Source/AccelByteWars/Core/UI/InGameMenu/Pause/PauseWidget.h
  • CPP file: /Source/AccelByteWars/Core/UI/InGameMenu/Pause/PauseWidget.cpp
  • Blueprint widget: /Content/ByteWars/UI/InGameMenu/Pause/W_Pause.uasset

ポーズウィジェットのプレビューは以下の通りです。

Preview of Pause widget Unreal Byte Wars quick match peer-to-peer

ボタンの宣言はHeaderファイルで確認できます。

private:
// ...
UPROPERTY(BlueprintReadOnly, meta = (BindWidget, BlueprintProtected = true, AllowPrivateAccess = true))
UCommonButtonBase* Btn_Resume;

UPROPERTY(BlueprintReadOnly, meta = (BindWidget, BlueprintProtected = true, AllowPrivateAccess = true))
UCommonButtonBase* Btn_Restart;

UPROPERTY(BlueprintReadOnly, meta = (BindWidget, BlueprintProtected = true, AllowPrivateAccess = true))
UCommonButtonBase* Btn_HelpOptions;

UPROPERTY(BlueprintReadOnly, meta = (BindWidget, BlueprintProtected = true, AllowPrivateAccess = true))
UCommonButtonBase* Btn_Quit;

開始と終了の機能は以下で定義されています。これらの関数はOnMatchStartedDelegateOnQuitLobbyDelegateを発火することに注意してください。これらをバインドして、それぞれセッションを開始および離脱できます。

void UPauseWidget::ResumeGame()
{
DeactivateWidget();
}
void UPauseWidget::RestartGame()
{
GameInstance->GoToGalaxyWorld();
}
void UPauseWidget::QuitGame()
{
if (OnQuitGameDelegate.IsBound())
{
OnQuitGameDelegate.Broadcast(GetOwningPlayer());
}

OnExitLevel();
GameInstance->GoToMainMenu();
}

ゲームオーバーUIについて

Byte Warsプロジェクトでは、ゲームオーバーUIは、ゲームが終了したときに表示されるウィジェットです。このウィジェットには、誰がゲームに勝ったかなどの情報と、ゲームを再度プレイするか終了するかのボタンが表示されます。このウィジェットには必要な機能が設定されているため、このセクションでは、このウィジェットがどのように構築されているかを学習します。このウィジェットはリソースセクションで利用可能で、以下のファイルで構成されています:

  • Header file: /Source/AccelByteWars/Core/UI/InGameMenu/GameOver/GameOverWidget.h
  • CPP file: /Source/AccelByteWars/Core/UI/InGameMenu/GameOver/GameOverWidget.cpp
  • Blueprint widget: /Content/ByteWars/UI/InGameMenu/GameOver/W_GameOver.uasset

ゲームオーバーウィジェットのプレビューは以下の通りです。

Preview of Game Over widget Unreal Byte Wars quick match peer-to-peer

ボタンの宣言はHeaderファイルで確認できます。

private:
// ...
UPROPERTY(BlueprintReadOnly, meta = (BindWidget, BlueprintProtected = true, AllowPrivateAccess = true))
UCommonButtonBase* Btn_PlayAgain;

UPROPERTY(BlueprintReadOnly, meta = (BindWidget, BlueprintProtected = true, AllowPrivateAccess = true))
UCommonButtonBase* Btn_Quit;

リプレイと終了の機能は、以下の関数で定義されています。OnQuitGameDelegateという名前のデリゲートを発火することに注意してください。これを使用して後でセッションを離脱します。

void UGameOverWidget::PlayGameAgain()
{
GameInstance->GoToGalaxyWorld();
}
void UGameOverWidget::QuitGame()
{
if (OnQuitGameDelegate.IsBound())
{
OnQuitGameDelegate.Broadcast(GetOwningPlayer());
}

OnExitLevel();
GameInstance->GoToMainMenu();
}

リソース