Game Engine

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

Profile

SDK の初期化には Profile というユーティリティクラスを通じて行います。 Profile は 通知処理に使用する常時接続セッションと、API呼び出しに使用するHTTPセッションを両方初期化したり、セッション切断時・アクセストークンの有効期限切れなど雑多な処理のハンドリングを自動的に行なってくれます。

Request

引数名説明
clientIdクレデンシャル情報
clientSecretクレデンシャル情報
region接続先のGS2リージョン
reopener再接続処理
distributorNamespaceNameトランザクション処理を実行する GS2-Distributor のネームスペース名

reopener には Gs2BasicReopener を指定するのが基本となります。 このクラスでは GS2 が想定する一般的な再接続処理が定義されています。

以下の実装例では省略していますが、ここで distributorNamespaceName を指定することで、任意の GS2-Distributor のネームスペースを使用してトランザクション処理を行えます。 GS2-Distributor が実行したトランザクションログを GS2-Log に記録したい場合は、ここで明示的にログの書き出し設定を行なったネームスペースを設定する必要があります。

Gs2BasicReopener Request

引数名説明
gatewaySetting通知設定
versionSettingバージョンチェック設定

Gs2BasicReopener には必要に応じて2つの引数を設定する必要があります。

gatewaySetting

サーバーからのプッシュ通知を受け取るための設定です。

サーバーサイドでトランザクション(スタンプシート)を自動実行する場合や、マッチメイキング機能を利用する場合は設定をすることで、処理の完了通知を受け取れるようになります。 GS2を活用したゲーム開発を行う場合は設定が必須といえる項目かもしれません。通知処理に使用する GS2-Gateway のネームスペースを設定します。

versionSetting

アプリのバージョンチェックをセッション再接続時に自動的に行うための設定です。

セッション再接続時にバージョンチェックを行うことで、一定周期でプレイヤーにバージョンチェックを強制することができるようになります。 GS2-Gateway のセッション強制切断APIを使用すれば、全てのプレイ中のプレイヤーにバージョンチェック強制でき、古いバージョンでプレイしているプレイヤーを追い出すことが可能となります。

この機能では、バージョンチェック後にクレデンシャルの昇格処理も実装されています。 これは GS2-Version がもつ、バージョンチェックに通過したら新しいクレデンシャルを割り当てる機能のハンドリング処理で、 ゲームに埋め込むクレデンシャルはバージョンチェックを行うために必要な最小限の権限のみを持つようにし、バージョンチェックを通過した後でゲームをプレイするのに十分な権限に昇格させることが可能となります。

実装例

    var profile = new Profile(
        clientId,
        clientSecret,
        region: Region.ApNorthEast1,
        reopener: new Gs2BasicReopener(
        )
    );
    var gameSession = await profile.LoginAsync(
        new Gs2AccountAuthenticator(
            session: profile.Gs2RestSession,
            accountNamespaceName: "namespace-0001",
            keyId: "grn:gs2:{region}:{yourOwnerId}:key:namespace-0001:key:key-0001",
            userId: userId,
            password: password,
            gatewaySetting : new GatewaySetting {
                gatewayNamespaceName = gatewayNamespaceName,
                allowConcurrentAccess = true
            },
            versionSetting : new VersionSetting {
                versionNamespaceName = versionNamespaceName,
                targetVersions = new []
                {
                    new EzTargetVersion
                    {
                        VersionName = "app",
                        Version = new EzVersion
                        {
                            Major = 1,
                            Minor = 0,
                            Micro = 0
                        }
                    }
                }
            }
        )
    );
    var profile = new Profile(
        clientId,
        clientSecret,
        region: Region.ApNorthEast1,
        reopener: new Gs2BasicReopener(
        )
    );
    var future = await profile.LoginFuture(
        new Gs2AccountAuthenticator(
            session: profile.Gs2RestSession,
            accountNamespaceName: "namespace-0001",
            keyId: "grn:gs2:{region}:{yourOwnerId}:key:namespace-0001:key:key-0001",
            userId: userId,
            password: password,
            gatewaySetting : new GatewaySetting {
                gatewayNamespaceName = gatewayNamespaceName,
                allowConcurrentAccess = true
            },
            versionSetting : new VersionSetting {
                versionNamespaceName = versionNamespaceName,
                targetVersions = new []
                {
                    new EzTargetVersion
                    {
                        VersionName = "app",
                        Version = new EzVersion
                        {
                            Major = 1,
                            Minor = 0,
                            Micro = 0
                        }
                    }
                }
            }
        )
    );
    yield return future;
    if (future.Error != null)
    {
        OnError(future.Error);
        yield break;
    }

    gameSession = future.Result;
    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(
            MakeShared<Gs2::UE5::Util::FGatewaySettingPtr>(
                gatewayNamespaceName,
                true
            ),
            MakeShared<Gs2::UE5::Util::FVersionSettingPtr>(
                versionNamespaceName,
                []{
                    TArray<Gs2::UE5::Version::Model::FEzTargetVersionPtr> Arr;
                    Arr.Add(MakeShared<Gs2::UE5::Version::Model::FEzTargetVersion>()
                        ->WithVersionName(TOptional<FString>("app"))
                        ->WithVersion(
                            MakeShared<Gs2::UE5::Version::Model::FEzVersion>()
                                ->WithMajor(1)
                                ->WithMinor(0)
                                ->WithMicro(0)
                        )
                    );
                    return Arr;
                }()
            )
        ))
    );

SDK の初期化

Profile オブジェクトを作成できたら、GS2-SDK の初期化処理を行います。 初期化処理を行うことで、GS2 のクライアントインスタンスを取得できます。

実装例

    var gs2 = await profile.InitializeAsync();
    var initializeFuture = profile.InitializeFuture();
    yield return initializeFuture;
    if (initializeFuture.Error != null) {
        throw initializeFuture.Error;
    }
    var gs2 = initializeFuture.Result;
    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();