複数のレジストリを実装する
注釈:本資料はAI技術を用いて翻訳されています。
AGS Unreal Engine SDK の複数のレジストリは AccelByte Instance にラップされました!
AccelByte OnlineSubsytem は影響を受けません。
[移行ガイド] を参照してください。
はじめに
複数のレジストリは、AccelByte Gaming Services (AGS) の同じゲームインスタンスに複数のローカルユーザーがログインすることをサポートするために設計された機能です。複数のレジストリを持つことで、ゲーム開発者はローカルマルチプレイヤーをサポートできるゲームを作成できます。ゲームコントローラーにリンクされたアカウントに基づいて、各プレイヤーのプレイヤー情報と進行状況を独立して保存します。
複数のレジストリは、ログインしたプレイヤー情報を保存し、AGS API を呼び出す際にプレイヤーとして機能する API クライアントのコンテナです。
現在の SDK には、プレイヤーを表すためにシングルトンクラスを使用しているため、同じゲームインスタンス内で一度に 1 つのアカウントしかログインできないという制限があります。これらの制限を克服するために、プレイヤーを表す新しいクラス ApiClient を作成しました。これは同じ目的を果たし、AGS API にアクセスするための同じエントリポイントを使用します。ゲーム開発者はこの新しいクラスを使用する必要があり、複数のレジストリがこのクラスを維持します。
ApiClient インフラストラクチャには次の利点があります:
- シングルトンと静的クラスの使用を削減します。
- 開発者が管理しやすく、
ApiClientインスタンスを簡単に作成および削除できます。 ApiClientがカスタム API クラスを作成するためのエントリポイントとして使用されるため、より拡張可能です。
ApiClient クラスを実装した後、API 呼び出しは以前の SDK と同様の方法で動作します。これらの SDK の変更は、ゲームサーバーの実装にも影響します(以前はクライアントとサーバーの実装が混在していました)。そのため、ゲームサーバー関連の API の管理に焦点を当てた ServerApiClient という新しいクラスが作成されました。
前提条件
-
使用しているゲームエンジンのプラグインとモジュールをインストールしていること。
-
注記
Unreal Engine で AGS Online Subsystem (OSS) を使用する場合は、次の追加プラグインが必要です:
-
ゲームクライアント SDK を設定していること。
クライアント SDK を使用した複数のレジストリの実装
- 複数のレジストリを実装する前に、クラスの先頭に次のライブラリを含めます。
- AGS Unreal Engine SDK
- UnrealEngine AccelByte OSS
- Unity
AGS Unreal Engine SDK 移行 [ガイド].
非推奨。移行 [ガイド] を参照してください。
#include "Core/AccelByteMultiRegistry.h"
#include "OnlineSubsystem.h"
#include "OnlineSubsystemUtils.h"
using AccelByte.Api;
using AccelByte.Core;
ApiClient はゲーム内のプレイヤーを表し、バックエンドサービスへのリクエストを作成および送信するために必要な追加の API を保持します。
GetApiClient()を呼び出すことで各プレイヤーを分離できるように、各プレイヤーに一意のキーを使用してこのクラスで各プレイヤーを定義します。
- AGS Unreal Engine SDK
- UnrealEngine AccelByte OSS
- Unity
//⚠️ MultiRegistry を使用して ApiClient を取得する非推奨のメソッド
//// ユーザー A を定義
//FApiClientPtr ApiClientA = FMultiRegistry::GetApiClient(TEXT("0"));
//// ユーザー B を定義
//FApiClientPtr ApiClientB = FMultiRegistry::GetApiClient(TEXT("1"));
AccelByteInstance を使用して ApiClient を取得する最新のメソッド
// ユーザー A を定義
auto ApiClientA = AccelByteInstancePtr->GetApiClient(TEXT("0"));
// ユーザー B を定義
auto ApiClientB = AccelByteInstancePtr->GetApiClient(TEXT("1"));
// AccelByte の Online Subsystem を定義
const IOnlineSubsystem* OnlineSub = IOnlineSubsystem::Get(ACCELBYTE_SUBSYSTEM);
const IOnlineIdentityPtr IdentityInterface = OnlineSub->GetIdentityInterface();
// LocalUserNum のプレイヤー A を定義
const int PlayerNumA = 0; // ユーザーキー A
// LocalUserNum のプレイヤー B を定義
const int PlayerNumB = 1; // ユーザーキー B
// ユーザー A を定義
ApiClient apiClientA = AccelByteSDK.GetClientRegistry().GetApi("0");
// ユーザー B を定義
ApiClient apiClientA = AccelByteSDK.GetClientRegistry().GetApi("1");
- 一意のキーには、次のルールを適用します:
- Unreal Engine: FString を使用し、デフォルトは default です。
- Unreal (OSS): int を使用し、デフォルト値はありません。
- Unity: string を使用し、デフォルトは default です。
- 他のクラスで関数を呼び出す場合は、必ず同じキーを使用してください。
- これはゲートウェイであるため、各プレイヤーが AGS サービスにアクセスする前に認証する必要があります。これを行うには、AGS ログイン方法を設定します。以下の例の
usernameメソッドなど、AGS が許可する任意のログイン方法を使用できます:
- AGS Unreal Engine SDK
- UnrealEngine AccelByte OSS
- Unity
//⚠️ MultiRegistry を使用して ApiClient を取得する非推奨のメソッド
//FApiClientPtr ApiClientA = FMultiRegistry::GetApiClient(TEXT("0"));
//FApiClientPtr ApiClientB = FMultiRegistry::GetApiClient(TEXT("1"));
AccelByteInstance を使用して ApiClient を取得する最新のメソッド
auto ApiClientA = AccelByteInstancePtr->GetApiClient(TEXT("0"));
auto ApiClientB = AccelByteInstancePtr->GetApiClient(TEXT("1"));
// ユーザー名でログイン
ApiClientA->User.LoginWithUsername(
TEXT("user+a@example.com"),
TEXT("Password321"),
FVoidHandler::CreateWeakLambda(this, [this]()
{
UE_LOG(LogTemp, Log, TEXT("Login User A successful"));
}), FCustomErrorHandler::CreateWeakLambda(this, [](int32 ErrorCode, const FString& ErrorMessage, const FJsonObject& ErrorObject)
{
UE_LOG(LogTemp, Error, TEXT("Login User A Failed : %d, %s"), ErrorCode, *ErrorMessage);
}));
ApiClientB->User.LoginWithUsername(
TEXT("user+b@example.com"),
TEXT("Password321"),
FVoidHandler::CreateWeakLambda(this, [this]()
{
UE_LOG(LogTemp, Log, TEXT("Login User B successful"));
}), FCustomErrorHandler::CreateWeakLambda(this, [](int32 ErrorCode, const FString& ErrorMessage, const FJsonObject& ErrorObject)
{
UE_LOG(LogTemp, Error, TEXT("Login User B Failed : %d, %s"), ErrorCode, *ErrorMessage);
}));
// AccelByte の Online Subsystem を定義
const IOnlineSubsystem* OnlineSub = IOnlineSubsystem::Get(ACCELBYTE_SUBSYSTEM);
const IOnlineIdentityPtr IdentityInterface = OnlineSub->GetIdentityInterface();
// プレイヤー 1 を定義
const int PlayerNumA = 0; // ユーザーキー A
const int PlayerNumB = 1; // ユーザーキー B
FOnlineAccountCredentials AccountCredentialsA;
AccountCredentialsA.Type = "AccelByte";
AccountCredentialsA.Id = TEXT("user+a@example.com");
AccountCredentialsA.Token = TEXT("Password321");
FOnlineAccountCredentials AccountCredentialsB;
AccountCredentialsB.Type = "AccelByte";
AccountCredentialsB.Id = TEXT("user+b@example.com");
AccountCredentialsB.Token = TEXT("Password321");
// ログイン完了デリゲートを設定
IdentityInterface->AddOnLoginCompleteDelegate_Handle(PlayerNumA, FOnLoginCompleteDelegate::CreateWeakLambda(this, []
(int32 LocalUserNum, bool bWasSuccessful, const FUniqueNetId& UserId, const FString& Error)
{
UE_LOG(LogTemp, Log, TEXT("Login User A successful"));
}));
IdentityInterface->AddOnLoginCompleteDelegate_Handle(PlayerNumB, FOnLoginCompleteDelegate::CreateWeakLambda(this, []
(int32 LocalUserNum, bool bWasSuccessful, const FUniqueNetId& UserId, const FString& Error)
{
UE_LOG(LogTemp, Log, TEXT("Login User B successful"));
}));
// ユーザー名でログイン
IdentityInterface->Login(PlayerNumA, AccountCredentialsA);
IdentityInterface->Login(PlayerNumB, AccountCredentialsB);
OSS で複数のレジストリを実装する場合は、すべての関数呼び出しでユーザーキーとして LocalUserNum を使用し、各プレイヤーを区別するためにデリゲートを設定します。
// ユーザーを定義
ApiClient apiClientA = AccelByteSDK.GetClientRegistry().GetApi("0");
ApiClient apiClientB = AccelByteSDK.GetClientRegistry().GetApi("1");
User userA = apiClientA.GetUser();
User userB = apiClientB.GetUser();
// ユーザー名でログイン
userA.LoginWithUsernameV3(
"user+a@example.com",
"Password321",
(Result<TokenData, OAuthError> result) =>
{
if (!result.IsError)
{
// ログイン結果を表示
Debug.Log("Login player A successful");
}
else
{
Debug.Log("Login failed:" + result.IsError);
}
});
userB.LoginWithUsernameV3(
"user+b@example.com",
"Password321",
(Result<TokenData, OAuthError> result) =>
{
if (!result.IsError)
{
// ログイン結果を表示
Debug.Log("Login player B successful");
}
else
{
Debug.Log("Login failed:" + result.IsError);
}
});
次のステップ
シングルトンベースのレジストリから複数のレジストリにゲームを移行する方法を学びます。