マッチ後のメニュー - 専用サーバーでのクイックマッチ - (Unreal Engine モジュール)
注釈:本資料はAI技術を用いて翻訳されています。
このページにはアクションチュートリアルのステップはありません。これは Byte Wars がオンラインマルチプレイヤーをどのように処理するかについての情報ページです。
マッチロビー UI について
Byte Wars プロジェクトでは、マッチロビーは専用サーバー (DS) またはリッスンサーバーのいずれであっても、ゲームサーバーに正常に接続したプレイヤーの情報を表示するウィジェットです。このウィジェットには必要な機能がすでに設定されているため、このセクションではこのウィジェットがどのように構築されているかのみを学習します。このウィジェットは リソース セクションで入手でき、以下のファイルで構成されています。
- ヘッダーファイル:
/Source/AccelByteWars/Core/UI/MainMenu/MatchLobby/MatchLobbyWidget.h - CPP ファイル:
/Source/AccelByteWars/Core/UI/MainMenu/MatchLobby/MatchLobbyWidget.cpp - Blueprint ウィジェット:
/Content/ByteWars/UI/MainMenu/MatchLobby/W_MatchLobby.uasset
マッチロビーウィジェットの Blueprint ファイルを開くと、ウィジェットがどのように構築されているかを確認できます。

上記のプレビューからわかるように、このウィジェットには2つの主要なボタンがあります。1つはゲームを開始してプレイヤーをゲームプレイレベルに移動させるボタン、もう1つはゲームサーバーを終了するボタンです。これらのボタンの宣言はヘッダーファイルで確認できます。
private:
// ...
UPROPERTY(BlueprintReadOnly, meta = (BindWidget, BlueprintProtected = true, AllowPrivateAccess = true))
UCommonButtonBase* Btn_Start;
UPROPERTY(BlueprintReadOnly, meta = (BindWidget, BlueprintProtected = true, AllowPrivateAccess = true))
UCommonButtonBase* Btn_Quit;
開始と終了の機能は以下で定義されています。これらの関数は OnMatchStartedDelegate と 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つのチームだけでなく、複数のチームを表示できるため、このチームエントリウィジェットは、プレイヤー情報エントリをチームごとにグループ化するために使用されます。このウィジェットは リソース セクションで入手でき、以下のファイルで構成されています。
- ヘッダーファイル:
/Source/AccelByteWars/Core/UI/Components/MultiplayerEntries/TeamEntryWidget.h - CPP ファイル:
/Source/AccelByteWars/Core/UI/Components/MultiplayerEntries/TeamEntryWidget.cpp - Blueprint ウィジェット:
/Content/ByteWars/UI/Components/MultiplayerEntries/W_TeamEntry.uasset
ウィジェットのプレビューは以下の通りです。

プレイヤーエントリ UI
このウィジェットは、プレイヤーの表示名やアバターなどのプレイヤー情報を表示するために使用されます。このウィジェットはチームエントリウィジェットにスポーンされ、プレイヤーをチームごとにグループ化します。このウィジェットは リソース セクションで入手でき、以下のファイルで構成されています。
- ヘッダーファイル:
/Source/AccelByteWars/Core/UI/Components/MultiplayerEntries/PlayerEntryWidget.h - CPP ファイル:
/Source/AccelByteWars/Core/UI/Components/MultiplayerEntries/PlayerEntryWidget.cpp - Blueprint ウィジェット:
/Content/ByteWars/UI/Components/MultiplayerEntries/W_PlayerEntry.uasset
ウィジェットのプレビューは以下の通りです。

ポーズ UI
Byte Wars プロジェクトでは、ポーズ UI はプレイヤーがゲームを一時停止したときに表示されるウィジェットです。このウィジェットには、再開、再起動、終了などのアクションを実行するボタンが表示されます。このウィジェットには必要な機能がすでに設定されているため、このセクションではこのウィジェットがどのように構築されているかのみを学習します。このウィジェットは リソース セクションで入手でき、以下のファイルで構成されています。
- ヘッダーファイル:
/Source/AccelByteWars/Core/UI/InGameMenu/Pause/PauseWidget.h - CPP ファイル:
/Source/AccelByteWars/Core/UI/InGameMenu/Pause/PauseWidget.cpp - Blueprint ウィジェット:
/Content/ByteWars/UI/InGameMenu/Pause/W_Pause.uasset
ゲームオーバーウィジェットのプレビューは以下の通りです。

ボタンの宣言はヘッダーファイルで確認できます。
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;
これらのアクションを実行する関数は以下で定義されています。後でセッション離脱を呼び出すために使用する OnQuitGameDelegate という名前のデリゲートを発火させることに注意してください。
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 はゲームが終了したときに表示されるウィジェットです。このウィジェットには、誰がゲームに勝ったかなどの情報と、ゲームを再度プレイするかゲームを終了するためのボタンが表示されます。このウィジェットには必要な機能がすでに設定されているため、このセクションではこのウィジェットがどのように構築されているかのみを学習します。このウィジェットは リソース セクションで入手でき、以下のファイルで構成されています。
- ヘッダーファイル:
/Source/AccelByteWars/Core/UI/InGameMenu/GameOver/GameOverWidget.h - CPP ファイル:
/Source/AccelByteWars/Core/UI/InGameMenu/GameOver/GameOverWidget.cpp - Blueprint ウィジェット:
/Content/ByteWars/UI/InGameMenu/GameOver/W_GameOver.uasset
ゲームオーバーウィジェットのプレビューは以下の通りです。

ボタンの宣言はヘッダーファイルで確認できます。
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