サンプルコード全文
サンプルコード全文
// 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();
まずは4つの変数を定義しています。
変数名 | 用途 | 取得元 |
---|---|---|
clientId | GS2にアクセスするための認証情報 | クレデンシャル(APIキー)の作成 で作成した値 |
clientSecret | GS2にアクセスするための認証情報 | クレデンシャル(APIキー)の作成 で作成した値 |
accountNamespaceName | 利用する GS2-Account のネームスペース名 | ログイン処理に必要なリソースを準備 で作成した値 |
accountEncryptionKeyId | 認証処理で利用する GS2-Key の暗号鍵ID | ログイン処理に必要なリソースを準備 で作成した値 |
Profile
オブジェクトを作成します。Profile
オブジェクトは GS2 の利用を開始するにあたって一般的な処理を扱いやすくラップしたユーティリティクラスです。
reopener
には通信の再接続をするためのハンドラを設定します。
ここではライブラリにあらかじめ用意されている Gs2BasicReopener
を設定しています。
GS2 のクライアントを初期化します。
clientId
や clientSecret
が不適切な場合、ここでエラーが返ります。
// 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 を渡して使用することとなります。
// 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 を渡して、ログイン中のゲームプレイヤーに設定されている引き継ぎ設定の一覧を取得できます。
// 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 チャンネル をご確認ください!
サンプルコード全文