すべてを統合する - ピアツーピアでのクイックマッチ - (Unreal Engine モジュール)
注釈:本資料はAI技術を用いて翻訳されています。
マッチメイキングUIの目的は、マッチメイキングの正確な状態を表示することです。そのため、ウィジェットには多くの高レベルな状態があります。各状態がいつ表示されるべきかを理解するには、次の図を参照してください:
UIを接続してマッチメイキングの開始、キャンセル、ステータス表示を行う
-
MatchmakingP2PWidget_StarterCPPファイルを開き、以下のコードを使用してStartMatchmaking()関数を置き換え、マッチメイキングの開始をトリガーします。OnlineSession変数は、先ほど作成したオンラインセッション(MatchmakingP2POnlineSession_Starterクラス)への参照です。void UMatchmakingP2PWidget_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::P2P,
SelectedGameModeType, SelectedGameStyle);
} -
以下のコードを使用して
JoinSession()関数を置き換え、マッチメイキング完了時にゲームが受信した招待へのセッション参加をトリガーします。void UMatchmakingP2PWidget_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 UMatchmakingP2PWidget_Starter::CancelMatchmaking()
{
ChangeWidgetState(EWidgetState::CANCELING_MATCH);
OnlineSession->CancelMatchmaking(
GetOwningPlayer(),
OnlineSession->GetPredefinedSessionNameFromType(EAccelByteV2SessionType::GameSession));
} -
以下のコードを使用して
RejectSessionInvite()関数を置き換え、マッチセッション招待の拒否をトリガーします:void UMatchmakingP2PWidget_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 UMatchmakingP2PWidget_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 UMatchmakingP2PWidget_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 UMatchmakingP2PWidget_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();
} -
プレイヤーがゲームセッションから退出できるようにするために、バインドする必要があるボタンがいくつかあります。これらのボタンは、マッチロビーの退出ボタン、および一時停止とゲームオーバーウィジェットの終了ボタンです。これを行うには、セッションから退出するためのデリゲートを割り当てます。
MatchmakingP2POnlineSession_StarterCPPファイルを開き、RegisterOnlineDelegates()関数に以下のコードを追加します:void UMatchmakingP2POnlineSession_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 UMatchmakingP2POnlineSession_Starter::ClearOnlineDelegates()
{
// ...
UPauseWidget::OnQuitGameDelegate.RemoveAll(this);
UMatchLobbyWidget::OnQuitLobbyDelegate.RemoveAll(this);
UGameOverWidget::OnQuitGameDelegate.RemoveAll(this);
// ...
}
リソース
-
このチュートリアルセクションで使用されているファイルは、Unreal Byte Wars GitHubリポジトリで入手できます。
- AccelByteWars/Source/AccelByteWars/TutorialModules/Play/MatchmakingP2P/UI/MatchmakingP2PWidget_Starter.h
- AccelByteWars/Source/AccelByteWars/TutorialModules/Play/MatchmakingP2P/UI/MatchmakingP2PWidget_Starter.cpp
- AccelByteWars/Source/AccelByteWars/TutorialModules/Play/MatchmakingP2P/MatchmakingP2POnlineSession_Starter.h
- AccelByteWars/Source/AccelByteWars/TutorialModules/Play/MatchmakingP2P/MatchmakingP2POnlineSession_Starter.cpp