実装

アカウント発行〜ログインまでを実装してみましょう

GS2 SDKの初期化

    // Setup variables

    var clientId = "YourClientId";
    var clientSecret = "YourClientSecret";
    var accountNamespaceName = "game-0001";
    var accountEncryptionKeyId = "grn:gs2:{region}:{ownerId}:key:account-encryption-key-namespace:key:account-encryption-key";
    
    // Setup general setting
    var profile = new Profile(
        clientId,
        clientSecret,
        reopener: new Gs2BasicReopener()
    );

    // Create GS2 client
    var initializeFuture = profile.InitializeFuture();
    yield return initializeFuture;
    if (initializeFuture.Error != null) {
        throw initializeFuture.Error;
    }
    var gs2 = initializeFuture.Result;
	// Setup variables

	const auto ClientId = "YourClientId";
	const auto ClientSecret = "YourClientSecret";
	const auto AccountNamespaceName = "game-0001";
	const auto AccountEncryptionKeyId = "grn:gs2:{region}:{ownerId}:key:account-encryption-key-namespace:key:account-encryption-key";
	
	// Setup general setting
	
	const auto Profile = MakeShared<Gs2::UE5::Util::FProfile>(
		ClientId,
		ClientSecret,
		Gs2::Core::Model::ERegion::ApNorthEast1,
		MakeShareable<Gs2::UE5::Util::IReOpener>(new Gs2::UE5::Util::FGs2BasicReOpener())
	);

	// Create GS2 client
    const auto InitializeFuture = Profile->Initialize();
    InitializeFuture->StartSynchronousTask();
    if (InitializeFuture->GetTask().IsError())
    {
        UE_LOG(GameLog, Error, TEXT("%s"), ToCStr(InitializeFuture->GetTask().Error()->String()));
        return InitializeFuture->GetTask().Error();
    }
    const auto Gs2 = InitializeFuture->GetTask().Result();

Setup variables

まずは4つの変数を定義しています。

変数名用途取得元
clientIdGS2にアクセスするための認証情報クレデンシャル(APIキー)の作成 で作成した値
clientSecretGS2にアクセスするための認証情報クレデンシャル(APIキー)の作成 で作成した値
accountNamespaceName利用する GS2-Account のネームスペース名ログイン処理に必要なリソースを準備 で作成した値
accountEncryptionKeyId認証処理で利用する GS2-Key の暗号鍵IDログイン処理に必要なリソースを準備 で作成した値

Setup general setting

Profile オブジェクトを作成します。Profile オブジェクトは GS2 の利用を開始するにあたって一般的な処理を扱いやすくラップしたユーティリティクラスです。

reopener には通信の再接続をするためのハンドラを設定します。 ここではライブラリにあらかじめ用意されている Gs2BasicReopener を設定しています。

Create GS2 client

GS2 のクライアントを初期化します。 clientIdclientSecret が不適切な場合、ここでエラーが返ります。

匿名アカウントの新規作成

    // Create an anonymous account
    
    Debug.Log("Create anonymous account");
    
    var createFuture = gs2.Account.Namespace(
        accountNamespaceName
    ).Create();
    yield return createFuture;
    if (createFuture.Error != null)
    {
        throw createFuture.Error;
    }
	// Create an anonymous account
	
    UE_LOG(GameLog, Display, TEXT("Create anonymous account"));

    const auto CreateFuture = Gs2->Account->Namespace(
        AccountNamespaceName
    )->Create();
    CreateFuture->StartSynchronousTask();
    if (CreateFuture->GetTask().IsError())
    {
        UE_LOG(GameLog, Error, TEXT("%s"), ToCStr(CreateFuture->GetTask().Error()->String()));
        return CreateFuture->GetTask().Error();
    }

ここではゲームプレイヤーを識別するためのアカウントの作成を行っています。 accountNamespaceName にはアカウントを追加する先のネームスペース名を指定します。

なお、このサンプルでは毎起動時に新規のアカウントでログインする挙動になっていますが、通常は、アカウントの作成はアプリケーションの初回起動時にのみ行ないます。 実際のアプリケーションではこの応答のアカウント情報をローカルストレージ等に保存し、2回目以降はローカルストレージ等から取得した作成済みのアカウント情報で、既存のゲームプレイヤーとしてログインを行います。

