複数のレジストリを実装する
注釈:本資料はAI技術を用いて翻訳されています。
AGS Unreal Engine SDK の複数のレジストリは AccelByte Instance の下にラップされています!
AccelByte OnlineSubsystem は影響を受けません。
[移行ガイド]を参照してください。
はじめに
複数のレジストリは、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 移行[ガイド]
DEPRECATED. Please refer to migration [guide].
#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
//⚠️ Deprecated method to obtain the ApiClient using MultiRegistry
//// Define User A
//FApiClientPtr ApiClientA = FMultiRegistry::GetApiClient(TEXT("0"));
//// Define User B
//FApiClientPtr ApiClientB = FMultiRegistry::GetApiClient(TEXT("1"));
The latest method to obtain the ApiClient using AccelByteInstance
// Define User A
auto ApiClientA = AccelByteInstancePtr->GetApiClient(TEXT("0"));
// Define User B
auto ApiClientB = AccelByteInstancePtr->GetApiClient(TEXT("1"));
// Define AccelByte's Online Subsystem
const IOnlineSubsystem* OnlineSub = IOnlineSubsystem::Get(ACCELBYTE_SUBSYSTEM);
const IOnlineIdentityPtr IdentityInterface = OnlineSub->GetIdentityInterface();
// Define Player A for LocalUserNum
const int PlayerNumA = 0; // User key A
// Define Player B for LocalUserNum
const int PlayerNumB = 1; // User key B
// Define User A
ApiClient apiClientA = AccelByteSDK.GetClientRegistry().GetApi("0");
// Define User B
ApiClient apiClientA = AccelByteSDK.GetClientRegistry().GetApi("1");
- 一意のキーには以下のルールを適用してください:
- Unreal Engine: デフォルトとして default を持つ FString を使用。
- Unreal (OSS): デフォルト値なしの int を使用。
- Unity: デフォルトとして default を持つ string を使用。
- 他のクラスで関数を呼び出す場合は、同じキーを使用してください。
- これはゲートウェイであるため、各プレイヤーが AGS サービスにアクセスする前に認証する必要があります。これを行うには、AGS ログインメソッドを設定します。以下の例の
usernameメソッドなど、AGS が許可するログインメソッドを使用できます:
- AGS Unreal Engine SDK
- UnrealEngine AccelByte OSS
- Unity
//⚠️ Deprecated method to obtain the ApiClient using MultiRegistry
//FApiClientPtr ApiClientA = FMultiRegistry::GetApiClient(TEXT("0"));
//FApiClientPtr ApiClientB = FMultiRegistry::GetApiClient(TEXT("1"));
Latest method to obtain ApiClient using AccelByteInstance
auto ApiClientA = AccelByteInstancePtr->GetApiClient(TEXT("0"));
auto ApiClientB = AccelByteInstancePtr->GetApiClient(TEXT("1"));
// Login with username
ApiClientA->User.LoginWithUsername(
TEXT("user+a@example.com"),
TEXT("Password321"),
FVoidHandler::CreateWeakLambda(this, [this]()
{
UE_LOG(LogTemp, Log, TEXT("Login User A successful"));
}), FErrorHandler::CreateWeakLambda(this, [](int32 ErrorCode, const FString& ErrorMessage)
{
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"));
}), FErrorHandler::CreateWeakLambda(this, [](int32 ErrorCode, const FString& ErrorMessage)
{
UE_LOG(LogTemp, Error, TEXT("Login User B Failed : %d, %s"), ErrorCode, *ErrorMessage);
}));
// Define AccelByte's Online Subsystem
const IOnlineSubsystem* OnlineSub = IOnlineSubsystem::Get(ACCELBYTE_SUBSYSTEM);
const IOnlineIdentityPtr IdentityInterface = OnlineSub->GetIdentityInterface();
// Define Player 1
const int PlayerNumA = 0; // User key A
const int PlayerNumB = 1; // User key 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");
// Set login complete delegate
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"));
}));
// Login with username
IdentityInterface->Login(PlayerNumA, AccountCredentialsA);
IdentityInterface->Login(PlayerNumB, AccountCredentialsB);
OSS で複数のレジストリを実装する場合は、すべての関数呼び出しでユーザーキーとして LocalUserNum を使用し、各プレイヤーを区別するためにデリゲートを設定してください。
// Define User
ApiClient apiClientA = AccelByteSDK.GetClientRegistry().GetApi("0");
ApiClient apiClientB = AccelByteSDK.GetClientRegistry().GetApi("1");
User userA = apiClientA.GetUser();
User userB = apiClientB.GetUser();
// Login with username
userA.LoginWithUsernameV3(
"user+a@example.com",
"Password321",
(Result<TokenData, OAuthError> result) =>
{
if (!result.IsError)
{
// show the login result
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)
{
// show the login result
Debug.Log("Login player B successful");
}
else
{
Debug.Log("Login failed:" + result.IsError);
}
});
次のステップ
シングルトンベースのレジストリから複数のレジストリへのゲームの移行方法を学びましょう。