メインコンテンツまでスキップ

ゲームセッションを統合する

Last updated on February 4, 2026

注釈:本資料はAI技術を用いて翻訳されています。

概要

AccelByte Gaming Services (AGS) Session を通じて、AGS Game SDK または Extend SDK を使用してゲームセッションを管理できます。この記事では、ゲームセッションの統合手順を説明し、以下のコードスニペットを提供します。

  • ゲームセッションの作成
  • ゲームセッションリストのクエリ
  • 現在のユーザーのゲームセッションの取得
  • ゲームセッションの詳細の取得
  • ゲームセッションの更新
  • ゲームセッションの削除
  • プレイヤーのゲームセッションへの招待
  • ゲームセッションへの参加
  • ゲームセッション招待のキャンセル
  • ゲームセッション招待の拒否
  • ゲームセッションからの退出
  • ゲームセッションリーダーの昇格
  • プレイヤーのゲームセッションからのキック
  • ゲームセッション通知のリスニング
  • ゲームセッションの更新
  • 切断後の再接続時のプレイヤーセッションの処理

ゲームセッションの作成

作成リクエストに基づいて新しいゲームセッションを作成します。

FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();

FAccelByteModelsV2GameSessionCreateRequest Request;
Request.ConfigurationName = ConfigurationName; // MANDATORY
Request.Joinability = EAccelByteV2SessionJoinability::INVITE_ONLY; // Optional
Request.Type = EAccelByteV2SessionConfigurationServerType::DS; // Optional
Request.ClientVersion = GameServerVersion; // Optional
Request.ServerName = LocalServerName; // Optional
Request.Deployment = Deployment; // Optional
Request.RequestedRegions = {"us-west-1", "us-west2"}; // Optional

// Optional
TArray<FString> TeamA = {TeamAUserId1, TeamAUserId2};
TArray<FString> TeamB = {TeamBUserId1, TeamBUserId2};
TArray<FAccelByteModelsV2GameSessionTeam> Teams;
Teams.Add({TeamA});
Request.Teams = Teams;

// Optional
Request.Attributes.JsonObject = MakeShared<FJsonObject>();
Request.Attributes.JsonObject->SetStringField("PartyAttribute", "Attribute1");

Request.MaxPlayers = 10; // Optional
Request.MinPlayers = 1; // Optional
Request.InactiveTimeout = 30; // Optional
Request.InviteTimeout = 86400; // Optional


ApiClient->Session.CreateGameSession(Request,
THandler<FAccelByteModelsV2GameSession>::CreateLambda(
[&](const FAccelByteModelsV2GameSession& Result)
{
// Do something when operation is successful
}),
FErrorHandler::CreateLambda(
[&](int32 ErrorCode, const FString& ErrorMessage)
{
// Do something when operation fails or has an error
}));

ゲームセッションリストのクエリ

リクエストと同じ属性を持つすべてのゲームセッションをクエリします。 サポートされている操作:

  1. EAccelByteV2SessionQueryComparisonOp::EQUAL (equalsと同様の特定の値とのクエリ比較)
  2. EAccelByteV2SessionQueryComparisonOp::NOT_EQUAL (特定の値とのnotEqualsクエリ)
  3. EAccelByteV2SessionQueryComparisonOp::CONTAINS (inと同様のクエリ)
  4. EAccelByteV2SessionQueryComparisonOp::NOT_CONTAINS (notInと同様のクエリ)
  5. EAccelByteV2SessionQueryComparisonOp::GREATER_THAN (greaterThanと同様のクエリ)
  6. EAccelByteV2SessionQueryComparisonOp::GREATER_THAN_EQUAL (greaterThanEqualsと同様のクエリ)
  7. EAccelByteV2SessionQueryComparisonOp::LESS_THAN (lessThanと同様のクエリ)
  8. EAccelByteV2SessionQueryComparisonOp::LESS_THAN_EQUAL (lessThanEqualsと同様のクエリ)

⚠️ 警告: パフォーマンスに関する考慮事項

