AccelByte Instance Usage in AGS Unreal Engine SDK
Overview
The old implementation of the AGS Unreal Engine SDK relied heavily to a singleton pattern.
The singleton pattern is deprecated.
- The deprecation affects
FRegistry
&FMultiRegistry
classes. - The deprecation does not affect
ApiClient
and its usage. - The singleton is replaced by AccelByteInstance, a self-contained instance.
If developer uses those FRegistry
& FMultiRegistry
classes, they need to change the way to access the ApiClient/API class (i.e. User, Lobby, Chat, etc.) and needs to migrate their implementation to use AccelByteInstance.
Obtaining ApiClient from AccelByte Instance
Developer has two choice to obtain the AccelByte Instance:
- [Recommended] Rely to the AccelByte OnlineSubystem (OSS) instance
- Create AccelByte Instance and manage it by themselves
1. Rely to AccelByte OSS
AccelByte OSS already has an AccelByteInstance already.
If developer is implementing AccelByte OSS, they can proceed to obtain the ApiClient for its player num without need to access AccelByte Instance directly
#include "OnlineSubsystemAccelByteDefines.h"
...
auto ABSubsystem = IOnlineSubsystem::Get(ACCELBYTE_SUBSYSTEM);
if(ABSubsystem == nullptr)
{
return;
}
FOnlineSubsystemAccelByte* AccelByteOnlineSubsystemPtr = static_cast<FOnlineSubsystemAccelByte*>(ABSubsystem);
if(AccelByteOnlineSubsystemPtr == nullptr)
{
return;
}
// For game client
auto ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient(YOUR_PLAYER_LOCAL_NUM);
auto LobbyGameClient = ApiClient->GetLobbyApi().Pin();
LobbyGameClient->RequestFriend(...)
// For game server
FAccelByteInstancePtr AccelByteInstancePtr = AccelByteOnlineSubsystemPtr->GetAccelByteInstance().Pin();
auto ServerApiClient = AccelByteInstancePtr->GetServerApiClient();
ServerApiClient->ServerInventory.GetInventories(...);
Else, if developer is only using AccelByte SDK without AccelByte OSS, they can obtain it this way:
#include "OnlineSubsystemAccelByteDefines.h"
...
auto ABSubsystem = IOnlineSubsystem::Get(ACCELBYTE_SUBSYSTEM);
if(ABSubsystem == nullptr)
{
return;
}
FOnlineSubsystemAccelByte* AccelByteOnlineSubsystemPtr = static_cast<FOnlineSubsystemAccelByte*>(ABSubsystem);
if(AccelByteOnlineSubsystemPtr == nullptr)
{
return;
}
// For game client
const FString ApiClientId = TEXT("YOUR_CUSTOM_IDENTIFIER");
FAccelByteInstancePtr AccelByteInstancePtr = AccelByteOnlineSubsystemPtr->GetAccelByteInstance().Pin();
auto ApiClient = AccelByteInstancePtr->GetApiClient(ApiClientId);
auto LobbyGameClient = ApiClient->GetLobbyApi().Pin();
LobbyGameClient->RequestFriend(...)
// For game server
FAccelByteInstancePtr AccelByteInstancePtr = AccelByteOnlineSubsystemPtr->GetAccelByteInstance().Pin();
auto ServerApiClient = AccelByteInstancePtr->GetServerApiClient();
ServerApiClient->ServerInventory.GetInventories(...);
2. Create & Manage AccelByte Instance manually
If developer doesn't want to use the AccelByte OnlineSubsystem (OSS) plugin, developer can obtain & manage AccelByteInstance by themselves.
Ensure the lifetime of the AccelByteInstancePtr.
#include "AccelByteUe4SdkModule.h"
...
auto AccelByteInstancePtr = IAccelByteUe4SdkModuleInterface::Get().CreateAccelByteInstance();
if (!AccelByteInstancePtr.IsValid())
{
return;
}
Migration from FMultiRegistry ApiClient to AccelByte Instance's ApiClient
To start migrating, we need to follow the guide above to obtain the ApiClient from the AccelByteInstance.
Then refer this example to compare the migration.
Before
const FString ApiClientId = TEXT("YOUR_CUSTOM_API_CLIENT");
auto ApiClient = FMultiRegistry::GetApiClient(ApiClientId);
ApiClient->User.LoginWithDeviceId(...);
After
int32 LocalUserNum = 0;//example
const FString ApiClientId = TEXT("YOUR_CUSTOM_API_CLIENT");
// If developer is implementing AccelByte OSS
auto ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient(LocalUserNum);
// else, if developer only use AccelByte SDK
auto ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient(ApiClientId);
auto User = ApiClient->GetUserApi().Pin();
if (!User.IsValid())
{
return;
}
User->LoginWithDeviceId(...);
// For Game Server
auto ServerApiClient = AccelByteOnlineSubsystemPtr->GetServerApiClient();