はじめに

「UE5でEpic Online Services(EOS)を使ってみる」の続きです。
事前の設定が必要なので、未設定の方は準備編
をご確認ください。

ログインは様々なアカウントサービスを用いてEOSに接続できます。
今回は手早く実装するため、Epicアカウントでの実装を行います。

目次

この章では、ログイン機能に必要な実装を行っていきます。
必要なクラスを作成してC++を実装し、Blueprintで実行出来る状態にしてテストを行います。

  1. クラス作成
  2. C++
  3. Blueprint
  4. テスト

 

1.クラス作成

1-1.C++クラス
ログイン用とユーザー定義データ用のクラスを作成します。

親クラスをなしにして、EOS_DataDefinitionをC++クラスで作成します。
cppファイルは必要ないので削除します。

OnlineBlueprintCallProxyBaseを親クラスに指定して、EOS_LoginをC++クラスで作成します。

1-2.Blueprintクラス
機能実装用のクラスを作成します。
GameInstanceを親クラスに指定して、EOS_GameInstanceをBlueprintクラスで作成します。
作成したEOS_GameInstanceを、プロジェクト設定からデフォルトのゲームインスタンスとして指定します。


 

2.C++

C++を以下で実装します。

EOS_DataDefinition.h

#pragma once
#include "CoreMinimal.h"
#include "EOS_DataDefinition.generated.h"


UENUM()
enum class EAuthType : uint8
{
  //ブラウザを介して認証を行います
  accountportal,

  //DevAuthToolを介して認証を行います
  developer
};

EOS_Login.h

#pragma once

#include "CoreMinimal.h"
#include "Net/OnlineBlueprintCallProxyBase.h"
#include "EOS_DataDefinition.h"
#include "EOS_Login.generated.h"

UCLASS()
class EOS_API UEOS_Login : public UOnlineBlueprintCallProxyBase
{
  GENERATED_BODY()

  UPROPERTY(BlueprintAssignable)
  FEmptyOnlineDelegate OnSuccess;

  UPROPERTY(BlueprintAssignable)
  FEmptyOnlineDelegate OnFailure;

  UFUNCTION(BlueprintCallable, meta = (BlueprintInternalUseOnly = "true", WorldContext = "WorldContextObject"), Category = "EOS")
  static UEOS_Login* Login(UObject* WorldContextObject, FString UserID, FString UserToken, EAuthType AuthType);

  virtual void Activate() override;

private:
  void OnLoginEOSComplete(int32 LocalUserNum, bool bWasSuccessful, const FUniqueNetId& UserId, const FString& ErrorVal);

private:
  UWorld* World;
  TWeakObjectPtr<UObject> WorldContextObject;
  FString UserID;
  FString UserToken;
  EAuthType AuthType;
};

EOS_Login.cpp

#include "OnlineSubsystemUtils.h"
#include "EOS_Login.h"

UEOS_Login* UEOS_Login::Login(UObject* WorldContextObject,FString UserID, FString UserToken, EAuthType AuthType)
{
  UEOS_Login* LoginObject = NewObject<UEOS_Login>();
  LoginObject->UserID = UserID;
  LoginObject->UserToken = UserToken;
  LoginObject->AuthType = AuthType;
  LoginObject->WorldContextObject = WorldContextObject;
  return LoginObject;
}

void UEOS_Login::Activate()
{

  World = GEngine->GetWorldFromContextObject(WorldContextObject.Get(), EGetWorldErrorMode::LogAndReturnNull);

  if (!World)
  {
    UE_LOG(LogTemp, Error, TEXT("Login:Worldの取得に失敗"));
    OnFailure.Broadcast();
    return;
  }

  IOnlineSubsystem* SubsystemRef = Online::GetSubsystem(World);
  IOnlineIdentityPtr IdentityPointerRef = SubsystemRef->GetIdentityInterface();

  FOnlineAccountCredentials AccountCredentials(StaticEnum< EAuthType>()->GetDisplayValueAsText(AuthType).ToString(), UserID, UserToken);

  if (IdentityPointerRef) {
    IdentityPointerRef->OnLoginCompleteDelegates->AddUObject(this, &UEOS_Login::OnLoginEOSComplete);
    IdentityPointerRef->Login(0, AccountCredentials);
    return;
  }

  OnFailure.Broadcast();
}

void UEOS_Login::OnLoginEOSComplete(int32 LocalUserNum, bool bWasSuccessful, const FUniqueNetId& UserId, const FString& ErrorVal)
{
  if (bWasSuccessful)
  {
    UE_LOG(LogTemp, Warning, TEXT("ログイン成功"));
    OnSuccess.Broadcast();
  }
  else
  {
    UE_LOG(LogTemp, Error, TEXT("ログイン失敗 - %s"), *ErrorVal);
    OnFailure.Broadcast();
  }
}

 

3.Blueprint

Blueprintを以下で実装します。
EOS_Gameinstanceにカスタムイベントを用意し、以下で実装します。

Login:EOSにログインを試みます。各項目は以下を指定します。
・UserID:127.0.01:”DevAuthToolで指定したポート番号”
・UserToken:”DevAuthToolで指定したプロファイル名”
・AuthType:Developer


 

4.テスト

5-1.DevAuthTool
DevAuthToolを通じ認証が行える状態にするため、DevAuthToolを起動します。
ポートの指定はBlueprintの実装と同じものにしてください。

5-2.ログイン
Editorから、Loginを実行します。

5-3.承認
初めての場合はブラウザでアプリを許可するか確認が出ます。アプリに進む>許可するを押します。

5-4.ログイン確認
Editorに戻り、ログイン成功のログが出ていればひとまずの確認は完了です。
確かな確認は、次回のデータ更新の確認を以て完了とします。


おわり

お疲れ様です。

以上でログイン編は終わりです、次は統計データ編です。