クエリパフォーマンスへの影響:

  • 複数の属性を同時にクエリすると、クエリパフォーマンスと応答時間に大きな影響を与えます
  • 追加のクエリ条件ごとに計算の複雑さとデータベース負荷が増加します
  • 複数のNOT_EQUALNOT_CONTAINS、または範囲操作を含む複雑なクエリは特にリソース集約的です

ベストプラクティス:

  • NOT_EQUAL操作を避ける - これらはフルテーブルスキャンを必要とし、大規模なデータセットには最適化されていません
  • EQUAL操作を優先する - これらは最適なパフォーマンスのために等値、ソート、範囲(ESR)インデックス原則を活用します
  • クエリの複雑さを制限する - フィルタリングのニーズに必要な最小限の属性数を使用します

複雑なクエリ要件やパフォーマンス最適化戦略については、AccelByteサポートに相談して、特定のゲームフローとスケール要件に合わせたベストプラクティスの推奨事項を入手してください。

FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();

// query with specific value `equals`
FAccelByteModelsV2GameSessionQuery Query;
Query.AddParam("map", EAccelByteV2SessionQueryComparisonOp::EQUAL, "SampleMap");

// query with `in`
TArray<FString> PossibleValues;
PossibleValues.Add(TEXT("solo"));
PossibleValues.Add(TEXT("adventure"));
Query.AddParam("custom_game_mode", EAccelByteV2SessionQueryComparisonOp::CONTAINS, PossibleValues);

// query with range value `greaterThanEquals`
constexpr int32 QueriedGreater = 2;
FAccelByteModelsV2GameSessionQuery Query;
Query.AddParam("level", EAccelByteV2SessionQueryComparisonOp::LESS_THAN_EQUAL, QueriedGreater);

int64 Offset = 0;
int64 Limit = 20;
ApiClient->Session.QueryGameSessions(
Query,
THandler<FAccelByteModelsV2PaginatedGameSessionQueryResult>::CreateLambda(
[&](const FAccelByteModelsV2PaginatedGameSessionQueryResult& Result)
{
// Do something when the operation succeeds
}),
FErrorHandler::CreateLambda(
[&](int32 ErrorCode, const FString& ErrorMessage)
{
// Do something when the operation fails or has an error
}),
Offset,
Limit);

現在のユーザーのゲームセッションの取得

ユーザーのゲームセッションのリストとその情報を取得します。

FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();

ApiClient->Session.GetMyGameSessions(
THandler<FAccelByteModelsV2PaginatedGameSessionQueryResult>::CreateLambda(
[&](const FAccelByteModelsV2PaginatedGameSessionQueryResult& Result)
{
// Do something when the operation succeeds
}),
FErrorHandler::CreateLambda(
[&](int32 ErrorCode, const FString& ErrorMessage)
{
// Do something when the operation fails or has an error
}));

ゲームセッションの詳細の取得

ゲームセッションのIDを指定して、特定のゲームセッションの詳細を取得します。

FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();

ApiClient->Session.GetGameSessionDetails( SessionId,
THandler<FAccelByteModelsV2GameSession>::CreateLambda(
[&](const FAccelByteModelsV2GameSession& Result)
{
// Do something when the operation succeeds
}),
FErrorHandler::CreateLambda(
[&](int32 ErrorCode, const FString& ErrorMessage)
{
// Do something when the operation fails or has an error
}));

ゲームセッションの更新

特定のゲームセッションからゲームセッションのデータを更新します。

FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();

FAccelByteModelsV2GameSessionUpdateRequest Request;
Request.Version = PartyDataVersion; // Mandatory, must be the same version as current data in the backend
Request.Joinability = EAccelByteV2SessionJoinability::INVITE_ONLY; // Optional
Request.Attributes.JsonObject = MakeShared<FJsonObject>(); // Optional
Request.Attributes.JsonObject->SetStringField("AttributeName", "Attribute1"); // Optional
Request.MaxPlayers = 10; // Optional
Request.MinPlayers = 1; // Optional
Request.InactiveTimeout = 30; // Optional
Request.InviteTimeout = 86400; // Optional

