SequenceのUnreal SDKは、Epic Games Authを利用したウォレットの作成に対応しています。始めるには、プロジェクトにEOS SDKを統合し、EOS Epic Account Servicesでログインできるようにしてください。 Epic認証の大きな利点は、Epic Games Launcherからゲームを起動した場合に発揮されます。この方法なら、サインイン画面を表示せずに、Sequenceで認証し、ユーザーのためにノンカストディアルウォレットを作成できます。 完全にヘッドレスで動作します。

ロードマップ

  • Epic Games LauncherからExchange Codeを使ったEpicサインイン
  • コードがない場合は、Epicのアカウントポータルを使ってサインイン
  • Epicアカウントのアクセストークンを取得し、それを使ってSequenceのUnreal SDKで認証

統合方法を学びましょう

ネイティブのEOS SDKはC++での統合のみをサポートしているため、本ガイドではC++を中心に解説します。ただし、Blueprintで利用したい場合は、UFUNCTIONに変換することで対応できます。また、Redpoint EOS SDKのようなサードパーティライブラリを利用する方法もあります。 統合例をチェックしてください。

1. 必要なSDKのインストール

Unrealプロジェクトに以下のSDKがインストールされていることを確認してください。
  • SequenceのUnreal SDK
  • Online Services EOS
  • Online Subsystem EOS

2. プロジェクトで参照設定

.Build.csファイルのPublic Dependency Modulesに追加してください。
PublicDependencyModuleNames.AddRange(new string[] { "SequencePlugin", "EOSSDK", "OnlineServicesEOS" });

3. EOS SDKの初期化

Epic Games Dev Portalから取得したプロジェクト認証情報でEOS_Platform_Createを実行します。 セキュリティのため、これらの認証情報はEosConfig.iniなどの設定ファイルから読み込むことを推奨し、.gitignoreに追加してください。
// .h
void Initialize();

// .cpp
void UEOSManager::Initialize()
{
    const FString CacheDirectory = FPaths::ConvertRelativePathToFull(FPaths::Combine(FPaths::ProjectSavedDir(), TEXT("EOSCache")));

    EOS_Platform_Options PlatformOptions = {};
    PlatformOptions.ApiVersion = EOS_PLATFORM_OPTIONS_API_LATEST;
    PlatformOptions.ProductId = "ProductId";
    PlatformOptions.SandboxId = "SandboxId";
    PlatformOptions.DeploymentId = "DeploymentId";
    PlatformOptions.ClientCredentials.ClientId = "ClientId";
    PlatformOptions.ClientCredentials.ClientSecret = "ClientSecret";
    PlatformOptions.EncryptionKey = "EncryptionKey";
    PlatformOptions.TickBudgetInMilliseconds = 0;
    PlatformOptions.CacheDirectory = TCHAR_TO_UTF8(*CacheDirectory);
    PlatformOptions.OverrideCountryCode = nullptr;
    PlatformOptions.OverrideLocaleCode = nullptr;
    PlatformOptions.Flags = 0;

    this->EosPlatform = EOS_Platform_Create(&PlatformOptions);
    if (!this->EosPlatform)
    {
        UE_LOG(LogTemp, Error, TEXT("Failed to create EOS platform."));
        return;
    }

    UE_LOG(LogTemp, Display, TEXT("EOS Platform initialized successfully."));
}

4. EOSプラットフォームのティック処理

Sign-Inプロセス中にEOS SDKが自動で更新されるようにするには、手動で「tick」処理を行う必要があります。 プラットフォームハンドル EOS_HPlatform を使い、EOS_Platform_Tick を呼び出してください。これは、いずれかのPawnの Tick ノード内で実行してください。
// .h
void Tick();

// .cpp
void UEOSManager::Tick()
{
    if (this->EosPlatform)
    {
        EOS_Platform_Tick(this->EosPlatform);
    }
}

5. EOSログイン関数の作成

EOSでログインするには、EOS_Auth_Login 関数を呼び出します。さらに、Epic Games Launcherから Exchange Code を取得する関数も作成します。この関数は、EOS_ELoginCredentialType::EOS_LCT_ExchangeCode オプションで呼び出した場合のみ使用されます。
// .h
void LoginWithEpicAccountServices(const EOS_ELoginCredentialType Type, TFunction<void()> OnSuccess, TFunction<void()> OnFailure);
char* GetExchangeCodeFromCommandLine();

