Game Engine

GS2-SDK for Game Engine の初期化方法について

SDK の初期化

GS2 の利用を開始するには、まずは GS2-SDK の初期化処理を行います。 Gs2Client.Create を呼び出すことでGS2 のクライアントインスタンスである Gs2Domain を取得できます。

初期化に必要なパラメーターは以下です。

パラメーター

引数名説明
credentialBasicGs2Credentialクレデンシャル情報
regionRegion接続先のGS2リージョン

BasicGs2Credential

「クライアントID」と「クライアントシークレット」を指定します。 これらの値は GS2-Identifier で管理しています。

Region

GS2 のデータセンターを指定します。 指定可能な値については リージョン を参照してください。

実装例

    var gs2 = await Gs2.Unity.Core.Gs2Client.CreateAsync(
        new Gs2.Core.Model.BasicGs2Credential(
            "your client id",
            "your client secret"
        ),
        Gs2.Core.Model.Region.ApNortheast1
    );
    var future = Gs2.Unity.Core.Gs2Client.CreateFuture(
        new Gs2.Core.Model.BasicGs2Credential(
            "your client id",
            "your client secret"
        ),
        Gs2.Core.Model.Region.ApNortheast1
    );
    yield return future;
    if (future.Error != null) {
        throw future.Error;
    }
    var gs2 = future.Result;
    const auto future = Gs2::UE5::Core::FGs2Client::Create(
        MakeShared<Gs2::Core::Model::FBasicGs2Credential>(
            "your client id",
            "your client secret"
        ),
        Gs2::Core::Model::ApNorthEast1
    );
    future->StartSynchronousTask();
    if (future->GetTask().IsError())
    {
        UE_LOG(GameLog, Error, TEXT("%s"), ToCStr(future->GetTask().Error()->String()));
        return future->GetTask().Error();
    }
    const auto Gs2 = future->GetTask().Result();

カオスモード

カオスモードを適用したSDK初期化処理を呼び出すことで、APIリクエストを一定の確率で失敗させることができます。 カオスモードを有効にしたクライアントを使用して開発を進めることで、エラーハンドリングを強固なものにすることができます。

    var gs2 = await Gs2.Unity.Core.Gs2Client.CreateChaosAsync(
        new Gs2.Core.Model.BasicGs2Credential(
            "your client id",
            "your client secret"
        ),
        0.1f, // APIリクエスト時に10%の確率でリトライが必要なエラーを発生させる
        Gs2.Core.Model.Region.ApNortheast1
    );
    var future = Gs2.Unity.Core.Gs2Client.CreateChaosFuture(
        new Gs2.Core.Model.BasicGs2Credential(
            "your client id",
            "your client secret"
        ),
        0.1f, // APIリクエスト時に10%の確率でリトライが必要なエラーを発生させる
        Gs2.Core.Model.Region.ApNortheast1
    );
    yield return future;
    if (future.Error != null) {
        throw future.Error;
    }
    var gs2 = future.Result;
    const auto future = Gs2::UE5::Core::FGs2Client::CreateChaos(
        MakeShared<Gs2::Core::Model::FBasicGs2Credential>(
            "your client id",
            "your client secret"
        ),
        0.1f, // APIリクエスト時に10%の確率でリトライが必要なエラーを発生させる
        Gs2::Core::Model::ApNorthEast1
    );
    future->StartSynchronousTask();
    if (future->GetTask().IsError())
    {
        UE_LOG(GameLog, Error, TEXT("%s"), ToCStr(future->GetTask().Error()->String()));
        return future->GetTask().Error();
    }
    const auto Gs2 = future->GetTask().Result();

アカウントの作成

GS2 の多くの機能はプレイヤーの GS2-Account のアカウント情報を指定してログインする必要があります。 ログインをするためにはアカウントの作成が必要です。

アカウントを作成するには Gs2Domain::Account::Namespace()::Create を使用します。

パラメーター

引数名説明
namespaceNamestringGS2-Account のネームスペース名

実装例

    var account = await (
        await gs2.Account.Namespace(
            this.accountNamespaceName
        ).CreateAsync()
    ).ModelAsync();

    var userId = account.UserId;
    var password = account.Password;
    var future = gs2.Account.Namespace(
        this.accountNamespaceName
    ).CreateFuture();
    yield return future;
    if (future.Error != null) {
        throw future.Error;
    }
    var future2 = future.Result.ModelFuture();
    yield return future2;
    if (future2.Error != null) {
        throw future2.Error;
    }
    var account = future2.Result;

    var userId = account.UserId;
    var password = account.Password;
    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();
    }

    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();

    auto UserId = Account->GetUserId();
    auto Uassword = Account->GetPasswordId();

ログイン

SDK の初期化と、アカウントの作成が終わったことで、ログインができる準備が整います。 Gs2Domain::Login を使用することで、ログインを実行できます。

結果として GameSession オブジェクトを取得できます。 多くのAPIは GameSession を渡す必要があり、これによってログイン中のプレイヤーのユーザーデータにアクセスできます。

パラメーター

引数名説明
authenticatorIAuthenticator認証処理に使用する実装(GS2-Account)
userIdstringユーザーID
passwordstringパスワード

IAuthenticator

認証処理はインターフェース定義されており、GS2-Account を使用せずに自社の認証基盤での認証に差し替えるような実装が可能です。

Gs2AccountAuthenticator

Gs2AccountAuthenticator は一般的なユースケースでは十分な GS2-Account で認証する実装です。

引数名説明
accountSettingAccountSettingGS2-Account で認証するための情報
gatewaySettingGatewaySettingGS2-Gateway で通知を受け取るための情報
versionSettingVersionSettingGS2-Version でバージョンチェックするための情報

AccountSetting

引数名説明
accountNamespaceNamestringGS2-Account のネームスペース名
keyIdstring認証処理に使用する GS2-Key の暗号鍵ID(省略するとデフォルト暗号鍵が使用されます)

GatewaySetting

引数名説明
gatewayNamespaceNamestringGS2-Gateway のネームスペース名(省略するとデフォルトネームスペースが使用されます)
allowConcurrentAccessbool同一ユーザーIDでの多重ログインを許容するか(デフォルト:true)

VersionSetting

VersionSetting を適用することで、ログイン時やセッション再接続時に自動的に GS2-Version を使用したバージョンチェックを行うようにできます。 バージョンチェックの結果、エラーが発生すると、 Gs2AccountAuthenticator::onDetectVersionUp に登録したイベントハンドラが呼び出されます。

引数名説明
versionNamespaceNamestringGS2-Version のネームスペース名(省略するとバージョンチェックをしません)
targetVersionsEzTargetVersionゲームのバージョン情報

実装例

    var gameSession = await gs2.LoginAsync(
        new Gs2AccountAuthenticator(
            accountSetting: new AccountSetting {
                accountNamespaceName = this.accountNamespaceName,
            }
        ),
        account.UserId,
        account.Password
    );
    var future = gs2.LoginFuture(
        new Gs2AccountAuthenticator(
            accountSetting: new AccountSetting {
                accountNamespaceName = this.accountNamespaceName,
            }
        ),
        account.UserId,
        account.Password
    );
    yield return future;
    if (future.Error != null) {
        throw future.Error;
    }
    var gameSession = future.Result;
    const auto LoginFuture = Gs2->Login(
        MakeShareable<Gs2::UE5::Util::IAuthenticator>(
            new Gs2::UE5::Util::FGs2AccountAuthenticator(
                MakeShared<Gs2::UE5::Util::FAccountSetting>(
                    AccountNamespaceName
                )
            )
        ),
        *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();