プレゼンスをクライアントSDKに統合する
注釈:本資料はAI技術を用いて翻訳されています。
概要
AccelByte Gaming Services (AGS) プレゼンスは、プレイヤーのプレゼンスステータスを設定および取得するために使用でき、他のプレイヤーが現在ゲーム内で何をしているかをユーザーベースに通知できます。これらのステータスを管理するには、AGS ロビー インターフェイスを使用してプレゼンス機能を呼び出し、WebSocketを通じて送信してステータスがリアルタイムで更新されるようにします。
各ゲームは独自であり、プレイヤーのオンラインステータス以上の情報を提供する必要がある場合があるため、AGSは設定および取得できる2つのパラメータを提供します:
-
可用性: 次のいずれかの状態に設定できます:オフライン、利用可能、取り込み中、退席中、非表示。プレイヤーがAGSロビーから切断すると、これは自動的にオフラインに更新されます。
-
アクティビティ: これはカスタマイズ可能で、ゲームプレイ中、ロビー内、マッチ中、メンバー募集中のパーティーなど、プレイヤーの現在の状態に関する独自または特定の詳細をゲームが提供できるようにします。
この記事では、プレゼンスをゲームに統合する方法について説明します。
前提条件
この記事の手順を完了するには、AGS ロビー をゲームに統合している必要があります。
Unreal Engineの場合、スニペットで使用される AccelByteOnlineSubsystemPtr を取得する手順は、このガイドに従って確認できます。
プレイヤーステータス取得フロー
AGSプレゼンスをゲームクライアントに統合する前に、プレイヤーステータスを設定および取得するための一般的なフローを理解してください:
- ゲーム開始時に、AGSロビーに接続し、プレイヤーのステータスを利用可能に設定します。
- プレイヤーのフレンドのステータスを取得して表示できるようにします。
- フレンドステータスの変更を監視するように登録し、更新できるようにします。
- プレイヤーがゲームプレイアクティビティを変更する際は、それに応じてステータスを設定してください。
プレイヤーステータスの設定
ゲームクライアントからプレイヤーのプレゼンスを設定するには、更新関数を呼び出し、プレイヤーに設定したい可用性とアクティビティの状態の両方をパラメータとして提供します。
- Unreal Engine
- Unity
Availability Availability = Availability::Available;
FString Activity = FString("My New Activity");
auto ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();
auto LobbyApi = ApiClient->GetLobbyApi().Pin();
LobbyApi->Connect();
LobbyApi->SendSetPresenceStatus(Availability, Activity);
UserStatus status = UserStatus.Online;
string activity = "My New Activity";
AccelByteSDK.GetClientRegistry().GetApi().GetLobby().Connect();
AccelByteSDK.GetClientRegistry().GetApi().GetLobby().SetUserStatus(status, activity, result =>
{
if (result.IsError)
{
// Do something if SetUserStatus has an error
Debug.Log($"Error SetUserStatus, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
}
else
{
// Do something if SetUserStatus has succeeded
}
});
フレンドステータスの変更を監視する
フレンドのステータスに関するリアルタイム更新を受信するには、通知を監視するように登録する必要があります。フレンドのステータスが変更されると、フレンドがオンラインになったことをプレイヤーに知らせるなど、ゲームクライアントを通じてプレイヤーに変更を通知できます。
- Unreal Engine
- Unity
auto ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();
auto LobbyApi = ApiClient->GetLobbyApi().Pin();
LobbyApi->Connect();
LobbyApi->SetUserPresenceNotifDelegate(AccelByte::Api::Lobby::FFriendStatusNotif::CreateLambda([](const FAccelByteModelsUsersPresenceNotice& Result)
{
// Do something if UserPresenceNotifDelegate has succeeded
}));
AccelByteSDK.GetClientRegistry().GetApi().GetLobby().Connect();
AccelByteSDK.GetClientRegistry().GetApi().GetLobby().FriendsStatusChanged += result =>
{
if (result.IsError)
{
// Do something if FriendsStatusChanged has an error
Debug.Log($"Error FriendsStatusChanged, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
}
else
{
// Do something if FriendsStatusChanged has succeeded
}
};
フレンドリストのステータスを取得する
プレイヤーにフレンドリストを表示する際にプレゼンスステータスを提供するには、この関数を呼び出してプレイヤーのすべてのフレンドのステータスを取得できます:
- Unreal Engine
- Unity
auto ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();
auto LobbyApi = ApiClient->GetLobbyApi().Pin();
LobbyApi->Connect();
LobbyApi->SetGetOnlineFriendsPresenceResponseDelegate(AccelByte::Api::Lobby::FGetAllFriendsStatusResponse::CreateLambda([](const FAccelByteModelsGetOnlineUsersResponse& Result)
{
if (Result.Code == "0")
{
// Do something if GetOnlineFriendsPresenceResponseDelegate has succeeded
}
else
{
// Do something if GetOnlineFriendsPresenceResponseDelegate has an error
}
}));
LobbyApi->SendGetOnlineFriendPresenceRequest();
AccelByteSDK.GetClientRegistry().GetApi().GetLobby().Connect();
AccelByteSDK.GetClientRegistry().GetApi().GetLobby().ListFriendsStatus(result =>
{
if (result.IsError)
{
// Do something if ListFriendsStatus has an error
Debug.Log($"Error ListFriendsStatus, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
}
else
{
// Do something if ListFriendsStatus has succeeded
}
});
プレイヤーステータスを一括取得する
フレンドではないプレイヤー間のプレゼンスステータスを提供する必要がある場合は、ユーザーIDのリストを渡して以下の関数を使用できます。これは、フレンドではないプレイヤーがグループやレイドチームで一緒にいて、互いに調整する必要がある場合などに便利です。この関数は、呼び出し時に countOnly パラメータを true に設定することで、特定のステータスのプレイヤー数を提供するためにも使用できます。
- Unreal Engine
- Unity
TArray<FString> UserIds = {FString("12345abcd"), FString("abcd12345")};
bool CountOnly = true;
auto ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();
auto LobbyApi = ApiClient->GetLobbyApi().Pin();
LobbyApi->Connect();
LobbyApi->BulkGetUserPresence(UserIds, THandler<FAccelByteModelsBulkUserStatusNotif>::CreateLambda([](const FAccelByteModelsBulkUserStatusNotif& Result)
{
// Do something if BulkGetUserPresence has succeeded
}), 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);
string[] userIds = { "12345abcd", "abcd12345" };
bool countOnly = true;
AccelByteSDK.GetClientRegistry().GetApi().GetLobby().Connect();
AccelByteSDK.GetClientRegistry().GetApi().GetLobby().BulkGetUserPresence(userIds, result =>
{
if (result.IsError)
{
// Do something if BulkGetUserPresence has an error
Debug.Log($"Error BulkGetUserPresence, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
}
else
{
// Do something if BulkGetUserPresence has succeeded
}
}, countOnly);
以下は、v2 バージョンを使用した一括ユーザープレゼンスの例です。これは、リクエストボディ内にユーザーIDを追加するためにpostエンドポイントを利用します。この方法は、バッチあたり最大100ユーザーのクエリをサポートします。
この機能はAGSバージョン3.76でのみ利用可能です。
- Unreal Engine
- Unity
TArray<FString> UserIds = {FString("12345abcd"), FString("abcd12345")};
bool CountOnly = true;
auto ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();
auto LobbyApi = ApiClient->GetLobbyApi().Pin();
LobbyApi->Connect();
LobbyApi->BulkGetUserPresenceV2(UserIds, THandler<FAccelByteModelsBulkUserStatusNotif>::CreateLambda([](const FAccelByteModelsBulkUserStatusNotif& Result)
{
// Do something if BulkGetUserPresence succeeds
}), FErrorHandler::CreateLambda([](int32 ErrorCode, const FString& ErrorMessage)
{
// Do something if BulkGetUserPresence fails
UE_LOG(LogTemp, Log, TEXT("Error BulkGetUserPresence, Error Code: %d Error Message: %s"), ErrorCode, *ErrorMessage);
}), CountOnly);
この機能はUnityではまだ利用できません。