ApiClient->Session.UpdateGameSession(GameSessionID, Request, THandler<FAccelByteModelsV2GameSession>::CreateLambda(
[&](const FAccelByteModelsV2GameSession& Result)
{
// Do something when the operation succeeds
}),
FErrorHandler::CreateLambda([&](int32 ErrorCode, const FString& Message)
{
// Do something when operation fails or has an error
}));

ゲームセッションの削除

既存のゲームセッションを削除します。

FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();
ApiClient->Session.DeleteGameSession(SessionId, FVoidHandler::CreateLambda([]
{
// Successfully deleted game session
}),
FErrorHandler::CreateLambda([](int32 ErrorCode, const FString& Message)
{
// Error deleting game session
}));

プレイヤーのゲームセッションへの招待

ユーザーIDを指定して、他のプレイヤーをゲームセッションに招待します。

FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();

ApiClient->Session.SendGameSessionInvite(SessionId, UserIdToInvite, FVoidHandler::CreateLambda(
[&]
{
// Do something when the operation succeeds
}),
FErrorHandler::CreateLambda([&](int32 ErrorCode, const FString& Message)
{
// Do something when the operation fails or has an error
}));

送信したゲームセッション招待のキャンセル

プレイヤーは送信した招待をキャンセルできます。招待された側と招待した側は、招待がキャンセルされたという通知を受け取ります。招待された側は、キャンセル後に以前の招待を受け入れることはできません。

// Invitee and inviter listen for session invite canceled notification.
auto OnSessionInviteCanceledDelegate = SessionInterface->AddOnSessionInviteCanceledDelegate_Handle(
FOnSessionInviteCanceledDelegate::CreateLambda([](const FString& SessionID) // ID of canceled game session.
{
// Received invitation canceled.
}));

// Game session leader (inviter) cancel invitation.
FName GameSessionName = NAME_GameSession;
auto OnCancelSessionInviteCompleteDelegate = SessionInterface->AddOnCancelSessionInviteCompleteDelegate_Handle(FOnCancelSessionInviteCompleteDelegate::CreateLambda(
[&](const FUniqueNetId& LocalUserId, FName SessionName, const FUniqueNetId& Invitee, const FOnlineError& ErrorInfo)
{
bool bInvitationCanceled = ErrorInfo.bSucceeded;
// Cancel session invitation complete.
}));

SessionInterface->CancelSessionInvite(PlayerIndex, GameSessionName, *InviteeUniqueNetId);

ゲームセッションへの参加

セッションIDを指定して、既存のゲームセッションに参加します。

FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();

ApiClient->Session.JoinGameSession(SessionId, THandler<FAccelByteModelsV2GameSession>::CreateLambda(
[&](const FAccelByteModelsV2GameSession& Result)
{
// Do something when the operation succeeds
}),
FErrorHandler::CreateLambda([&](int32 ErrorCode, const FString& Message)
{
// Do something when operation fails or has an error
}));

コードによるセッション参加

セッションでコードが有効になっている場合、プレイヤーはセッションコードを使用してセッションに参加できます。これはパーティーセッションとゲームセッションの両方に適用されます。ユーザーがコードでセッションに参加すると、AGSは招待チェックとセッション参加可能性をバイパスします。セッションタイプは次のとおりです。

  • OPEN
  • INVITE ONLY
  • Friends Only (Friends of members、Friends of leader、Friends of friends)

コード経由で参加するユーザーは、既に招待されているかどうかに関係なく、上記の参加可能性を持つセッションに入ることができます。

FString SessionCode = TEXT("yourGameSessionCode");

const FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();
ApiClient->Session.JoinGameSessionByCode(
SessionCode,
THandler<FAccelByteModelsV2GameSession>::CreateLambda([&](const FAccelByteModelsV2GameSession& Response)
{
// Do something if JoinGameSessionByCode succeeded
})
, FErrorHandler::CreateLambda([&bIsDone](const int32 ErrorCode, const FString& ErrorMessage)
{
// Do something if JoinGameSessionByCode failed

}));

ハングセッションの回避