// .cpp
void UEOSManager::LoginWithEpicAccountServices(const EOS_ELoginCredentialType Type, TFunction<void()> OnSuccess, TFunction<void()> OnFailure)
{
    if (!this->EosPlatform)
    {
        UE_LOG(LogTemp, Error, TEXT("Failed to login. EOS Platform is null, please Initialize."));
        OnFailure();
        return;
    }

    this->EosAuth = EOS_Platform_GetAuthInterface(this->EosPlatform);

    EOS_Auth_Credentials Credentials = {};
    Credentials.ApiVersion = EOS_AUTH_CREDENTIALS_API_LATEST;
    Credentials.Type = Type;
    Credentials.Token = GetExchangeCodeFromCommandLine();

    EOS_Auth_LoginOptions LoginOptions = {};
    LoginOptions.ApiVersion = EOS_AUTH_LOGIN_API_LATEST;
    LoginOptions.Credentials = &Credentials;
    LoginOptions.ScopeFlags = EOS_EAuthScopeFlags::EOS_AS_NoFlags;

    FEosLoginContext* ClientData = new FEosLoginContext;
    ClientData->Self = this;
    ClientData->OnSuccess = [OnSuccess]() { OnSuccess(); };
    ClientData->OnFailure = [OnFailure]() { OnFailure(); };

    EOS_Auth_Login(this->EosAuth, &LoginOptions, ClientData,[](const EOS_Auth_LoginCallbackInfo* Data)
    {
        const FEosLoginContext* Context = static_cast<FEosLoginContext*>(Data->ClientData);
        if (Data->ResultCode == EOS_EResult::EOS_Success)
        {
            const EOS_EpicAccountId EpicId = Data->LocalUserId;
            Context->Self->EpicAccountId = EpicId;
            Context->OnSuccess();
        }
        else
        {
            UE_LOG(LogTemp, Error, TEXT("Epic Account login failed: %s"), *FString(EOS_EResult_ToString(Data->ResultCode)));
            Context->OnFailure();
        }
    });
}

char* UEOSManager::GetExchangeCodeFromCommandLine()
{
	FString AuthPassword;
	if (FParse::Value(FCommandLine::Get(), TEXT("AUTH_PASSWORD="), AuthPassword))
	{
		UE_LOG(LogTemp, Log, TEXT("ExchangeCode: %s"), *AuthPassword);
		return StringToChars(AuthPassword);
	}

	UE_LOG(LogTemp, Warning, TEXT("AUTH_PASSWORD parameter not found!"));
	return const_cast<char*>("");
}

6. Epicアカウントのアクセストークンを取得

Epicアカウントのアクセストークンにアクセスする関数を実装しましょう。これはOIDC互換のIDトークンです。
// .h
FString CopyEpicAccountAccessToken();

// .cpp
FString UEOSManager::CopyEpicAccountAccessToken()
{
    if (!this->EpicAccountId)
    {
        UE_LOG(LogTemp, Error, TEXT("Failed to get Access Token. Epic Account Id is null."));
        return TEXT("");
    }

    EOS_Auth_CopyUserAuthTokenOptions TokenOptions
    {
        EOS_AUTH_COPYUSERAUTHTOKEN_API_LATEST
    };

    EOS_Auth_Token* AuthToken = nullptr;
    const EOS_EResult Result = EOS_Auth_CopyUserAuthToken(this->EosAuth, &TokenOptions, this->EpicAccountId, &AuthToken);

    if (Result == EOS_EResult::EOS_Success && AuthToken)
    {
        const FString AccessToken = FString(AuthToken->AccessToken);
        UE_LOG(LogTemp, Log, TEXT("Epic Account Services Access Token: %s"), *AccessToken);

        EOS_Auth_Token_Release(AuthToken);
        return AccessToken;
    }

    UE_LOG(LogTemp, Error, TEXT("Failed to copy user auth token: %s"), *FString(EOS_EResult_ToString(Result)));
    return TEXT("");
}

7. Sequenceでウォレットを作成

Epicでサインインし、アカウントのアクセストークンにアクセスできるようになったら、SequenceのUnreal SDKを使ってノンカストディアルウォレットを作成しましょう。 この関数は、EOS_ELoginCredentialType::EOS_LCT_ExchangeCode オプションを使って、ゲーム開始時に呼び出す必要があります。Epic Games Launcherから提供されるコードは有効期限が短いため、すぐに取得する必要があります。
// .h
void SignInWithEpic();
void CreateWallet(TFunction<void()> OnSuccess, TFunction<void()> OnFailure);

// .cpp
void EOSManager::SignInWithEpic()
{
    this->LoginWithEpicAccountServices(EOS_ELoginCredentialType::EOS_LCT_ExchangeCode, [this]() {
        // Success after starting the game from Epic's Game Launcher
        this->CreateWallet();
    }, [this]() {
        // No exchange code, let's fallback using Epic's Account Portal
        this->LoginWithEpicAccountServices(EOS_ELoginCredentialType::EOS_LCT_AccountPortal, [this]() => {
            this->CreateWallet();
        }, []() {
            // Failed or user canceled the Sign-In process
        });
    });
}

void EOSManager::CreateWallet(TFunction<void()> OnSuccess, TFunction<void()> OnFailure)
{
    const FString Token = this->CopyEpicAccountAccessToken();
    const USequenceSessions* Sessions = NewObject<USequenceSessions>();
    Sessions->StartOidcSession(Token, OnSuccess, [OnFailure](FSequenceError Error) { OnFailure(); }, nullptr);
}

8. 実際に試してみましょう!

これで完了です!次に、UEOSManager クラスのインスタンスを作成し、以下の手順を行ってください。
  • ゲーム開始時に Initialize() を呼び出してください。
  • 毎フレーム、または別のタイミングで Tick() を呼び出してください。
  • SignInWithEpic() を呼び出してください。