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

SDK で Lobby を設定する

Last updated on April 7, 2026

概要

AccelByte Gaming Services (AGS) Lobby は、WebSocket プロトコルを使用して、ゲームとプレイヤー間の継続的な接続を提供します。WebSocket はサーバーとクライアント間の双方向通信を可能にすることで、信頼性の高いリアルタイムのデータ転送を確保します。AGS Lobby はゲームの主要ハブであるため、他の多くの AGS 機能と接続されています。

この記事では、AGS Game SDK を使用した Lobby の設定について説明します。

目標

この記事の目標は、AGS Game SDK を使用して以下を行う方法を示すことです:

  • AGS Lobby への接続。
  • 接続および切断イベントの処理。
  • ユーザープレゼンスの処理。
  • 通知のリスン。

前提条件

この記事の手順を完了するには、以下が必要です:

  • プレイヤーが AGS Lobby に到達する前に発生する認証フローへの理解。
  • AGS 管理者ポータルへのアクセス。
  • Unreal または Unity プロジェクトにインストールされた AGS Game SDK と、ゲームクライアントの以下の認証情報:
    • クライアント ID
    • クライアントシークレット

Lobby への接続

このセクションでは、ユーザーを Lobby に接続する方法を説明します。

ユーザーを Lobby に接続するには以下のコードを使用します:

auto ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();
auto LobbyApi = ApiClient->GetLobbyApi().Pin();
LobbyApi->Connect();

Lobby 接続を設定したら、プレゼンスパーティフレンズチャットなどの機能を追加できます。

Lobby からの切断

このセクションでは、ユーザーを Lobby サービスから切断する方法とベストプラクティスについて説明します。

ユーザーをログアウトする場合や、ゲームクライアントが終了またはクラッシュする場合にのみ切断してください。これらの場合は、以下のコードを使用します:

User user = AccelByteSDK.GetClientRegistry().GetApi().GetUser();
Lobby lobby = AccelByteSDK.GetClientRegistry().GetApi().GetLobby();

void Logout()
{
user.Logout(logoutResult =>
{
if (logoutResult.IsError)
{
// Handle logout error here
return;
}

lobby.Disconnect();
});
}

void OnApplicationQuit()
{
lobby.Disconnect();
}

接続および切断イベントの処理

