オンラインサブシステムを使用してログインする - デバイスIDでログインする - (Unreal Engine モジュール)
注釈:本資料はAI技術を用いて翻訳されています。
オンラインサブシステムの展開
このチュートリアルでは、AccelByte Gaming Services (AGS) オンラインサブシステム (OSS) を使用してデバイス ID でログインを実装する方法を学びます。
Byte Wars は、AGS OSS を使用する際にログイン関連の機能をキャッシュおよび処理するラッパーとして機能する UAuthEssentialsSubsystem という名前のゲームインスタンスサブシステムを使用します。ゲームインスタンスサブシステムから派生しているため、アクセスが容易で、ゲームインスタンスと同じライフタイムを持ち、エンジンクラスをオーバーライドすることなくモジュール性を提供します。
サブシステムの詳細については、Unreal Engine Programming Subsystems をお読みください。
UAuthEssentialsSubsystem は主に AGS OSS の Identity Interface を使用します。Identity Interface は、AGS とのアカウント関連のやり取りを処理するサービスとして、ユーザーを認証してアクセストークンを取得する機能を提供します。これにより、ユーザーが適切に認証された場合に AGS 機能を利用できるようになります。
Identity Interface の詳細については、Unreal Engine Online Subsystem Documentation をご覧ください。
以下の図は、UAuthEssentialsSubsystem がログインウィジェットを AGS OSS に接続する方法を説明しています。
スターターパックの内容
変更するためのスターター クラス UAuthEssentialsSubsystem は、リソース セクションで提供されており、以下で構成されています。
- ヘッダーファイル:
/Source/AccelByteWars/TutorialModules/Access/AuthEssentials/AuthEssentialsSubsystem_Starter.h - CPP ファイル:
/Source/AccelByteWars/TutorialModules/Access/AuthEssentials/AuthEssentialsSubsystem_Starter.cpp
スタータークラスには、以下の機能が含まれています。
-
ヘッダーファイルに Online Identity Interface をインクルード:
// ...
#include "OnlineIdentityInterfaceAccelByte.h" -
ヘッダーファイルで宣言された AccelByte Identity Interface へのポインタ:
protected:
// ...
FOnlineIdentityAccelBytePtr IdentityInterface; -
AGS OSS からログインが完了したときにウィジェットクラスがバインドするためのマルチキャストデリゲート:
DECLARE_MULTICAST_DELEGATE_TwoParams(FAuthOnLoginComplete, bool /*bWasSuccessful*/, const FString& /*ErrorMessage*/);
typedef FAuthOnLoginComplete::FDelegate FAuthOnLoginCompleteDelegate; -
ヘッダーファイルでの Account Credentials の宣言:
protected:
// ...
FOnlineAccountCredentials Credentials; -
Credentials を設定およびクリアするためのヘルパー関数:
void UAuthEssentialsSubsystem_Starter::SetAuthCredentials(const EAccelByteLoginType& LoginMethod, const FString& Id, const FString& Token)
{
Credentials.Type = (LoginMethod == EAccelByteLoginType::None) ? TEXT("") : FAccelByteUtilities::GetUEnumValueAsString(LoginMethod);
Credentials.Id = Id;
Credentials.Token = Token;
}void UAuthEssentialsSubsystem_Starter::ClearAuthCredentials()
{
Credentials.Type = TEXT("");
Credentials.Id = TEXT("");
Credentials.Token = TEXT("");
} -
ログインをトリガーするためのログイン関数:
public:
// ...
void Login(const APlayerController* PC, const FAuthOnLoginCompleteDelegate& OnLoginComplete); -
UAuthEssentialsSubsystem_Starter::Initialize()での Online Subsystem と Identity Interface の両方の検証:void UAuthEssentialsSubsystem_Starter::Initialize(FSubsystemCollectionBase& Collection)
{
// ...
// Get Online Subsystem and make sure it's valid.
FOnlineSubsystemAccelByte* Subsystem = static_cast<FOnlineSubsystemAccelByte*>(Online::GetSubsystem(GetWorld()));
if (!ensure(Subsystem))
{
UE_LOG_AUTH_ESSENTIALS(Warning, TEXT("The online subsystem is invalid. Please make sure OnlineSubsystemAccelByte is enabled and the DefaultPlatformService under [OnlineSubsystem] in the Engine.ini file is set to AccelByte."));
return;
}
// Grab the reference of AccelByte Identity Interface and make sure it's valid.
IdentityInterface = StaticCastSharedPtr<FOnlineIdentityAccelByte>(Subsystem->GetIdentityInterface());
if (!ensure(IdentityInterface.IsValid()))
{
UE_LOG_AUTH_ESSENTIALS(Warning, TEXT("Identity interface is not valid."));
return;
}
// ...
}
AGS OSS を使用したログインの実装
-
Visual Studio を使用して
AccelByteWars.slnを開き、AuthEssentialsSubsystem_Starterクラスのヘッダーファイルを開きます。ログインリクエストが完了したときに使用されるコールバックとして、OnLoginCompleteという新しい関数宣言を作成します。このコールバック関数は、後で Identity Interface によって提供されるFOnLoginCompleteDelegateデリゲートにバインドされます。また、独自のイベントFAuthOnLoginCompleteDelegate_Starterを渡し、後でトリガーされるようにして、ログインウィジェットがログイン結果に基づいて UI を設定できるようにします。protected:
// ...
void OnLoginComplete(int32 LocalUserNum, bool bLoginWasSuccessful, const FUniqueNetId& UserId, const FString& LoginError, const FAuthOnLoginCompleteDelegate OnLoginComplete); -
次に、
AuthEssentialsSubsystem_Starterクラスの CPP ファイルを開き、UAuthEssentialsSubsystem_Starter::Login()関数に移動します。次に、ログインコードを以下のコードに置き換えます。この関数はIdentityInterfaceを使用してログインを実行します。void UAuthEssentialsSubsystem_Starter::Login(const APlayerController* PC, const FAuthOnLoginCompleteDelegate& OnLoginComplete)
{
if (!ensure(IdentityInterface.IsValid()))
{
FString Message = TEXT("Cannot login. Identity interface is not valid.");
UE_LOG_AUTH_ESSENTIALS(Warning, TEXT("%s"), *Message);
OnLoginComplete.ExecuteIfBound(false, *Message);
return;
}
const ULocalPlayer* LocalPlayer = PC->GetLocalPlayer();
ensure(LocalPlayer != nullptr);
int32 LocalUserNum = LocalPlayer->GetControllerId();
IdentityInterface->AddOnLoginCompleteDelegate_Handle(LocalUserNum, FOnLoginCompleteDelegate::CreateUObject(this, &UAuthEssentialsSubsystem_Starter::OnLoginComplete, OnLoginComplete));
IdentityInterface->Login(LocalUserNum, Credentials);
/*
* Logout On Game Exit
* Workaround for the lobby not properly disconnecting when closing the PIE game.
*/
if (UAccelByteWarsGameInstance* ByteWarsGameInstance = Cast<UAccelByteWarsGameInstance>(GetGameInstance()); ensure(ByteWarsGameInstance))
{
ByteWarsGameInstance->OnGameInstanceShutdownDelegate.AddWeakLambda(this, [this, LocalUserNum]()
{
IdentityInterface->Logout(LocalUserNum);
UE_LOG_AUTH_ESSENTIALS(Warning, TEXT("Logging out local player %d"), LocalUserNum);
});
}
} -
次に、
OnLoginComplete()関数の定義を作成します。この関数はFAuthOnLoginCompleteDelegate_Starterを呼び出して、ログインプロセスが成功したかどうかを通知します。void UAuthEssentialsSubsystem_Starter::OnLoginComplete(int32 LocalUserNum, bool bLoginWasSuccessful, const FUniqueNetId& UserId, const FString& LoginError, const FAuthOnLoginCompleteDelegate OnLoginComplete)
{
if (bLoginWasSuccessful)
{
UE_LOG_AUTH_ESSENTIALS(Log, TEXT("Login user successful."));
}
else
{
UE_LOG_AUTH_ESSENTIALS(Warning, TEXT("Login user failed. Message: %s"), *LoginError);
}
IdentityInterface->ClearOnLoginCompleteDelegates(LocalUserNum, this);
OnLoginComplete.ExecuteIfBound(bLoginWasSuccessful, LoginError);
} -
AccelByteWars プロジェクトをビルドし、コンパイルエラーがないことを確認します。
リソース
- このチュートリアルセクションで使用されているファイルは、Byte Wars Unreal GitHub リポジトリで入手できます。