すべてを統合する - 専用サーバーで参加可能なセッション - (Unreal Engine モジュール)
注釈:本資料はAI技術を用いて翻訳されています。
Create Match Session メニューをセッションの作成、退出、現在のセッションステータス表示に接続する
-
CreateMatchSessionDSWidget_StarterCPP ファイルを開き、CreateSession()関数に移動します。Online Session からセッション作成関数の呼び出しを追加します。親ウィジェットがプレイヤーが選択したゲームモードを保存していることに注意してください。次に、選択されたゲームモードを取得して Online Session に渡します。void UCreateMatchSessionDSWidget_Starter::CreateSession() const
{
if (OnlineSession->ValidateToStartSession.IsBound() &&
!OnlineSession->ValidateToStartSession.Execute())
{
return;
}
// Make sure the retry and cancel game session is performed by this class when the DS network type is selected.
W_Parent->GetProcessingWidgetComponent()->OnCancelClicked.Clear();
W_Parent->GetProcessingWidgetComponent()->OnRetryClicked.Clear();
W_Parent->GetProcessingWidgetComponent()->OnCancelClicked.AddUObject(this, &ThisClass::CancelJoiningSession);
W_Parent->GetProcessingWidgetComponent()->OnRetryClicked.AddUObject(this, &ThisClass::CreateSession);
W_Parent->SetLoadingMessage(TEXT_REQUESTING_SESSION_CREATION, false);
W_Parent->SwitchContent(UCreateMatchSessionWidget::EContentType::LOADING);
OnlineSession->CreateMatchSession(
OnlineSession->GetLocalUserNumFromPlayerController(GetOwningPlayer()),
EGameModeNetworkType::DS,
W_Parent->GetSelectedGameModeType(), W_Parent->GetSelectedGameStyle());
} -
CancelJoiningSession()関数に移動します。LeaveSessionを呼び出して参加キャンセル効果を実現します。技術的には、この関数が呼び出されたとき、プレイヤーはすでにセッション内にいますが、この場合は専用サーバーの準備が整うのを待っている状態です。void UCreateMatchSessionDSWidget_Starter::CancelJoiningSession() const
{
W_Parent->SetLoadingMessage(TEXT_LEAVING_SESSION, false);
W_Parent->SwitchContent(UCreateMatchSessionWidget::EContentType::LOADING);
OnlineSession->LeaveSession(
OnlineSession->GetPredefinedSessionNameFromType(EAccelByteV2SessionType::GameSession));
} -
前のモジュールで、いくつかのコールバック関数を準備しました。これらの関数を動作させるには、デリゲートにバインドする必要があります。CPP ファイルで
NativeOnActivatedに移動し、以下のコードに置き換えます。void UCreateMatchSessionDSWidget_Starter::NativeOnActivated()
{
Super::NativeOnActivated();
// Get online session
UOnlineSession* BaseOnlineSession = GetWorld()->GetGameInstance()->GetOnlineSession();
if (!ensure(BaseOnlineSession))
{
return;
}
OnlineSession = Cast<UAccelByteWarsOnlineSessionBase>(BaseOnlineSession);
// Get parent menu widget
W_Parent = GetFirstOccurenceOuter<UCreateMatchSessionWidget>();
if (!ensure(W_Parent))
{
return;
}
OnlineSession->GetOnCreateSessionCompleteDelegates()->AddUObject(this, &ThisClass::OnCreateSessionComplete);
OnlineSession->GetOnLeaveSessionCompleteDelegates()->AddUObject(this, &ThisClass::OnCancelJoiningSessionComplete);
OnlineSession->GetOnSessionServerUpdateReceivedDelegates()->AddUObject(
this, &ThisClass::OnSessionServerUpdateReceived);
Btn_StartMatchSessionDS->OnClicked().AddUObject(this, &ThisClass::CreateSession);
} -
不要になったらバインドを解除します。
NativeOnDeactivatedに移動し、以下のコードに置き換えます。void UCreateMatchSessionDSWidget_Starter::NativeOnDeactivated()
{
Super::NativeOnDeactivated();
OnlineSession->GetOnCreateSessionCompleteDelegates()->RemoveAll(this);
OnlineSession->GetOnLeaveSessionCompleteDelegates()->RemoveAll(this);
OnlineSession->GetOnSessionServerUpdateReceivedDelegates()->RemoveAll(this);
Btn_StartMatchSessionDS->OnClicked().RemoveAll(this);
W_Parent->GetProcessingWidgetComponent()->OnRetryClicked.RemoveAll(this);
W_Parent->GetProcessingWidgetComponent()->OnCancelClicked.RemoveAll(this);
}
Browse Match メニューを利用可能なセッションの検索と参加、現在のセッションステータス表示に接続する
-
BrowseMatchDSWidget_StarterCPP ファイルを開き、FindSessions()関数に移動します。Online Session からFindSessions()関数を呼び出します。バックエンドが返すセッションの最大数を増やしたい場合は、Header ファイルのSessionsNumToQuery値を増やすだけです。void UBrowseMatchDSWidget_Starter::FindSessions(const bool bForce) const
{
W_Parent->SetLoadingMessage(TEXT_LOADING_DATA, true, false);
W_Parent->SwitchContent(UBrowseMatchWidget::EContentType::BROWSE_LOADING);
Btn_Refresh->SetIsEnabled(false);
OnlineSession->FindSessions(
OnlineSession->GetLocalUserNumFromPlayerController(GetOwningPlayer()),
SessionsNumToQuery,
bForce);
} -
CancelJoining()関数に移動し、以下のコードに置き換えます。Create Match メニューと同様に、この関数はLeaveSessionを呼び出します。void UBrowseMatchDSWidget_Starter::CancelJoining() const
{
W_Parent->SetLoadingMessage(TEXT_LEAVING_SESSION, false, false);
W_Parent->SwitchContent(UBrowseMatchWidget::EContentType::JOIN_LOADING);
OnlineSession->LeaveSession(
OnlineSession->GetPredefinedSessionNameFromType(EAccelByteV2SessionType::GameSession));
} -
JoinSession()関数に移動します。対応する Online Session 関数を呼び出すために、以下のコードに置き換えます。void UBrowseMatchDSWidget_Starter::JoinSession(const FOnlineSessionSearchResult& SessionSearchResult) const
{
if (OnlineSession->ValidateToJoinSession.IsBound() &&
!OnlineSession->ValidateToJoinSession.Execute(SessionSearchResult))
{
return;
}
W_Parent->SetLoadingMessage(TEXT_JOINING_SESSION, false, false);
W_Parent->SwitchContent(UBrowseMatchWidget::EContentType::JOIN_LOADING);
OnlineSession->JoinSession(
OnlineSession->GetLocalUserNumFromPlayerController(GetOwningPlayer()),
OnlineSession->GetPredefinedSessionNameFromType(EAccelByteV2SessionType::GameSession),
SessionSearchResult);
} -
コールバック関数をコールバックデリゲートにバインドします。CPP ファイルで
NativeOnActivatedに移動し、以下のコードに置き換えます。void UBrowseMatchDSWidget_Starter::NativeOnActivated()
{
Super::NativeOnActivated();
// Get online session
UOnlineSession* BaseOnlineSession = GetWorld()->GetGameInstance()->GetOnlineSession();
if (!ensure(BaseOnlineSession))
{
return;
}
OnlineSession = Cast<UAccelByteWarsOnlineSessionBase>(BaseOnlineSession);
ensure(OnlineSession);
// Get parent menu widget
W_Parent = GetFirstOccurenceOuter<UBrowseMatchWidget>();
if (!ensure(W_Parent))
{
return;
}
OnlineSession->GetOnLeaveSessionCompleteDelegates()->AddUObject(this, &ThisClass::OnCancelJoiningComplete);
OnlineSession->GetOnFindSessionsCompleteDelegates()->AddUObject(this, &ThisClass::OnFindSessionComplete);
OnlineSession->GetOnJoinSessionCompleteDelegates()->AddUObject(this, &ThisClass::OnJoinSessionComplete);
OnlineSession->GetOnSessionServerUpdateReceivedDelegates()->AddUObject(this, &ThisClass::OnSessionServerUpdateReceived);
Btn_Refresh->OnClicked().AddUObject(this, &ThisClass::FindSessions, true);
W_Parent->GetJoiningWidgetComponent()->OnCancelClicked.AddUObject(this, &ThisClass::CancelJoining);
FindSessions(false);
} -
これらのコールバックを適切にバインド解除する方法を実装します。
NativeOnDeactivatedに移動し、以下のコードに置き換えます。void UBrowseMatchDSWidget_Starter::NativeOnDeactivated()
{
Super::NativeOnDeactivated();
OnlineSession->GetOnLeaveSessionCompleteDelegates()->RemoveAll(this);
OnlineSession->GetOnFindSessionsCompleteDelegates()->RemoveAll(this);
OnlineSession->GetOnJoinSessionCompleteDelegates()->RemoveAll(this);
OnlineSession->GetOnSessionServerUpdateReceivedDelegates()->RemoveAll(this);
Btn_Refresh->OnClicked().RemoveAll(this);
W_Parent->GetJoiningWidgetComponent()->OnCancelClicked.RemoveAll(this);
} -
プロジェクトをコンパイルし、エラーがないことを確認します。
専用サーバーをアップロードする
このチュートリアルを完了してプレイテストするには、新しい専用サーバーイメージを Admin Portal にアップロードする必要があります。これを行うには、AccelByte Multiplayer Servers (AMS) を使用した専用サーバーモジュールを参照してください。
リソース
- このチュートリアルセクションで使用されているファイルは、Byte Wars GitHub リポジトリで入手できます。
- AccelByteWars/Source/AccelByteWars/TutorialModules/Play/MatchSessionDS/UI/CreateMatchSessionDSWidget_Starter.h
- AccelByteWars/Source/AccelByteWars/TutorialModules/Play/MatchSessionDS/UI/CreateMatchSessionDSWidget_Starter.cpp
- AccelByteWars/Source/AccelByteWars/TutorialModules/Play/MatchSessionDS/UI/BrowseMatchDSWidget_Starter.h
- AccelByteWars/Source/AccelByteWars/TutorialModules/Play/MatchSessionDS/UI/BrowseMatchDSWidget_Starter.cpp