作成された匿名アカウントの内容を取得

    // Load created account
    
    var loadFuture = createFuture.Result.Model();
    yield return loadFuture;
    if (loadFuture.Error != null)
    {
        throw loadFuture.Error;
    }
    var account = loadFuture.Result;

    // Dump anonymous account
    
    Debug.Log($"UserId: {account.UserId}");
    Debug.Log($"Password: {account.Password}");
	// Load created account

    const auto LoadFuture = CreateFuture->GetTask().Result()->Model();
    LoadFuture->StartSynchronousTask();
    if (LoadFuture->GetTask().IsError())
    {
        UE_LOG(GameLog, Error, TEXT("%s"), ToCStr(LoadFuture->GetTask().Error()->String()));
        return LoadFuture->GetTask().Error();
    }
    const auto Account = LoadFuture->GetTask().Result();

    // Dump anonymous account

    UE_LOG(GameLog, Display, TEXT("UserId: %s"), ToCStr(*Account->GetUserId()));
    UE_LOG(GameLog, Display, TEXT("Password: %s"), ToCStr(*Account->GetPassword()));

作成された匿名アカウントの内容を取得します。

ログイン処理

    // Log-in created anonymous account

    var loginFuture = profile.LoginFuture(
        new Gs2AccountAuthenticator(
            profile.Gs2RestSession,
            accountNamespaceName,
            accountEncryptionKeyId,
            account.UserId,
            account.Password
        )
    );
    yield return loginFuture;
    if (loginFuture.Error != null)
    {
        throw loginFuture.Error;
    }
    var gameSession = loginFuture.Result;
	// Log-in created anonymous account

	const auto LoginFuture = Profile->Login(
		MakeShareable<Gs2::UE5::Util::IAuthenticator>(
			new Gs2::UE5::Util::FGs2AccountAuthenticator(
				AccountNamespaceName,
				AccountEncryptionKeyId
			)
		),
		*Account->GetUserId(),
		*Account->GetPassword()
	);
    LoginFuture->StartSynchronousTask();
    if (LoginFuture->GetTask().IsError())
    {
        UE_LOG(GameLog, Error, TEXT("%s"), ToCStr(LoginFuture->GetTask().Error()->String()));
        return LoginFuture->GetTask().Error();
    }
    const auto GameSession = LoginFuture->GetTask().Result();

つづいて GS2 へのログイン処理です。 accountNamespaceName には作成したアカウントが存在するネームスペース名を指定し、keyId にはアカウントの認証結果に付与する署名の計算に使用する暗号鍵を指定します。 更に、 userId password には作成したアカウントのユーザIDとパスワードを指定します。

loginFuture.Result にはログイン状態を表現するための GameSession オブジェクトが返ります。 以降 GS2 の API を呼び出すときにログイン状態でなければ呼び出せないAPIの引数には GameSession を渡して使用することとなります。

ログイン後呼び出し可能なAPIの呼び出し

    // Load TakeOver settings
    
    var it = gs2.Account.Namespace(
        accountNamespaceName
    ).Me(
        gameSession
    ).TakeOvers();

    while (it.HasNext())
    {
        yield return it.Next();
        if (it.Error != null)
        {
            throw it.Error;
        }
        if (it.Current != null)
        {
            // Dump TakeOver setting
            Debug.Log($"Type: {it.Current.Type}");
            Debug.Log($"Identifier: {it.Current.UserIdentifier}");
        }
    }
	// Load TakeOver settings

	const auto It = Gs2->Account->Namespace(
		AccountNamespaceName
	)->Me(
		GameSession
	)->TakeOvers();
	for (const auto TakeOver : *It)
	{
		UE_LOG(GameLog, Display, TEXT("Type: %s"), *TakeOver->GetType());
		UE_LOG(GameLog, Display, TEXT("Identifier: %s"), *TakeOver->GetUserIdentifier());
	}

ログイン状態でなければ使用できないAPIの一例として、引き継ぎ設定の一覧を取得するAPIを呼び出しています。 GameSession を渡して、ログイン中のゲームプレイヤーに設定されている引き継ぎ設定の一覧を取得できます。

GS2 SDKの終了処理

    // Finalize GS2-SDK

    yield return profile.Finalize();
	// Finalize GS2-SDK
	
    const auto FinalizeFuture = Profile->Finalize();
    FinalizeFuture->StartSynchronousTask();
    if (FinalizeFuture->GetTask().IsError())
    {
        UE_LOG(GameLog, Error, TEXT("%s"), ToCStr(FinalizeFuture->GetTask().Error()->String()));
        return FinalizeFuture->GetTask().Error();
    }

GS2との接続を終了します。

チュートリアルはおえましたか?

GS2 の使い方についてガイダンスしている YouTube チャンネル をご確認ください!

より実践的なサンプルも提供しています。

GS2 を使えば他にどんなことが実現できるのか調べましょう

GS2 を使用した開発ワークフローについて学びましょう


サンプルコード全文

サンプルコード全文