ハングセッションは、ゲームクライアントがプレイヤーがセッションから退出したと予想しているのに、プレイヤーがまだゲームセッションのアクティブメンバーである場合に発生します。この状況は、ゲームがクラッシュしたり強制終了されたりしたときに、セッションから正常に退出しない場合に発生する可能性があります。

これは、バックエンドとゲームクライアント側の両方からのデータの正確性に影響を与える可能性があります。バックエンド側にハングセッションデータが多すぎると、予期しない動作が発生する可能性があります。例えば:

  • ゲーム管理者がプレイヤーのアクティブセッション数を一度に1つのセッションのみに設定します。
  • バックエンドにハングセッションデータがある場合、プレイヤーがまだ古いセッションに登録されているため、新しいセッションに参加しようとするとエラーが発生します。

AccelByteは、新しいセッションに参加する際にプレイヤーのアクティブセッションを取得し、最初に退出することをお勧めします。これはセッションブラウザフローで役立ちます。

実装例については、Byte Warsのサブシステムの実装 - セッション入門記事を参照してください。

プレイヤーのアクティビティを一度に1つのゲームセッションに制限するには、セッションで自動ゲームセッション退出オプションを有効にします。有効にすると、新しいゲームセッションに参加する際に、アクティブなゲームセッションからプレイヤーを自動的にキックアウトします。これにより、ゲームセッションがパーティーセッションのように動作し、プレイヤーが一度に1つのアクティブなゲームセッションにのみ参加できるようになります。詳細については、セッションテンプレートの設定記事を参照してください。

ゲームセッション招待の拒否

他のプレイヤーのゲームセッションへの招待を拒否します。

FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();

ApiClient->Session.RejectGameSessionInvite(GameSessionID, FVoidHandler::CreateLambda(
[&]
{
// Do something when the operation succeeds
}),
FErrorHandler::CreateLambda([&](int32 ErrorCode, const FString& Message)
{
// Do something when operation fails or has an error
}));

ゲームセッションからの退出

ゲームセッションIDを指定して、現在参加しているゲームセッションから退出します。

FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();

ApiClient->Session.LeaveGameSession(SessionId, FVoidHandler::CreateLambda(
[&]
{
// Do something when the operation succeeds
}),
FErrorHandler::CreateLambda([&](int32 ErrorCode, const FString& Message)
{
// Do something when operation fails or has an error
}));

ゲームセッションリーダーの昇格

ゲームセッションリーダーは、別のメンバーをゲームセッションリーダーに昇格させることができます。ゲームセッションリーダーは1人だけなので、以前のリーダーは通常のメンバーになります。

注記

Unrealのコードスニペットは近日追加予定です。

プレイヤーのゲームセッションからのキック

ゲームセッションリーダーまたは専用サーバーは、ゲームセッションからメンバーをキックできます。

const FString GameSessionID = TEXT("game-session-id");
const FString PlayerID = TEXT("player-id");

// Game session leader kick a player from a game session
FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();

ApiClient->Session.KickUserFromGameSession(GameSessionID, PlayerID
, FVoidHandler::CreateLambda([]()
{
// Do something when the operation succeeds
}), FErrorHandler::CreateLambda([](int32 ErrorCode, const FString& Message)
{
// Do something when operation fails or has an error
}));

// Dedicated server kicks a player from a game session
FServerApiClientPtr ServerApiClient = AccelByteOnlineSubsystemPtr->GetServerApiClient();
ServerApiClient->ServerSession.KickUserFromGameSession(GameSessionID, PlayerID
, FVoidHandler::CreateLambda([]()
{
// Do something when the operation succeeds
}), FErrorHandler::CreateLambda([](int32 ErrorCode, const FString& Message)
{
// Do something when operation fails or has an error
}));

ゲームセッション通知のリスニング

ゲームセッションからさまざまな更新を受信するためにリッスンできるゲームセッション通知がいくつかあります。これはWebSocket接続を使用して、通知がリアルタイムで受信されることを保証します。

FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();

