サブシステムの実装 - セッション入門 - (Unreal Engine モジュール)
注釈:本資料はAI技術を用いて翻訳されています。
セッション作成と退出のフロー
開始する前に、セッション作成と退出のフローがどのように機能するかを確認してください:
サブシステムについて
これで、AccelByte Gaming Services (AGS) Online Subsystem (OSS) を使用してセッションエッセンシャルを実装する準備が整いました。Byte Wars モジュールプロジェクトには、セッション実装を処理する SessionEssentialsOnlineSession_Starter というオンラインセッションクラスがあります。このオンラインセッションクラスは必要な宣言と定義を提供しているため、セッション機能の実装を開始できます。
オンラインセッションについて説明する前に、/Config/DefaultEngine.ini に以下のように bEnableV2Sessions が有効になっていることを確認してください。これは、ゲームが AGS OSS によって提供されるマッチメイキング機能を使用できるようにするために必要です。
[OnlineSubsystemAccelByte]
bEnabled=true
bMultipleLocalUsersEnabled=false
bAutoLobbyConnectAfterLoginSuccess=true
...
[OnlineSubsystemAccelByte]
bEnableV2Sessions=true
SessionEssentialsOnlineSession_Starter クラスファイルは以下の場所にあります:
- ヘッダーファイル:
/Source/AccelByteWars/TutorialModules/Play/SessionEssentials/SessionEssentialsOnlineSession_Starter.h - CPP ファイル:
/Source/AccelByteWars/TutorialModules/Play/SessionEssentials/SessionEssentialsOnlineSession_Starter.cpp
クラスで提供されている内容を見てみましょう:
-
SessionEssentialsOnlineSession_Starterクラスの CPP ファイルには、RegisterOnlineDelegates()とClearOnlineDelegates()関数があります。これらの関数は、このクラスの祖父クラスである Unreal Engine のオンラインセッションUOnlineSessionによって提供されています。RegisterOnlineDelegates()は、ゲームインスタンスサブシステムの初期化の直前、ゲームインスタンスの初期化時に呼び出されます。一方、ClearOnlineDelegates()は、ゲームが終了する直前に呼び出されます。 -
SessionEssentialsOnlineSession_StarterクラスはAccelByteWarsOnlineSessionBaseから派生しています。AccelByteWarsOnlineSessionBaseには、ゲームセッションサービスに関連する基本的なヘルパーがあります。これらのクラスには、AGS OSS インターフェースを取得するためのいくつかの関数と、後でセッション関連の関数を実装するために使用できるヘルパーがあります。FOnlineSessionV2AccelBytePtr UAccelByteWarsOnlineSessionBase::GetABSessionInt()
{
return StaticCastSharedPtr<FOnlineSessionV2AccelByte>(GetSessionInt());
}FNamedOnlineSession* USessionEssentialsOnlineSession_Starter::GetSession(const FName SessionName)
{
return GetSessionInt()->GetNamedSession(SessionName);
}EAccelByteV2SessionType USessionEssentialsOnlineSession_Starter::GetSessionType(const FName SessionName)
{
const FNamedOnlineSession* OnlineSession = GetSession(SessionName);
if (!OnlineSession)
{
return EAccelByteV2SessionType::Unknown;
}
const FOnlineSessionSettings& OnlineSessionSettings = OnlineSession->SessionSettings;
return GetABSessionInt()->GetSessionTypeFromSettings(OnlineSessionSettings);
}FName USessionEssentialsOnlineSession_Starter::GetPredefinedSessionNameFromType(const EAccelByteV2SessionType SessionType)
{
FName SessionName = FName();
switch (SessionType)
{
case EAccelByteV2SessionType::GameSession:
SessionName = GameSessionName;
break;
case EAccelByteV2SessionType::PartySession:
SessionName = PartySessionName;
break;
default: ;
}
return SessionName;
}GetABSessionInt(): AGS OSS セッションインターフェースを取得する関数。GetSession(): 指定された名前に基づいてゲームセッションを取得する関数。GetSessionType(): セッションがゲームセッションかパーティーセッションかを示す AGS セッションインターフェース固有の関数。GetPredefinedSessionNameFromType(): ゲームセッションには事前定義されたNAME_GameSessionを、パーティーセッションにはNAME_PartySessionを返します。これらの名前は、どのセッションがゲームセッションかパーティーセッションかを区別するために Unreal Engine によって提供されています。
-
SessionEssentialsOnlineSession_Starterクラスのヘッダーファイルを見てください。7つのデリゲートとそれらのゲッター関数が表示されます。これらのデリゲートは、リクエストを行う際にレスポンスコールに UI を接続する方法となります。public:
// ...
virtual FOnCreateSessionComplete* GetOnCreateSessionCompleteDelegates() override
{
return &OnCreateSessionCompleteDelegates;
}
virtual FOnJoinSessionComplete* GetOnJoinSessionCompleteDelegates() override
{
return &OnJoinSessionCompleteDelegates;
}
virtual FOnSendSessionInviteComplete* GetOnSendSessionInviteCompleteDelegates() override
{
return &OnSendSessionInviteCompleteDelegates;
}
virtual FOnRejectSessionInviteCompleteMulticast* GetOnRejectSessionInviteCompleteDelegate() override
{
return &OnRejectSessionInviteCompleteDelegates;
}
virtual FOnDestroySessionComplete* GetOnLeaveSessionCompleteDelegates() override
{
return &OnLeaveSessionCompleteDelegates;
}
virtual FOnUpdateSessionComplete* GetOnUpdateSessionCompleteDelegates() override
{
return &OnUpdateSessionCompleteDelegates;
}
virtual FOnV2SessionInviteReceived* GetOnSessionInviteReceivedDelegates() override
{
return &OnSessionInviteReceivedDelegates;
}
// ...
virtual FOnSessionParticipantJoined* GetOnSessionParticipantJoined() override
{
return &OnSessionParticipantJoinedDelegates;
}
virtual FOnSessionParticipantLeft* GetOnSessionParticipantLeft() override
{
return &OnSessionParticipantLeftDelegates;
}private:
// ...
FOnCreateSessionComplete OnCreateSessionCompleteDelegates;
FOnJoinSessionComplete OnJoinSessionCompleteDelegates;
FOnSendSessionInviteComplete OnSendSessionInviteCompleteDelegates;
FOnRejectSessionInviteCompleteMulticast OnRejectSessionInviteCompleteDelegates;
FOnDestroySessionComplete OnLeaveSessionCompleteDelegates;
FOnUpdateSessionComplete OnUpdateSessionCompleteDelegates;
FOnV2SessionInviteReceived OnSessionInviteReceivedDelegates;
// ...
FOnSessionParticipantJoined OnSessionParticipantJoinedDelegates;
FOnSessionParticipantLeft OnSessionParticipantLeftDelegates; -
ヘッダーファイルには、
boolean変数bLeavingSessionも表示されます。この変数は、後のモジュールでの実装に使用されます。protected:
bool bLeavingSession = false;
セッションを退出する
フロー図を振り返ると、作成関数が場合によってはセッションを退出することに気付くでしょう。そのため、セッション退出から始めます。
-
セッション退出をリクエストする関数を宣言することから始めます。
SessionEssentialsOnlineSession_Starterクラスのヘッダーファイルを開き、以下の関数宣言を追加します:public:
// ...
virtual void LeaveSession(FName SessionName) override; -
ヘッダーファイルで、レスポンスコールバック用の関数宣言をもう1つ追加します:
protected:
// ...
virtual void OnLeaveSessionComplete(FName SessionName, bool bSucceeded) override; -
SessionEssentialsOnlineSession_Starterクラスの CPP ファイルを開き、以下のコードを追加します。リクエスト関数を呼び出す前に、ユーティリティ関数GetSession()を使用して、プレイヤーがセッションの一部であるかどうかを確認します。プレイヤーがセッションに参加している場合にのみ、セッション退出リクエストをトリガーします。void USessionEssentialsOnlineSession_Starter::LeaveSession(FName SessionName)
{
UE_LOG_SESSIONESSENTIALS(Verbose, TEXT("called"))
// セッションインターフェースが無効な場合は中止します。
if (!GetSessionInt())
{
UE_LOG_SESSIONESSENTIALS(Warning, TEXT("Session interface is null"))
ExecuteNextTick(FTimerDelegate::CreateWeakLambda(this, [this, SessionName]()
{
OnLeaveSessionComplete(SessionName, false);
}));
return;
}
if (GetSession(SessionName))
{
if (!GetABSessionInt()->DestroySession(SessionName))
{
UE_LOG_SESSIONESSENTIALS(Warning, TEXT("Failed to execute"))
ExecuteNextTick(FTimerDelegate::CreateWeakLambda(this, [this, SessionName]()
{
OnLeaveSessionComplete(SessionName, false);
}));
}
else
{
bLeavingSession = true;
}
}
else
{
UE_LOG_SESSIONESSENTIALS(Log, TEXT("Not in session"))
ExecuteNextTick(FTimerDelegate::CreateWeakLambda(this, [this, SessionName]()
{
OnLeaveSessionComplete(SessionName, true);
}));
}
}注記セッションを退出するリクエスト関数は
DestroySessionと呼ばれ、そのセッションを退出してローカルインスタンスを破棄します。セッションの破棄自体はバックエンドによって処理されるため、より明確にするためにLeaveSessionという名前を使用します。 -
レスポンスコールバックを実装します。CPP ファイルで、以下のコードを追加します。コールバックは、レスポンスコールバックが受信されたときに他のクラスが何かを実行するために使用されるデリゲートを呼び出します。
void USessionEssentialsOnlineSession_Starter::OnLeaveSessionComplete(FName SessionName, bool bSucceeded)
{
UE_LOG_SESSIONESSENTIALS(Log, TEXT("succeeded: %s"), *FString(bSucceeded ? "TRUE": "FALSE"))
bLeavingSession = false;
OnLeaveSessionCompleteDelegates.Broadcast(SessionName, bSucceeded);
} -
レスポンス関数
OnLeaveSessionCompleteがまだどこにも呼び出されていないことに注意してください。現在、レスポンス関数はセッション退出リクエストのレスポンスにバインドされていません。クラスの CPP ファイルで、USessionEssentialsOnlineSession_Starter::RegisterOnlineDelegatesに移動し、以下のハイライトされたコードを追加します:void USessionEssentialsOnlineSession_Starter::RegisterOnlineDelegates()
{
// ...
GetSessionInt()->AddOnDestroySessionCompleteDelegate_Handle(
FOnDestroySessionCompleteDelegate::CreateUObject(this, &ThisClass::OnLeaveSessionComplete));
// ...
} -
バインドされた関数をアンバインドします。クラスの CPP ファイルで、
USessionEssentialsOnlineSession_Starter::ClearOnlineDelegatesに移動し、以下のハイライトされたコードを追加します:void USessionEssentialsOnlineSession_Starter::ClearOnlineDelegates()
{
// ...
GetSessionInt()->ClearOnDestroySessionCompleteDelegates(this);
// ...
}
セッションを作成する
-
セッション作成をリクエストする関数を宣言します。
SessionEssentialsOnlineSession_Starterクラスのヘッダーファイルを開き、以下の関数宣言を追加します:public:
// ...
virtual void CreateSession(
const int32 LocalUserNum,
FName SessionName,
FOnlineSessionSettings SessionSettings,
const EAccelByteV2SessionType SessionType,
const FString& SessionTemplateName) override; -
レスポンスコールバック用の関数宣言を追加します:
protected:
// ...
virtual void OnCreateSessionComplete(FName SessionName, bool bSucceeded) override; -
ヘッダーファイルで、関数宣言とデリゲートハンドル変数をもう1つ追加します。この関数とデリゲートハンドルは、プレイヤーがセッション作成を呼び出したが別のセッションの一部である場合に
LeaveSessionを呼び出すために使用されます。private:
// ...
void OnLeaveSessionForCreateSessionComplete(
FName SessionName,
bool bSucceeded,
const int32 LocalUserNum,
const FOnlineSessionSettings SessionSettings);
FDelegateHandle OnLeaveSessionForCreateSessionCompleteDelegateHandle; -
リクエスト関数の実装を作成します。
SessionEssentialsOnlineSession_Starterクラスの CPP ファイルを開き、以下のコードを追加します。セッション作成をリクエストする前に、まずセッション設定をセットアップする必要があります: ゲームセッションのセットアップ で設定したセッションテンプレート名で使用されるSessionTemplateNameを設定し、SessionTypeをゲームセッションまたはパーティーセッションとして設定し、次のモジュールの準備としてサーバー名を設定します。void USessionEssentialsOnlineSession_Starter::CreateSession(
const int32 LocalUserNum,
FName SessionName,
FOnlineSessionSettings SessionSettings,
const EAccelByteV2SessionType SessionType,
const FString& SessionTemplateName)
{
UE_LOG_SESSIONESSENTIALS(Verbose, TEXT("called"))
// Abort if the session interface is invalid.
if (!GetSessionInt())
{
UE_LOG_SESSIONESSENTIALS(Warning, TEXT("Session interface is null"))
ExecuteNextTick(FTimerDelegate::CreateWeakLambda(this, [this, SessionName]()
{
OnCreateSessionComplete(SessionName, false);
}));
return;
}
if (SessionTemplateName.IsEmpty())
{
UE_LOG_SESSIONESSENTIALS(Warning, TEXT("Session Template Name can't be empty"))
ExecuteNextTick(FTimerDelegate::CreateWeakLambda(this, [this, SessionName]()
{
OnCreateSessionComplete(SessionName, false);
}));
return;
}
#pragma region "Setup Session Settings"
// Session Template Name
SessionSettings.Set(SETTING_SESSION_TEMPLATE_NAME, SessionTemplateName);
// Session type
if (SessionType != EAccelByteV2SessionType::Unknown)
{
SessionSettings.Set(SETTING_SESSION_TYPE, GetPredefinedSessionNameFromType(SessionType).ToString());
}
if (SessionType == EAccelByteV2SessionType::GameSession)
{
// Check for DS version override.
const FString OverriddenDSVersion = UTutorialModuleOnlineUtility::GetDedicatedServerVersionOverride();
if (!OverriddenDSVersion.IsEmpty())
{
SessionSettings.Set(SETTING_GAMESESSION_CLIENTVERSION, OverriddenDSVersion);
}
// Set local server name for matchmaking request if any.
// This is useful if you want to try matchmaking using local dedicated server.
FString ServerName;
FParse::Value(FCommandLine::Get(), TEXT("-ServerName="), ServerName);
if (!ServerName.IsEmpty())
{
UE_LOG_SESSIONESSENTIALS(Log, TEXT("Requesting to use server with name: %s"), *ServerName)
SessionSettings.Set(SETTING_GAMESESSION_SERVERNAME, ServerName);
}
}
#pragma endregion
// If the session exists locally, then destroy the session first.
if (GetSession(SessionName))
{
UE_LOG_SESSIONESSENTIALS(Log, TEXT("The session exists locally. Leaving session first."))
// Reset the delegate.
if (OnLeaveSessionForCreateSessionCompleteDelegateHandle.IsValid())
{
OnLeaveSessionCompleteDelegates.Remove(OnLeaveSessionForCreateSessionCompleteDelegateHandle);
OnLeaveSessionForCreateSessionCompleteDelegateHandle.Reset();
}
OnLeaveSessionForCreateSessionCompleteDelegateHandle = OnLeaveSessionCompleteDelegates.AddUObject(this, &ThisClass::OnLeaveSessionForCreateSessionComplete, LocalUserNum, SessionSettings);
LeaveSession(SessionName);
}
else
{
if (!GetSessionInt()->CreateSession(LocalUserNum, SessionName, SessionSettings))
{
UE_LOG_SESSIONESSENTIALS(Warning, TEXT("Failed to execute"))
ExecuteNextTick(FTimerDelegate::CreateWeakLambda(this, [this, SessionName]()
{
OnCreateSessionComplete(SessionName, false);
}));
}
}
} -
レスポンスコールバック関数を実装します。この関数は、リクエストの実行が完了したことを呼び出し元のクラスに伝えるデリゲートを呼び出します。
void USessionEssentialsOnlineSession_Starter::OnCreateSessionComplete(FName SessionName, bool bSucceeded)
{
UE_LOG_SESSIONESSENTIALS(Log, TEXT("succeeded: %s"), *FString(bSucceeded ? "TRUE": "FALSE"))
OnCreateSessionCompleteDelegates.Broadcast(SessionName, bSucceeded);
} -
CreateSessionの実装とフロー図に示されているように、プレイヤーがセッションの一部である場合は、以下のコードのように最初にLeaveSessionを呼び出します:void USessionEssentialsOnlineSession_Starter::OnLeaveSessionForCreateSessionComplete(
FName SessionName,
bool bSucceeded,
const int32 LocalUserNum,
const FOnlineSessionSettings SessionSettings)
{
UE_LOG_SESSIONESSENTIALS(Log, TEXT("succeeded: %s"), *FString(bSucceeded ? "TRUE": "FALSE"))
OnLeaveSessionCompleteDelegates.Remove(OnLeaveSessionForCreateSessionCompleteDelegateHandle);
if (bSucceeded)
{
if (!GetSessionInt()->CreateSession(LocalUserNum, SessionName, SessionSettings))
{
UE_LOG_SESSIONESSENTIALS(Warning, TEXT("Failed to execute"))
OnCreateSessionComplete(SessionName, false);
}
}
else
{
// Leave session failed, execute complete delegate as failed.
OnCreateSessionComplete(SessionName, false);
}
} -
OnCreateSessionComplete()関数をレスポンスコールバックにバインドします。CPP ファイルのRegisterOnlineDelegatesに移動し、以下のハイライトされたコードを追加します:void USessionEssentialsOnlineSession_Starter::RegisterOnlineDelegates()
{
// ...
GetSessionInt()->AddOnCreateSessionCompleteDelegate_Handle(
FOnCreateSessionCompleteDelegate::CreateUObject(this, &ThisClass::OnCreateSessionComplete));
// ...
} -
プレイヤーがゲームを終了するときにコールバックをアンバインドします。
ClearOnlineDelegates()関数に以下のハイライトされたコードを追加します。void USessionEssentialsOnlineSession_Starter::ClearOnlineDelegates()
{
// ...
GetSessionInt()->ClearOnCreateSessionCompleteDelegates(this);
// ...
}
セッションに参加する
-
SessionEssentialsOnlineSession_Starterクラスのヘッダーファイルで、リクエスト関数の関数宣言を追加します:public:
// ...
virtual void JoinSession(
const int32 LocalUserNum,
FName SessionName,
const FOnlineSessionSearchResult& SearchResult) override; -
レスポンスコールバック関数の宣言を追加します:
protected:
// ...
virtual void OnJoinSessionComplete(FName SessionName, EOnJoinSessionCompleteResult::Type Result) override; -
ヘッダーファイルで、プレイヤーがセッション参加を呼び出したが既にセッションの一部である場合に、最初にセッション退出を処理するための関数宣言とデリゲートをもう1つ追加します:
private:
// ...
void OnLeaveSessionForJoinSessionComplete(
FName SessionName,
bool bSucceeded,
const int32 LocalUserNum,
const FOnlineSessionSearchResult SearchResult);
FDelegateHandle OnLeaveSessionForJoinSessionCompleteDelegateHandle; -
SessionEssentialsOnlineSession_Starterクラスの CPP ファイルを開き、以下のコードを追加します。セッション参加の実装では、この関数はセットアップなしでJoinSession()を呼び出しますが、プレイヤーがセッションの一部である場合は、最初にLeaveSessionを呼び出します。void USessionEssentialsOnlineSession_Starter::JoinSession(
const int32 LocalUserNum,
FName SessionName,
const FOnlineSessionSearchResult& SearchResult)
{
UE_LOG_SESSIONESSENTIALS(Verbose, TEXT("called"))
// Abort if the session interface is invalid.
if (!GetSessionInt())
{
UE_LOG_SESSIONESSENTIALS(Warning, TEXT("Session interface is null"))
ExecuteNextTick(FTimerDelegate::CreateWeakLambda(this, [this, SessionName]()
{
OnJoinSessionComplete(SessionName, EOnJoinSessionCompleteResult::UnknownError);
}));
return;
}
// If the session exist, then destroy it first and then join the new one.
if (GetSession(SessionName))
{
// Reset the delegate.
if (OnLeaveSessionForJoinSessionCompleteDelegateHandle.IsValid())
{
OnLeaveSessionCompleteDelegates.Remove(OnLeaveSessionForJoinSessionCompleteDelegateHandle);
OnLeaveSessionForJoinSessionCompleteDelegateHandle.Reset();
}
OnLeaveSessionForJoinSessionCompleteDelegateHandle = OnLeaveSessionCompleteDelegates.AddUObject(this, &ThisClass::OnLeaveSessionForJoinSessionComplete, LocalUserNum, SearchResult);
LeaveSession(SessionName);
}
else
{
if (!GetSessionInt()->JoinSession(LocalUserNum, SessionName, SearchResult))
{
UE_LOG_SESSIONESSENTIALS(Warning, TEXT("Failed to execute"))
ExecuteNextTick(FTimerDelegate::CreateWeakLambda(this, [this, SessionName]()
{
OnJoinSessionComplete(SessionName, EOnJoinSessionCompleteResult::UnknownError);
}));
}
}
} -
コールバック関数を実装します。前と同様に、この関数は対応するデリゲートを呼び出すだけです。
void USessionEssentialsOnlineSession_Starter::OnJoinSessionComplete(FName SessionName, EOnJoinSessionCompleteResult::Type Result)
{
UE_LOG_SESSIONESSENTIALS(Log, TEXT("succeeded: %s"), *FString(Result == EOnJoinSessionCompleteResult::Success ? "TRUE" : "FALSE"))
OnJoinSessionCompleteDelegates.Broadcast(SessionName, Result);
} -
CPP ファイルに以下のコードを追加して、セッション退出後にセッションに参加する実装を行います:
void USessionEssentialsOnlineSession_Starter::OnLeaveSessionForJoinSessionComplete(
FName SessionName,
bool bSucceeded,
const int32 LocalUserNum,
const FOnlineSessionSearchResult SearchResult)
{
UE_LOG_SESSIONESSENTIALS(Log, TEXT("succeeded: %s"), *FString(bSucceeded ? "TRUE": "FALSE"))
OnLeaveSessionCompleteDelegates.Remove(OnLeaveSessionForJoinSessionCompleteDelegateHandle);
if (bSucceeded)
{
if (!GetSessionInt()->JoinSession(LocalUserNum, SessionName, SearchResult))
{
UE_LOG_SESSIONESSENTIALS(Warning, TEXT("failed to execute"))
OnJoinSessionComplete(SessionName, EOnJoinSessionCompleteResult::UnknownError);
}
}
else
{
// Leave session failed, execute complete delegate as failed.
OnJoinSessionComplete(SessionName, EOnJoinSessionCompleteResult::UnknownError);
}
} -
CPP ファイルで、
RegisterOnlineDelegates()関数に移動し、以下のハイライトされたコードを追加して、レスポンスコールバックを対応する OSS デリゲートにバインドします:void USessionEssentialsOnlineSession_Starter::RegisterOnlineDelegates()
{
// ...
GetSessionInt()->AddOnJoinSessionCompleteDelegate_Handle(
FOnJoinSessionCompleteDelegate::CreateUObject(this, &ThisClass::OnJoinSessionComplete));
// ...
} -
ClearOnlineDelegatesに移動し、以下のハイライトされたコードを追加してレスポンスコールバックをアンバインドします。void USessionEssentialsOnlineSession_Starter::ClearOnlineDelegates()
{
// ...
GetSessionInt()->ClearOnJoinSessionCompleteDelegates(this);
// ...
}
セッション招待の送信と受信
-
SessionEssentialsOnlineSession_Starterヘッダーファイルを開きます。リクエスト関数の関数宣言を追加します:public:
// ...
virtual void SendSessionInvite(const int32 LocalUserNum, FName SessionName, const FUniqueNetIdPtr Invitee) override; -
レスポンスコールバックの関数宣言を追加します。
protected:
// ...
virtual void OnSendSessionInviteComplete(
const FUniqueNetId& LocalSenderId,
FName SessionName,
bool bSucceeded,
const FUniqueNetId& InviteeId) override; -
ヘッダーファイルで、招待を受信したときに呼び出される関数宣言を追加します。
protected:
// ...
virtual void OnSessionInviteReceived(
const FUniqueNetId& UserId,
const FUniqueNetId& FromId,
const FOnlineSessionInviteAccelByte& Invite) override; -
SessionEssentialsOnlineSession_StarterCPP ファイルを開き、SendSessionInvite()関数に以下のコードを追加します。この関数は対応する OSS 関数を呼び出します。void USessionEssentialsOnlineSession_Starter::SendSessionInvite(
const int32 LocalUserNum,
FName SessionName,
const FUniqueNetIdPtr Invitee)
{
UE_LOG_SESSIONESSENTIALS(Verbose, TEXT("Called"));
if (!Invitee.IsValid())
{
UE_LOG_SESSIONESSENTIALS(Log, TEXT("Invitee net id is invalid. Canceling operation"));
return;
}
GetABSessionInt()->SendSessionInviteToFriend(LocalUserNum, SessionName, *Invitee.Get());
} -
CPP ファイルで、
OnSendSessionInviteComplete()関数に以下のコードを追加します。この関数は、レスポンスが受信されたときに他のオブジェクトに知らせるために、対応するデリゲートも呼び出します。void USessionEssentialsOnlineSession_Starter::OnSendSessionInviteComplete(
const FUniqueNetId& LocalSenderId,
FName SessionName,
bool bSucceeded,
const FUniqueNetId& InviteeId)
{
UE_LOG_SESSIONESSENTIALS(Log, TEXT("succeeded: %s"), *FString(bSucceeded ? TEXT("TRUE") : TEXT("FALSE")))
OnSendSessionInviteCompleteDelegates.Broadcast(LocalSenderId, SessionName, bSucceeded, InviteeId);
} -
招待受信関数を実装します。
OnSendSessionInviteCompleteと同様に、この関数は対応するデリゲートを呼び出します。void USessionEssentialsOnlineSession_Starter::OnSessionInviteReceived(
const FUniqueNetId& UserId,
const FUniqueNetId& FromId,
const FOnlineSessionInviteAccelByte& Invite)
{
UE_LOG_SESSIONESSENTIALS(Log, TEXT("from: %s"), *FromId.ToDebugString())
OnSessionInviteReceivedDelegates.Broadcast(UserId, FromId, Invite);
} -
レスポンスコールバックと招待受信を対応する OSS デリゲートにバインドします。CPP ファイルで、
RegisterOnlineDelegates()関数に移動し、以下のハイライトされたコードを追加します:void USessionEssentialsOnlineSession_Starter::RegisterOnlineDelegates()
{
// ...
GetABSessionInt()->AddOnSendSessionInviteCompleteDelegate_Handle(
FOnSendSessionInviteCompleteDelegate::CreateUObject(this, &ThisClass::OnSendSessionInviteComplete));
// ...
GetABSessionInt()->AddOnV2SessionInviteReceivedDelegate_Handle(
FOnV2SessionInviteReceivedDelegate::CreateUObject(this, &ThisClass::OnSessionInviteReceived));
// ...
} -
これらのコールバックをアンバインドします。
ClearOnlineDelegates()関数に移動し、以下のハイライトされたコードを追加します:void USessionEssentialsOnlineSession_Starter::ClearOnlineDelegates()
{
// ...
GetABSessionInt()->ClearOnSendSessionInviteCompleteDelegates(this);
// ...
GetABSessionInt()->ClearOnV2SessionInviteReceivedDelegates(this);
// ...
}
セッション招待を拒否する
-
SessionEssentialsOnlineSession_Starterヘッダーファイルを開き、以下の関数宣言を追加します。この関数は拒否機能のリクエストを担当します。public:
// ...
virtual void RejectSessionInvite(const int32 LocalUserNum, const FOnlineSessionInviteAccelByte& Invite) override; -
SessionEssentialsOnlineSession_Starterヘッダーファイルで、レスポンスコールバックの宣言を追加します。protected:
// ...
virtual void OnRejectSessionInviteComplete(bool bSucceeded) override; -
SessionEssentialsOnlineSession_StarterCPP ファイルを開き、RejectSessionInvite()関数に以下の実装を追加します。このロジックは、対応する OSS 関数を呼び出す前にローカルユーザーの一意の ID を取得します。レスポンスコールバックをデリゲートにバインドする代わりに、RejectInviteOSS 関数がレスポンスコールバックをパラメータとして受け取るため、レスポンスデリゲートを個別にバインドおよびアンバインドする必要がないことに注意してください。void USessionEssentialsOnlineSession_Starter::RejectSessionInvite(
const int32 LocalUserNum,
const FOnlineSessionInviteAccelByte& Invite)
{
UE_LOG_SESSIONESSENTIALS(Verbose, TEXT("Called"));
const FUniqueNetIdPtr LocalUserNetId = GetLocalPlayerUniqueNetId(GetPlayerControllerByLocalUserNum(LocalUserNum));
if (!LocalUserNetId.IsValid())
{
UE_LOG_SESSIONESSENTIALS(Log, TEXT("Local User net id is invalid. Canceling operation"));
return;
}
GetABSessionInt()->RejectInvite(
*LocalUserNetId.Get(),
Invite,
FOnRejectSessionInviteComplete::CreateUObject(this, &ThisClass::OnRejectSessionInviteComplete));
} -
CPP ファイルで、レスポンスコールバックの実装を追加します:
void USessionEssentialsOnlineSession_Starter::OnRejectSessionInviteComplete(bool bSucceeded)
{
UE_LOG_SESSIONESSENTIALS(Log, TEXT("succeeded: %s"), *FString(bSucceeded ? TEXT("TRUE") : TEXT("FALSE")))
OnRejectSessionInviteCompleteDelegates.Broadcast(bSucceeded);
}
セッション参加者変更コールバック
このコールバックは、他のプレイヤーがセッションに参加または退出したときに呼び出されます。
-
SessionEssentialsOnlineSession_Starterヘッダーファイルを開き、この宣言を追加します:protected:
// ...
virtual void OnSessionParticipantJoined(FName SessionName, const FUniqueNetId& Member) override;
virtual void OnSessionParticipantLeft(FName SessionName, const FUniqueNetId& Member, EOnSessionParticipantLeftReason Reason) override; -
SessionEssentialsOnlineSession_StarterCPP ファイルを開き、以下のコードを追加します。この関数は対応するデリゲートを呼び出します。void USessionEssentialsOnlineSession_Starter::OnSessionParticipantJoined(
FName SessionName,
const FUniqueNetId& Member)
{
UE_LOG_SESSIONESSENTIALS(
Log,
TEXT("Session name: %s | Member: %s [Joined]"),
*SessionName.ToString(),
*Member.ToDebugString())
OnSessionParticipantJoinedDelegates.Broadcast(SessionName, Member);
}void USessionEssentialsOnlineSession_Starter::OnSessionParticipantLeft(
FName SessionName,
const FUniqueNetId& Member,
EOnSessionParticipantLeftReason Reason)
{
UE_LOG_SESSIONESSENTIALS(
Log,
TEXT("Session name: %s | Member: %s [Left] | Reason: %s"),
*SessionName.ToString(),
*Member.ToDebugString(),
ToLogString(Reason))
OnSessionParticipantLeftDelegates.Broadcast(SessionName, Member, Reason);
} -
コールバックを対応する OSS デリゲートにバインドします。
RegisterOnlineDelegatesに移動し、以下のハイライトされたコードを追加します:void USessionEssentialsOnlineSession_Starter::RegisterOnlineDelegates()
{
// ...
GetABSessionInt()->AddOnSessionParticipantJoinedDelegate_Handle(
FOnSessionParticipantJoinedDelegate::CreateUObject(this, &ThisClass::OnSessionParticipantJoined));
GetABSessionInt()->AddOnSessionParticipantLeftDelegate_Handle(
FOnSessionParticipantLeftDelegate::CreateUObject(this, &ThisClass::OnSessionParticipantLeft));
// ...
} -
ClearOnlineDelegatesに移動し、以下のハイライトされたコードを追加してコールバックをアンバインドします:void USessionEssentialsOnlineSession_Starter::ClearOnlineDelegates()
{
// ...
GetABSessionInt()->ClearOnSessionParticipantJoinedDelegates(this);
GetABSessionInt()->ClearOnSessionParticipantLeftDelegates(this);
// ...
}
プロジェクトを再度コンパイルし、コンパイルエラーがないことを確認してください。
セッション参加可能性を更新する
セッションには、誰がセッションに参加できるかを決定する参加可能性プロパティがあります。利用可能な参加可能性タイプについては、セッション入門 を参照してください。
-
SessionEssentialsOnlineSession_Starterヘッダーファイルを開き、この宣言を追加します:public:
// ...
virtual void UpdateSessionJoinability(const FName SessionName, const EAccelByteV2SessionJoinability Joinability) override; -
SessionEssentialsOnlineSession_Starterヘッダーファイルで、レスポンスコールバックの宣言を追加します。protected:
// ...
virtual void OnUpdateSessionComplete(FName SessionName, bool bSucceeded) override; -
SessionEssentialsOnlineSession_StarterCPP ファイルを開き、UpdateSessionJoinability()関数に以下の実装を追加します。この関数は対応する OSS 関数を呼び出します。void USessionEssentialsOnlineSession_Starter::UpdateSessionJoinability(const FName SessionName, const EAccelByteV2SessionJoinability Joinability)
{
UE_LOG_SESSIONESSENTIALS(Verbose, TEXT("called"));
FOnlineSessionV2AccelBytePtr ABSessionInt = GetABSessionInt();
if (!ABSessionInt)
{
UE_LOG_SESSIONESSENTIALS(Warning, TEXT("Session interface is null"));
return;
}
FNamedOnlineSession* Session = ABSessionInt->GetNamedSession(SessionName);
if (!Session)
{
UE_LOG_SESSIONESSENTIALS(Warning, TEXT("The session is invalid"));
return;
}
Session->SessionSettings.Set(SETTING_SESSION_JOIN_TYPE, UEnum::GetValueAsString(Joinability));
ABSessionInt->UpdateSession(SessionName, Session->SessionSettings);
} -
CPP ファイルで、
OnUpdateSessionComplete()関数に以下のコードを追加します。この関数は、レスポンスが受信されたときに他のオブジェクトに知らせるために、対応するデリゲートも呼び出します。void USessionEssentialsOnlineSession_Starter::OnUpdateSessionComplete(FName SessionName, bool bSucceeded)
{
UE_LOG_SESSIONESSENTIALS(Log, TEXT("succeeded: %s"), *FString(bSucceeded ? "TRUE": "FALSE"))
OnUpdateSessionCompleteDelegates.Broadcast(SessionName, bSucceeded);
} -
コールバックを対応する OSS デリゲートにバインドします。
RegisterOnlineDelegatesに移動し、以下のハイライトされたコードを追加します:void USessionEssentialsOnlineSession_Starter::RegisterOnlineDelegates()
{
// ...
GetSessionInt()->AddOnUpdateSessionCompleteDelegate_Handle(
FOnUpdateSessionCompleteDelegate::CreateUObject(this, &ThisClass::OnUpdateSessionComplete));
// ...
} -
ClearOnlineDelegatesに移動し、以下のハイライトされたコードを追加してコールバックをアンバインドします:void USessionEssentialsOnlineSession_Starter::ClearOnlineDelegates()
{
// ...
GetSessionInt()->ClearOnUpdateSessionCompleteDelegates(this);
// ...
}
プロジェクトを再度コンパイルし、コンパイルエラーがないことを確認してください。
リソース
- このチュートリアルセクションで使用されているファイルは、Byte Wars Unreal GitHub リポジトリで入手できます。