すべてを統合する - 専用サーバーでのクイックマッチ - (Unreal Engine モジュール)
注釈:本資料はAI技術を用いて翻訳されています。
マッチメイキング UI の目的は、マッチメイキングの正確な状態を表示することです。そのため、ウィジェットには多くの高レベルの状態があります。各状態がいつ表示されるべきかを理解するには、次の図を参照してください。
UI を接続してマッチメイキングの開始、キャンセル、ステータス表示を行う
-
MatchmakingDSWidget_StarterCPP ファイルを開き、以下のコードを使用してStartMatchmaking()関数を置き換え、マッチメイキングの開始をトリガーします。OnlineSession変数は、先ほど作成したオンラインセッション(MatchmakingDSOnlineSession_Starterクラス)への参照です。void UMatchmakingDSWidget_Starter::StartMatchmaking()
{
if (OnlineSession->ValidateToStartMatchmaking.IsBound() &&
!OnlineSession->ValidateToStartMatchmaking.Execute(SelectedGameModeType))
{
return;
}
// Reset stored invite
SessionInvite = nullptr;
// Reset auto join session countdown.
AutoJoinCurrentCountdown = AutoJoinDelay;
MatchFoundCurrentCountdown = MatchFoundDelay;
SessionJoinedCurrentCountdown = SessionJoinedDelay;
Tb_WaitingForPlayersCountdown->SetText(FText::FromString(FString::FromInt(AutoJoinCurrentCountdown)));
ChangeWidgetState(EWidgetState::REQUEST_SENT);
OnlineSession->StartMatchmaking(
GetOwningPlayer(),
OnlineSession->GetPredefinedSessionNameFromType(EAccelByteV2SessionType::GameSession),
EGameModeNetworkType::DS,
SelectedGameModeType, SelectedGameStyle);
} -
以下のコードを使用して
JoinSession()関数を置き換え、マッチメイキングが完了したときにゲームが受信した招待へのセッション参加をトリガーします。void UMatchmakingDSWidget_Starter::JoinSession()
{
if (!SessionInvite)
{
ChangeWidgetState(EWidgetState::ERROR);
Tb_ErrorText->SetText(TEXT_FAILED_SESSION_INVITE_INVALID);
}
ChangeWidgetState(EWidgetState::JOINING_MATCH);
OnlineSession->JoinSession(
OnlineSession->GetLocalUserNumFromPlayerController(GetOwningPlayer()),
OnlineSession->GetPredefinedSessionNameFromType(EAccelByteV2SessionType::GameSession),
SessionInvite->Session);
} -
以下のコードを使用して
CancelMatchmaking()関数を置き換え、マッチメイキングのキャンセルをトリガーします。void UMatchmakingDSWidget_Starter::CancelMatchmaking()
{
ChangeWidgetState(EWidgetState::CANCELING_MATCH);
OnlineSession->CancelMatchmaking(
GetOwningPlayer(),
OnlineSession->GetPredefinedSessionNameFromType(EAccelByteV2SessionType::GameSession));
} -
以下のコードを使用して
RejectSessionInvite()関数を置き換え、マッチセッション招待の拒否をトリガーします。void UMatchmakingDSWidget_Starter::RejectSessionInvite()
{
if (!SessionInvite)
{
ChangeWidgetState(EWidgetState::ERROR);
Tb_ErrorText->SetText(TEXT_FAILED_SESSION_INVITE_INVALID);
}
ChangeWidgetState(EWidgetState::REJECTING_MATCH);
OnlineSession->RejectSessionInvite(
OnlineSession->GetLocalUserNumFromPlayerController(GetOwningPlayer()),
*SessionInvite.Get());
} -
以下のコードを使用して
NativeTick()関数を置き換え、自動参加カウントダウンがゼロになったときにセッション参加をトリガーします。void UMatchmakingDSWidget_Starter::NativeTick(const FGeometry& MyGeometry, float InDeltaTime)
{
Super::NativeTick(MyGeometry, InDeltaTime);
MoveCameraToTargetLocation(InDeltaTime, FVector(60.0f, 800.0f, 160.0f));
// Manual "Auto" Join
if (WidgetState == EWidgetState::WAITING_FOR_PLAYER && AutoJoinCurrentCountdown > 0)
{
AutoJoinCurrentCountdown -= InDeltaTime;
Tb_WaitingForPlayersCountdown->SetText(FText::FromString(FString::FromInt(AutoJoinCurrentCountdown)));
if (AutoJoinCurrentCountdown <= 0)
{
JoinSession();
}
}
// Match found delay
if (WidgetState == EWidgetState::MATCH_FOUND && MatchFoundCurrentCountdown > 0)
{
MatchFoundCurrentCountdown -= InDeltaTime;
if (MatchFoundCurrentCountdown <= 0 && SessionInvite)
{
// Check if auto join is enabled or not
const TSharedPtr<FOnlineSessionInfoAccelByteV2> SessionInfo = StaticCastSharedPtr<FOnlineSessionInfoAccelByteV2>(
SessionInvite->Session.Session.SessionInfo);
check(SessionInfo.IsValid());
const bool bAutoJoin = SessionInfo->GetBackendSessionData()->Configuration.AutoJoin;
ChangeWidgetState(bAutoJoin ? EWidgetState::JOINING_MATCH : EWidgetState::WAITING_FOR_PLAYER);
}
}
// Session joined delay
if (WidgetState == EWidgetState::SESSION_JOINED && SessionJoinedCurrentCountdown > 0)
{
SessionJoinedCurrentCountdown -= InDeltaTime;
if (SessionJoinedCurrentCountdown <= 0)
{
ChangeWidgetState(EWidgetState::REQUESTING_SERVER);
}
}
} -
コールバック関数をバインドして、特定のマッチメイキングイベントが発生したときに関連するユーザーインターフェースを表示します。この関数は、
StartMatchmaking()を即座にトリガーする役割も担っています。これを行うには、NativeOnActivated()関数を以下のコードで置き換えます。void UMatchmakingDSWidget_Starter::NativeOnActivated()
{
Super::NativeOnActivated();
UOnlineSession* BaseOnlineSession = GetWorld()->GetGameInstance()->GetOnlineSession();
if (!ensure(BaseOnlineSession))
{
return;
}
OnlineSession = Cast<UAccelByteWarsOnlineSessionBase>(BaseOnlineSession);
ensure(OnlineSession);
// Get selected game mode type from the previous widget
UAccelByteWarsBaseUI* BaseUIWidget = Cast<UAccelByteWarsGameInstance>(GetGameInstance())->GetBaseUIWidget();
for (const UCommonActivatableWidget* Widget : BaseUIWidget->Stacks[EBaseUIStackType::Menu]->GetWidgetList())
{
if (const UQuickPlayWidget* QuickPlayWidget = Cast<UQuickPlayWidget>(Widget))
{
SelectedGameModeType = QuickPlayWidget->GetSelectedGameModeType();
SelectedGameStyle = QuickPlayWidget->GetSelectedGameStyle();
}
}
Btn_Back->OnClicked().AddUObject(this, &ThisClass::DeactivateWidget);
Btn_Join->OnClicked().AddUObject(this, &ThisClass::JoinSession);
Btn_Cancel->OnClicked().AddUObject(this, &ThisClass::CancelMatchmaking);
Btn_Reject->OnClicked().AddUObject(this, &ThisClass::RejectSessionInvite);
Btn_Retry->OnClicked().AddUObject(this, &ThisClass::StartMatchmaking);
OnlineSession->GetOnStartMatchmakingCompleteDelegates()->AddUObject(this, &ThisClass::OnStartMatchmakingComplete);
OnlineSession->GetOnMatchmakingCompleteDelegates()->AddUObject(this, &ThisClass::OnMatchmakingComplete);
OnlineSession->GetOnSessionInviteReceivedDelegates()->AddUObject(this, &ThisClass::OnSessionInviteReceived);
OnlineSession->GetOnJoinSessionCompleteDelegates()->AddUObject(this, &ThisClass::OnJoinSessionComplete);
OnlineSession->GetOnSessionServerUpdateReceivedDelegates()->AddUObject(this, &ThisClass::OnSessionServerUpdateReceived);
OnlineSession->GetOnCancelMatchmakingCompleteDelegates()->AddUObject(this, &ThisClass::OnCancelMatchmakingComplete);
OnlineSession->GetOnRejectSessionInviteCompleteDelegate()->AddUObject(this, &ThisClass::OnRejectSessionInviteComplete);
// Start matchmaking immediately
StartMatchmaking();
} -
ウィジェットがアクティブでないときは、これらのコールバックをアンバインドする必要があります。
NativeOnDeactivated()を以下のコードで置き換えます。void UMatchmakingDSWidget_Starter::NativeOnDeactivated()
{
Btn_Back->OnClicked().RemoveAll(this);
Btn_Join->OnClicked().RemoveAll(this);
Btn_Cancel->OnClicked().RemoveAll(this);
Btn_Reject->OnClicked().RemoveAll(this);
Btn_Retry->OnClicked().RemoveAll(this);
OnlineSession->GetOnStartMatchmakingCompleteDelegates()->RemoveAll(this);
OnlineSession->GetOnMatchmakingCompleteDelegates()->RemoveAll(this);
OnlineSession->GetOnSessionInviteReceivedDelegates()->RemoveAll(this);
OnlineSession->GetOnJoinSessionCompleteDelegates()->RemoveAll(this);
OnlineSession->GetOnSessionServerUpdateReceivedDelegates()->RemoveAll(this);
OnlineSession->GetOnCancelMatchmakingCompleteDelegates()->RemoveAll(this);
OnlineSession->GetOnRejectSessionInviteCompleteDelegate()->RemoveAll(this);
Super::NativeOnDeactivated();
} -
プレイヤーがゲームセッションから退出できるようにするために、バインドする必要があるボタンがいくつかあります。マッチロビーの退出ボタン、一時停止ウィジェットとゲームオーバーウィジェットの終了ボタンです。これを行うには、セッションから退出するためのデリゲートを割り当てることができます。
MatchmakingDSOnlineSession_StarterCPP ファイルを開き、RegisterOnlineDelegates()に以下のコードを追加します。void UMatchmakingDSOnlineSession_Starter::RegisterOnlineDelegates()
{
// ...
const TDelegate<void(APlayerController*)> LeaveSessionDelegate = TDelegate<void(APlayerController*)>::CreateWeakLambda(
this, [this](APlayerController*)
{
LeaveSession(GetPredefinedSessionNameFromType(EAccelByteV2SessionType::GameSession));
});
UPauseWidget::OnQuitGameDelegate.Add(LeaveSessionDelegate);
UMatchLobbyWidget::OnQuitLobbyDelegate.Add(LeaveSessionDelegate);
UGameOverWidget::OnQuitGameDelegate.Add(LeaveSessionDelegate);
// ...
} -
オンラインセッションが初期化解除されたときは、イベントのリスニングを停止するためにアンバインドする必要があります。これを行うには、
ClearOnlineDelegates()関数に以下のコードを追加します。void UMatchmakingDSOnlineSession_Starter::ClearOnlineDelegates()
{
// ...
UPauseWidget::OnQuitGameDelegate.RemoveAll(this);
UMatchLobbyWidget::OnQuitLobbyDelegate.RemoveAll(this);
UGameOverWidget::OnQuitGameDelegate.RemoveAll(this);
// ...
}
専用サーバーをアップロードする
このチュートリアルを完了してプレイテストするには、新しい専用サーバーイメージを管理ポータルにアップロードする必要があります。AccelByte Multiplayer Servers (AMS) を使用した専用サーバーモジュールの手順を再度実行して、これを行うことができます。
リソース
-
このチュートリアルセクションで使用されているファイルは、Unreal Byte Wars GitHub リポジトリで入手できます。
- AccelByteWars/Source/AccelByteWars/TutorialModules/Play/MatchmakingDS/UI/MatchmakingDSWidget_Starter.h
- AccelByteWars/Source/AccelByteWars/TutorialModules/Play/MatchmakingDS/UI/MatchmakingDSWidget_Starter.cpp
- AccelByteWars/Source/AccelByteWars/TutorialModules/Play/MatchmakingDS/MatchmakingDSOnlineSession_Starter.h
- AccelByteWars/Source/AccelByteWars/TutorialModules/Play/MatchmakingDS/MatchmakingDSOnlineSession_Starter.cpp