注記
  1. トラブルシューティングの目的で、プレイヤーが自発的にゲームを終了するとき(メニューから、Alt+F4 を使用して、ゲームコンソールをオフにするなど)に切断関数を呼び出してください。予期しないシャットダウン(ゲームのクラッシュ、停電など)では関数を呼び出す必要はありません。

  2. 開発者環境で Disconnected コールバックのコードを調べることができます(例: https://prod.gamingservices.accelbyte.io/lobby/v1/messages)。

  3. SDK が Lobby に自動再接続するときに SetReconnectingDelegate がトリガーされます。

  4. 自動再接続がタイムアウトすると、ConnectionClosed が次のステータスコードでトリガーされます:

EWebsocketErrorTypes::DisconnectFromExternalReconnect (4042)
Reconnection total timeout limit reached

この機能は、Lobby サーバー接続の変更をゲームに通知します。SDK はすでに自動再接続メカニズムを提供していますが、自動再接続がタイムアウトした場合は手動で再接続する必要があります。

auto LobbyApi = ApiClient->GetLobbyApi().Pin();

LobbyApi->Connect();
LobbyApi->SetConnectSuccessDelegate(AccelByte::Api::Lobby::ConnectSuccess.CreateLambda([]()
{
// Do something when ConnectSuccessDelegate succeeds
}));
LobbyApi->SetConnectFailedDelegate(AccelByte::Api::Lobby::ConnectError.CreateLambda([]()
{
// Do something when ConnectFailedDelegate succeeds
}));
LobbyApi->SetConnectionClosedDelegate(AccelByte::Api::Lobby::ConnectionClosed.CreateLambda([]()
{
// Do something when ConnectionClosedDelegate succeeds
}));

プレゼンス

AGS プレゼンスは AGS ソーシャルの一部です。プレゼンスはユーザープレゼンスのステータス(アベイラビリティアクティビティ)を処理します。

アベイラビリティステータスは、オンラインになったときにユーザーがどのように見られたいかです(例: オンライン、オフライン、退席中など)。アクティビティステータスは、ユーザーの現在のアクティビティを表示するために使用できる任意の文字列値です(例: アイドル、ゲームをプレイ中、ロビー内、マッチメイキング中、マッチ中など)。AGS プレゼンスはオンラインのフレンドをリストアップし、プレゼンスステータスの変化を取得するためのフィルターとして AGS フレンズに依存します。

AGS プレゼンスフロー:

  1. ユーザーが Lobby との接続を初期化した後、すべてのフレンドのプレゼンスステータスを取得します。
  2. ユーザーがアクティビティを変更するたびにユーザーステータスを設定します。
  3. フレンドのプレゼンスステータスの更新をリスンし、フレンドのプレゼンスステータスを更新します。
  4. ユーザーが Lobby サーバーから切断されると、ユーザーのアベイラビリティは自動的に 0 にリセットされます。
  5. ユーザーが Lobby サーバーから切断された場合、ユーザーのアクティビティは保持されます。

アベイラビリティは列挙型の整数として表されます:

  • 0 : オフライン
  • 1 : 利用可能
  • 2 : ビジー
  • 3 : 非表示

アクティビティは任意の文字列として設定できます。例:

  • "Playing Survival"
  • "In Lobby"
  • "In Match"

ステータスの作成とフレンドのステータスの表示

プレイヤーのプレゼンスは、ゲーム、プレイヤーポータル、またはランチャーによって設定できます。これにより、プレイヤーのフレンドがプレイヤーがオンラインであることや何をしているかを確認できます。

auto LobbyApi = ApiClient->GetLobbyApi().Pin();

// View Changed Friend's Status
LobbyApi->SetUserPresenceNotifDelegate(THandler<FAccelByteModelsUsersPresenceNotice>::CreateLambda([](const FAccelByteModelsUsersPresenceNotice Result)
{
UE_LOG(LogTemp, Log, TEXT("Friend %s, Activity: %s | Availability: %s "), Result.UserID, Result.Activity, Result.Availability);
}
));

// Create or change a status
LobbyApi->SetUserPresenceResponseDelegate(Api::Lobby::FSetUserPresenceResponse::CreateLambda([](FAccelByteModelsSetOnlineUsersResponse result)
{
UE_LOG(LogTemp, Log, TEXT("User Status Changed!"));
}));

FString UserActivity = TEXT("Playing Game");
LobbyApi->SendSetPresenceStatus(Availability::Busy, UserActivity);

フレンドのステータスリストを取得する

プレイヤーはすべてのフレンドのステータスのリストを見ることもできます。

auto ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();
LobbyApi->SetGetAllUserPresenceResponseDelegate(Api::Lobby::FGetAllFriendsStatusResponse::CreateLambda([](FAccelByteModelsGetOnlineUsersResponse result)
{
for(int i = 0; i < Result.friendId.Num(); i++)
{
UE_LOG(LogTemp, Log, TEXT("Friend %s, Activity: %s | Availability: %s "), Result.friendId[i], Result.Activity[i], Result.Availability[i]);
}
}));
LobbyApi->SendGetOnlineUsersRequest();
注記

すべてのフレンドのステータスが返されない場合があります。フレンドのステータスが見つからない場合は、ゲームの実装でアベイラビリティをオフラインに設定する必要があります。

一括フレンドプレゼンス

すべてのプレイヤーのプレゼンス情報を一括で取得できます。これにより、プレゼンスステータス(オンライン、ビジー、非表示、オフラインなど)に基づいてユーザー数もカウントされます。countOnly パラメーターを true に設定して、ユーザーのアカウントデータを取得せずにカウントのみを取得することもできます。

TArray<FString> UserIds = {FString("12345abcd"), FString("abcd12345")};
bool CountOnly = true;

auto ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();

LobbyApi->Connect();
LobbyApi->BulkGetUserPresence(UserIds, THandler<FAccelByteModelsBulkUserStatusNotif>::CreateLambda([](const FAccelByteModelsBulkUserStatusNotif& Result)
{
// Do something if BulkGetUserPresence succeeds
}), FErrorHandler::CreateLambda([](int32 ErrorCode, const FString& ErrorMessage)
{
// Do something if BulkGetUserPresence has an error
UE_LOG(LogTemp, Log, TEXT("Error BulkGetUserPresence, Error Code: %d Error Message: %s"), ErrorCode, *ErrorMessage);
}), CountOnly);

通知

通知に関するいくつかのタスクがあります:

フリーフォーム通知の送信

  1. 通知 REST API エンドポイントを呼び出して任意のテキスト通知メッセージを送信します。
  2. 通知クライアントが新しい通知をリスンします。

テンプレート化された通知の送信

  1. 管理者がテンプレートスラッグ(識別子)、コンテキスト(置き換えるテンプレートの値)、テンプレート言語を使用して通知テンプレートを作成します。
  2. 管理者がテンプレートを公開します。
  3. テンプレートスラッグ、コンテキスト、言語がサービスコンシューマー(管理者ユーザーまたは他のサービス)に送信されます。
  4. サービスコンシューマーがテンプレートスラッグ、言語、テンプレートコンテキストの値を指定して通知 REST API エンドポイントを呼び出します。
  5. 通知クライアントが新しい通知をリスンします。

非同期通知の送信

  1. フリーフォームまたはテンプレート化された通知のワークフローに従います。
  2. REST API エンドポイントを呼び出すときに、クエリパラメーターを非同期として指定します。
  3. プレイヤーがオンラインの場合、メッセージは即座に送信されます。
  4. プレイヤーがオフラインの場合、メッセージは保存されます。

保存された通知の取得

  1. プレイヤーが Lobby サーバーに接続します。
  2. 通知はプレイヤーに送信できます。

ユーザーに送信されるすべての通知は一般的な形式です。クライアントは、通知に設定されたトピックに基づいて通知の配置場所を決定できます。たとえば、ゲーム更新の通知はポップアップとして表示でき、ゲームサーバーの通知はシステムチャットボックスに表示できます。

WebSocket 通知形式

通知メッセージ:

type: messageNotif
topic: updateNotification
from: system
to: user123
payload: message content 123
sentAt: 2018-11-25T23:45:05Z

同期通知の取得

SDK を使用して同期通知を取得するには、通知デリゲートを追加する必要があります。

const auto NotificationDelegate = AccelByte::Api::Lobby::FMessageNotif::CreateLambda([](const FAccelByteModelsNotificationMessage& Result)
{
UE_LOG(LogTemp, Log, TEXT("There is an incoming notification."));
UE_LOG(LogTemp, Log, TEXT("From: %s \nTo: %s\nTopic: %s"), *Result.From, *Result.To, *Result.Topic);
UE_LOG(LogTemp, Log, TEXT("Notification: %s"), *Result.Payload);
});

auto ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();

LobbyApi->SetMessageNotifDelegate(NotificationDelegate);
LobbyApi->Connect();

トピックで通知をフィルタリングすることもできます:

const auto NotificationDelegate = AccelByte::Api::Lobby::FMessageNotif::CreateLambda([](const FAccelByteModelsNotificationMessage& Result)
{
UE_LOG(LogTemp, Log, TEXT("There is an incoming notification."));
if(Result.Topic == "INGAME")
{
UE_LOG(LogTemp, Log, TEXT("Game notification: %s"), *result.Payload);
}
Else if(Result.Topic == "EVENT")
{
UE_LOG(LogTemp, Log, TEXT("Event notification: %s"), *result.Payload);
}
});