ApiClient->Lobby.SetV2GameSessionInvitedNotifDelegate(Api::Lobby::FV2GameSessionInvitedNotif::CreateLambda(
[&](const FAccelByteModelsV2GameSessionUserInvitedEvent& Notif)
{
// Do something when a notification is received
}));

ApiClient->Lobby.SetV2GameSessionMembersChangedNotifDelegate(Api::Lobby::FV2GameSessionMembersChangedNotif::CreateLambda(
[&](const FAccelByteModelsV2GameSessionMembersChangedEvent& Notif)
{
// Do something when a notification is received
}));

ApiClient->Lobby.SetV2GameSessionJoinedNotifDelegate(Api::Lobby::FV2GameSessionJoinedNotif::CreateLambda(
[&](const FAccelByteModelsV2GameSessionUserJoinedEvent& Notif)
{
// Do something when a notification is received
}));

ApiClient->Lobby.SetV2GameSessionRejectedNotifDelegate(Api::Lobby::FV2GameSessionRejectedNotif::CreateLambda(
[&](const FAccelByteModelsV2GameSessionUserRejectedEvent& Notif)
{
// Do something when a notification is received
}));

ApiClient->Lobby.SetV2GameSessionKickedNotifDelegate(Api::Lobby::FV2GameSessionKickedNotif::CreateLambda(
[&](const FAccelByteModelsV2GameSessionUserKickedEvent& Notif)
{
// Do something when a notification is received
}));

ApiClient->Lobby.SetV2GameSessionUpdatedNotifDelegate(Api::Lobby::FV2GameSessionUpdatedNotif::CreateLambda(
[&](const FAccelByteModelsV2GameSession& Notif)
{
// Do something when a notification is received
}));

ApiClient->Lobby.SetV2DSStatusChangedNotifDelegate(Api::Lobby::FV2DSStatusChangedNotif::CreateLambda(
[&](const FAccelByteModelsV2DSStatusChangedNotif& Notif)
{
// Do something when a notification is received
}));

ゲームセッションの更新

Refresh Sessionメソッドを利用して、ゲームセッションをバックエンドと同期するために更新できます。提供されたSessionNameパラメータは、NAME_GameSessionに対応する場合があります。

SessionInterface->RefreshSession(SessionName, FOnRefreshSessionComplete::CreateLambda([]()
{
// On refresh session complete
}));

アクティブセッションの更新

問題を防ぎ、バックエンドとの適切な同期を確保するために、次の関数を使用して、クライアントでローカルにキャッシュされているすべてのアクティブセッションを更新します。

SessionInterface->RefreshActiveSessions(FOnRefreshActiveSessionsComplete::CreateLambda(
[&](bool bWasSuccessful)
{
// On refresh active sessions complete
}));

切断後の再接続時のプレイヤーセッションの処理

プレイヤーの接続が中断され、セッションからプレイヤーが削除される可能性があるシナリオがあります。セッションからの削除は、ゲームセッションの作成時にセッションテンプレートによって決定され、InactiveTimeout期間に基づいています。

したがって、この特定のプレイヤーに対処し、接続が復元された後のセッションの最新の状態を処理する必要があります。

AGS Unreal Engine Online Subsystem (AB OSS)は、接続確立後にセッションの状態を自動的に更新します。 開発者は、このデリゲートをリッスンして、削除されたセッションを知ることができます。

const IOnlineSubsystem* Subsystem = Online::GetSubsystem(GetWorld());
if (!ensure(Subsystem != nullptr))
{
return;
}

const FOnlineSessionAccelBytePtr SessionInterface = StaticCastSharedPtr<FOnlineSessionV2AccelByte>(Subsystem->GetSessionInterface());
if (!ensure(SessionInterface.IsValid()))
{
return;
}

SessionInterface->AddAccelByteOnReconnectedRefreshSessionDelegate_Handle(
LocalUserNum,
FAccelByteOnReconnectedRefreshSessionDelegate::CreateLambda(
[&](int32 LocalUserNum, bool bWasSuccess, const TArray<FName>& RemovedSessionNames) {
// do something when local session data updated after reconnected
...
}));