マッチ後のメニュー - ピアツーピアでのクイックマッチ - (Unreal Engine モジュール)
注釈:本資料は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ファイルを開くと、ウィジェットがどのように構築されているかを確認できます。

上記のプレビューからわかるように、このウィジェットには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);
}
上記のコードから、プレイヤー情報エントリを表示するためにTeamEntryWidgetとPlayerEntryWidgetタイプのウィジェットを作成していることがわかります。これらのウィジェットがどのように構築されているかを見てみましょう。
チームエントリ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
ウィジェットのプレビューは以下の通りです。

プレイヤーエントリ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
ウィジェットのプレビューは以下の通りです。

ポーズ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
ポーズウィジェットのプレビューは以下の通りです。

ボタンの宣言は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;
開始と終了の機能は以下で定義されています。これらの関数はOnMatchStartedDelegateとOnQuitLobbyDelegateを発火することに注意してください。これらをバインドして、それぞれセッションを開始および離脱できます。
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
ゲームオーバーウィジェットのプレビューは以下の通りです。

ボタンの宣言は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();
}
リソース
-
このチュートリアルセクションで使用されているファイルは、Unreal Byte Wars GitHubリポジトリで利用可能です。
- AccelByteWars/Content/ByteWars/UI/MainMenu/MatchLobby/W_MatchLobby.uasset
- AccelByteWars/Source/AccelByteWars/Core/UI/MainMenu/MatchLobby/MatchLobbyWidget.h
- AccelByteWars/Source/AccelByteWars/Core/UI/MainMenu/MatchLobby/MatchLobbyWidget.cpp
- AccelByteWars/Content/ByteWars/UI/Components/MultiplayerEntries/W_TeamEntry.uasset
- AccelByteWars/Source/AccelByteWars/Core/UI/Components/MultiplayerEntries/TeamEntryWidget.h
- AccelByteWars/Source/AccelByteWars/Core/UI/Components/MultiplayerEntries/TeamEntryWidget.cpp
- AccelByteWars/Content/ByteWars/UI/Components/MultiplayerEntries/W_PlayerEntry.uasset
- AccelByteWars/Source/AccelByteWars/Core/UI/Components/MultiplayerEntries/PlayerEntryWidget.h
- AccelByteWars/Source/AccelByteWars/Core/UI/Components/MultiplayerEntries/PlayerEntryWidget.cpp
- AccelByteWars/Content/ByteWars/UI/InGameMenu/Pause/W_Pause.uasset
- AccelByteWars/Source/AccelByteWars/Core/UI/InGameMenu/Pause/PauseWidget.h
- AccelByteWars/Source/AccelByteWars/Core/UI/InGameMenu/Pause/PauseWidget.cpp
- AccelByteWars/Content/ByteWars/UI/InGameMenu/GameOver/W_GameOver.uasset
- AccelByteWars/Source/AccelByteWars/Core/UI/InGameMenu/GameOver/GameOverWidget.h
- AccelByteWars/Source/AccelByteWars/Core/UI/InGameMenu/GameOver/GameOverWidget.cpp