GS2-Account SDK for Game Engine API リファレンス

ゲームエンジン向け GS2-Account SDK の モデルの仕様 と API のリファレンス

モデル

EzAccount

ゲームプレイヤーアカウント

ゲームプレイヤーを識別するID情報のエンティティです。
ゲームプレイヤーアカウントは匿名アカウントであり、ユーザーID(UUID)とパスワード(ランダムな32文字の文字列)で構成されるため、ゲームプレイヤーはメールアドレスなどの情報を入力する必要はありません。

発行されたゲームプレイヤーアカウントは、デバイスのローカルストレージに保存しておき、次回以降ログインに使用します。

有効化条件必須デフォルト値の制限説明
userIdstring
UUID~ 128文字ユーザーID
passwordstring
~ 128文字パスワード
アカウントのセキュリティを確保するためのパスワードを格納します。
パスワードは最大128文字の長さを持ち、アカウントの保護に重要な役割を果たします。
createdAtlong
現在時刻作成日時
UNIX 時間・ミリ秒
※ サーバーが自動で設定

EzTakeOver

引き継ぎ情報

引き継ぎ情報とは、デバイスの機種変更やプラットフォーム間のアカウントの移動・共有時に使用する情報です。
個人を識別するユニークな文字列とパスワードで構成され、その適切な組み合わせを入力することで、Account(匿名アカウント)を取得することができます。

1つの Account に対して複数の引き継ぎ情報を設定できます。
複数の引き継ぎ情報を設定するにはそれぞれ異なるスロットを指定する必要があります。
スロットには0~1024を指定できますので、最大1025種類の引き継ぎ情報を設定可能です。

具体的な用例としては 0 には Sign in with Apple のアカウント情報を、1 には Google のアカウント情報を保存するようにする。というような使い方が想定されています。
あくまでこの引き継ぎ情報はデータホルダーであり、ソーシャルアカウントとの認証の仕組みは別途用意する必要があります。

有効化条件必須デフォルト値の制限説明
userIdstring
~ 128文字ユーザーID
typeint
0 ~ 1024スロット番号
0から1024までの範囲で指定され、異なる引き継ぎ情報を区別します。
userIdentifierstring
~ 1024文字引き継ぎ用ユーザーID
アカウントを引き継ぐ際に使用される個人を識別するためのユニークなキーです。
異なるアカウントで同一の userIdentifier を指定した場合、後で設定した値が優先されます。
createdAtlong
現在時刻作成日時
UNIX 時間・ミリ秒
※ サーバーが自動で設定

EzPlatformId

プラットフォームID

X、Instagram、Facebook などの各種プラットフォームにおけるIDを保持します。
他のプレイヤーは各種プラットフォームIDを使用して、プレイヤーを検索することができます。

Instagram のフォロワーや、Facebook のフレンドをゲーム内のフレンドとしてインポートする際に、GS2-Account のアカウントを特定するために使用します。

有効化条件必須デフォルト値の制限説明
typeint
0 ~ 1024スロット番号
0から1024までの範囲で指定され、プラットフォームの種類を識別するために使用します。
userIdentifierstring
~ 1024文字各種プラットフォームにおけるユーザーID
外部プラットフォームにおけるユーザーの一意な識別子(例:ソーシャルメディアのユーザーIDやメールアドレス)です。スロット番号(type)と組み合わせて、特定のプラットフォームアカウントを識別するために使用されます。
userIdstring
~ 128文字GS2-Account ユーザーID
このプラットフォームIDにリンクされた GS2-Account のユーザーIDです。外部プラットフォームのIDと GS2 の匿名アカウントとの対応付けに使用されます。
createdAtlong
現在時刻作成日時
UNIX 時間・ミリ秒
※ サーバーが自動で設定

EzPlatformUser

各種プラットフォームにおけるユーザー情報

外部プラットフォームのユーザー情報を保持します。プラットフォーム固有のユーザー識別子と対応する GS2-Account ユーザーIDのマッピングを含み、プラットフォームIDによるプレイヤー検索に使用されます。

有効化条件必須デフォルト値の制限説明
typeint
0 ~ 1024スロット番号
0から1024までの範囲で指定され、プラットフォームの種類を識別するために使用します。
userIdentifierstring
~ 1024文字各種プラットフォームにおけるユーザーID
外部プラットフォームにおけるユーザーの一意な識別子(例:ソーシャルメディアのユーザーIDやメールアドレス)です。スロット番号(type)と組み合わせて、特定のプラットフォームアカウントを識別するために使用されます。
userIdstring
~ 128文字GS2-Account ユーザーID
このプラットフォームユーザーにリンクされた GS2-Account のユーザーIDです。外部プラットフォームのIDと GS2 の匿名アカウントとの対応付けに使用されます。

EzBanStatus

アカウントBANステータス

ゲームプレイヤーアカウントに適用されたBAN(アクセス禁止)状態に関する情報を表します。
この型は、BANが適用された理由、BANの名称、およびBANの解除予定日時などの詳細情報を含みます。
BAN状態は、不正行為や規約違反など、様々な理由でアカウントに適用されることがあり、この型はその状態を管理するのに役立ちます。
システムは、この情報を基にアカウントのアクセス権限を制御し、必要に応じてアクセスの制限や解除を行います。

有効化条件必須デフォルト値の制限説明
namestring
UUID~ 36文字BANステータス名
BAN状態の一意な名前を保持します。名前には任意の値を設定できます。
省略した場合は UUID(Universally Unique Identifier)フォーマットで自動的に生成され、各BANステータスを識別するために使用されます。
このIDにより、複数のBANステータスを簡単に追跡できます。
reasonstring
~ 256文字アカウントBANされた理由
アカウントがBANされた具体的な理由を説明します。
最大256文字の長さで、アカウントBANの原因を明確にするのに役立ちます。
この情報は、アカウントの管理者や運営チームが参照するだけでなく、ゲームクライアントへの応答値にも含まれます。
releaseTimestamplong
BANが解除される日時
アカウントBANが解除される予定の日時を示します。
この日時が過ぎると、アカウントは自動的にBAN解除状態になり、通常のアクセスが可能になります。

メソッド

authentication

アカウントにログインする

アカウント作成時に取得したユーザーIDとパスワードを使って、ゲームプレイヤーのログイン処理を行います。
ログインに成功すると、アカウント認証情報署名 が発行されます。
これらを GS2-Auth::Login に渡すと、GS2 の各サービスを利用するための アクセストークン を取得できます。

通常は GS2-Profile::Login を使うことで、この処理と GS2-Auth::Login をまとめて実行できます。
詳しくは「はじめかた」のサンプルプログラムを参照してください。

アカウント認証情報署名 の有効期限は1時間です。

Request

有効化条件必須デフォルト値の制限説明
namespaceNamestring
~ 128文字ネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
userIdstring
~ 128文字ユーザーID
keyIdstring“grn:gs2:{region}:{ownerId}:key:default:key:default”~ 1024文字暗号鍵 GRN
passwordstring
~ 128文字パスワード
アカウントのセキュリティを確保するためのパスワードを格納します。
パスワードは最大128文字の長さを持ち、アカウントの保護に重要な役割を果たします。

Result

説明
itemEzAccountゲームプレイヤーアカウント
banStatusesList<EzBanStatus>BAN状態リスト
bodystring署名対象のアカウント認証情報
signaturestring署名

Error

このAPIには特別な例外が定義されています。
GS2-SDK for GameEngine ではゲーム内でハンドリングが必要そうなエラーは一般的な例外から派生した特殊化した例外を用意することでハンドリングしやすくしています。
一般的なエラーの種類や、ハンドリング方法は こちら のドキュメントを参考にしてください。

基底クラス説明
PasswordIncorrectExceptionUnauthorizedExceptionパスワードの指定が不適切です
BannedInfinityExceptionUnauthorizedExceptionアカウントが利用停止されています

実装例

try {
    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Account(
        userId: "user-0001"
    );
    var result = await domain.AuthenticationAsync(
        password: "password-0001",
        keyId: "grn:gs2:ap-northeast-1:owner_id:key:namespace-0001:key:key-0001"
    );
    var item = await result.ModelAsync();
    var banStatuses = result.BanStatuses;
    var body = result.Body;
    var signature = result.Signature;
} catch(Gs2.Gs2Account.Exception.PasswordIncorrectException e) {
    // Incorrect password specified.
} catch(Gs2.Gs2Account.Exception.BannedInfinityException e) {
    // Account has been suspended.
}
    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Account(
        userId: "user-0001"
    );
    var future = domain.AuthenticationFuture(
        password: "password-0001",
        keyId: "grn:gs2:ap-northeast-1:owner_id:key:namespace-0001:key:key-0001"
    );
    yield return future;
    if (future.Error != null)
    {
        if (future.Error is Gs2.Gs2Account.Exception.PasswordIncorrectException)
        {
            // Incorrect password specified.
        }
        if (future.Error is Gs2.Gs2Account.Exception.BannedInfinityException)
        {
            // Account has been suspended.
        }
        onError.Invoke(future.Error, null);
        yield break;
    }
    var future2 = future.Result.ModelFuture();
    yield return future2;
    if (future2.Error != null)
    {
        onError.Invoke(future2.Error, null);
        yield break;
    }
    var result = future2.Result;
    var banStatuses = future.Result.BanStatuses;
    var body = future.Result.Body;
    var signature = future.Result.Signature;
    const auto Domain = Gs2->Account->Namespace(
        "namespace-0001" // namespaceName
    )->Account(
        "user-0001" // userId
    );
    const auto Future = Domain->Authentication(
        "password-0001", // password
        "grn:gs2:ap-northeast-1:owner_id:key:namespace-0001:key:key-0001" // keyId
    );
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        auto e = Future->GetTask().Error();
        if (e->IsChildOf(Gs2::Account::Error::FPasswordIncorrectError::Class))
        {
            // Incorrect password specified.
        }
        if (e->IsChildOf(Gs2::Account::Error::FBannedInfinityError::Class))
        {
            // Account has been suspended.
        }
        return false;
    }

    // obtain changed values / result values
    const auto Future2 = Future->GetTask().Result()->Model();
    Future2->StartSynchronousTask();
    if (Future2->GetTask().IsError())
    {
        return Future2->GetTask().Error();
    }
    const auto Result = Future2->GetTask().Result();
    const auto BanStatuses = Result->BanStatuses;
    const auto Body = Result->Body;
    const auto Signature = Result->Signature;

create

新しいゲームプレイヤーアカウントを作成する

ゲームを初めて起動したときに呼び出し、プレイヤーのアカウントを作成します。
作成に成功すると、ユーザーIDとパスワードが返されます。
この2つの値はゲームデータのセーブ領域(PlayerPrefs やローカルセーブなど)に保存し、次回のログインに使ってください。

パスワードは自動的にランダム生成されるため、プレイヤーが自由に設定することはできません。
プレイヤーがわかりやすいID(メールアドレスやSNSアカウントなど)で引き継ぎを行いたい場合は、別途 引き継ぎ情報 を登録してください。

Request

有効化条件必須デフォルト値の制限説明
namespaceNamestring
~ 128文字ネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。

Result

説明
itemEzAccount作成したゲームプレイヤーアカウント

実装例

    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    );
    var result = await domain.CreateAsync(
    );
    var item = await result.ModelAsync();
    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    );
    var future = domain.CreateFuture(
    );
    yield return future;
    if (future.Error != null)
    {
        onError.Invoke(future.Error, null);
        yield break;
    }
    var future2 = future.Result.ModelFuture();
    yield return future2;
    if (future2.Error != null)
    {
        onError.Invoke(future2.Error, null);
        yield break;
    }
    var result = future2.Result;
    const auto Domain = Gs2->Account->Namespace(
        "namespace-0001" // namespaceName
    );
    const auto Future = Domain->Create(
    );
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        return false;
    }

    // obtain changed values / result values
    const auto Future2 = Future->GetTask().Result()->Model();
    Future2->StartSynchronousTask();
    if (Future2->GetTask().IsError())
    {
        return Future2->GetTask().Error();
    }
    const auto Result = Future2->GetTask().Result();

addTakeOverSetting

引き継ぎ情報を登録する

スマートフォンの機種変更やアプリの再インストール時に、アカウントを復元できるようにするための設定です。
引き継ぎ用ユーザーID(メールアドレスなど)と 引き継ぎ用パスワード を登録しておくと、
その組み合わせを入力することで別の端末でアカウントを引き継ぐことができます。

1つのアカウントに対して、複数の引き継ぎ方法を設定できます。
スロット番号 を分けることで、たとえばスロット0にメールアドレス、スロット1にSNSアカウントの情報を保存する、といった使い方ができます。
スロット番号は 0〜1024 の範囲で指定できます。

注意: この機能はデータの保存のみを行います。SNSアカウントとの認証連携(OAuth など)は、ゲーム側で別途実装する必要があります。

Request

有効化条件必須デフォルト値の制限説明
namespaceNamestring
~ 128文字ネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
gameSessionGameSession
GameSession
typeint
0 ~ 1024スロット番号
0から1024までの範囲で指定され、異なる引き継ぎ情報を区別します。
userIdentifierstring
~ 1024文字引き継ぎ用ユーザーID
アカウントを引き継ぐ際に使用される個人を識別するためのユニークなキーです。
異なるアカウントで同一の userIdentifier を指定した場合、後で設定した値が優先されます。
passwordstring
~ 128文字パスワード
セキュリティを考慮して、このパスワードは機密情報として扱われ、ハッシュ値のみ保存されAPIの応答には値が含まれません。

Result

説明
itemEzTakeOver作成した引き継ぎ情報

実装例

    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).TakeOver(
        type: 0,
    );
    var result = await domain.AddTakeOverSettingAsync(
        userIdentifier: "user-0001@gs2.io",
        password: "password-0001"
    );
    var item = await result.ModelAsync();
    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).TakeOver(
        type: 0,
    );
    var future = domain.AddTakeOverSettingFuture(
        userIdentifier: "user-0001@gs2.io",
        password: "password-0001"
    );
    yield return future;
    if (future.Error != null)
    {
        onError.Invoke(future.Error, null);
        yield break;
    }
    var future2 = future.Result.ModelFuture();
    yield return future2;
    if (future2.Error != null)
    {
        onError.Invoke(future2.Error, null);
        yield break;
    }
    var result = future2.Result;
    const auto Domain = Gs2->Account->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    )->TakeOver(
        0, // type
    );
    const auto Future = Domain->AddTakeOverSetting(
        "user-0001@gs2.io", // userIdentifier
        "password-0001" // password
    );
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        return false;
    }

    // obtain changed values / result values
    const auto Future2 = Future->GetTask().Result()->Model();
    Future2->StartSynchronousTask();
    if (Future2->GetTask().IsError())
    {
        return Future2->GetTask().Error();
    }
    const auto Result = Future2->GetTask().Result();

addTakeOverSettingOpenIdConnect

OpenID Connect を使って引き継ぎ情報を登録する

Google や Apple などの外部ログインサービス(OpenID Connect)の認証結果を使って、引き継ぎ情報を登録します。
この方法ではパスワードの設定は不要です。

この機能を使うには、事前にマスターデータで スロット番号 と認証サービスの対応を設定しておく必要があります。
OpenID Connect の連携設定がされたスロットでは、通常の「ユーザーID+パスワード」方式での引き継ぎ設定はできなくなります。

Request

有効化条件必須デフォルト値の制限説明
namespaceNamestring
~ 128文字ネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
gameSessionGameSession
GameSession
typeint
0 ~ 1024スロット番号
0から1024までの範囲で指定され、異なる引き継ぎ情報を区別します。
idTokenstring
~ 10240文字OpenID Connect ID Token

Result

説明
itemEzTakeOver作成した引き継ぎ情報

実装例

    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).TakeOver(
        type: 0,
    );
    var result = await domain.AddTakeOverSettingOpenIdConnectAsync(
        idToken: "0123456789"
    );
    var item = await result.ModelAsync();
    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).TakeOver(
        type: 0,
    );
    var future = domain.AddTakeOverSettingOpenIdConnectFuture(
        userIdentifier: "user-0001@gs2.io",
        idToken: "0123456789"
    );
    yield return future;
    if (future.Error != null)
    {
        onError.Invoke(future.Error, null);
        yield break;
    }
    var future2 = future.Result.ModelFuture();
    yield return future2;
    if (future2.Error != null)
    {
        onError.Invoke(future2.Error, null);
        yield break;
    }
    var result = future2.Result;
    const auto Domain = Gs2->Account->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    )->TakeOver(
        0, // type
    );
    const auto Future = Domain->AddTakeOverSettingOpenIdConnect(
        "user-0001@gs2.io", // userIdentifier
        "0123456789" // idToken
    );
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        return false;
    }

    // obtain changed values / result values
    const auto Future2 = Future->GetTask().Result()->Model();
    Future2->StartSynchronousTask();
    if (Future2->GetTask().IsError())
    {
        return Future2->GetTask().Error();
    }
    const auto Result = Future2->GetTask().Result();

deleteTakeOverSetting

引き継ぎ情報を削除する

登録済みの引き継ぎ情報を削除します。
削除後は、その引き継ぎ情報を使ったアカウントの復元はできなくなります。

Request

有効化条件必須デフォルト値の制限説明
namespaceNamestring
~ 128文字ネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
gameSessionGameSession
GameSession
typeint
0 ~ 1024スロット番号
0から1024までの範囲で指定され、異なる引き継ぎ情報を区別します。

Result

説明
itemEzTakeOver削除した引き継ぎ情報

実装例

    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    );
    var result = await domain.DeleteTakeOverSettingAsync(
        type: 0
    );
    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    );
    var future = domain.DeleteTakeOverSettingFuture(
        type: 0
    );
    yield return future;
    if (future.Error != null)
    {
        onError.Invoke(future.Error, null);
        yield break;
    }
    const auto Domain = Gs2->Account->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    );
    const auto Future = Domain->DeleteTakeOverSetting(
        0 // type
    );
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        return false;
    }
    const auto Result = Future->GetTask().Result();

doTakeOver

アカウントの引き継ぎを実行する

引き継ぎ用ユーザーID引き継ぎ用パスワード を入力して、アカウントを引き継ぎます。
入力した情報が一致した場合、紐づけられたアカウントの ユーザーIDパスワード が返されます。
返されたユーザーIDとパスワードをセーブデータに保存して、次回以降のログインに使ってください。

Request

有効化条件必須デフォルト値の制限説明
namespaceNamestring
~ 128文字ネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
typeint
0 ~ 1024スロット番号
0から1024までの範囲で指定され、異なる引き継ぎ情報を区別します。
userIdentifierstring
~ 1024文字引き継ぎ用ユーザーID
アカウントを引き継ぐ際に使用される個人を識別するためのユニークなキーです。
異なるアカウントで同一の userIdentifier を指定した場合、後で設定した値が優先されます。
passwordstring
~ 128文字パスワード
セキュリティを考慮して、このパスワードは機密情報として扱われ、ハッシュ値のみ保存されAPIの応答には値が含まれません。

Result

説明
itemEzAccountゲームプレイヤーアカウント

Error

このAPIには特別な例外が定義されています。
GS2-SDK for GameEngine ではゲーム内でハンドリングが必要そうなエラーは一般的な例外から派生した特殊化した例外を用意することでハンドリングしやすくしています。
一般的なエラーの種類や、ハンドリング方法は こちら のドキュメントを参考にしてください。

基底クラス説明
PasswordIncorrectExceptionUnauthorizedExceptionパスワードの指定が不適切です

実装例

try {
    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    );
    var result = await domain.DoTakeOverAsync(
        type: 0,
        userIdentifier: "user-0001@gs2.io",
        password: "password-0001"
    );
    var item = await result.ModelAsync();
} catch(Gs2.Gs2Account.Exception.PasswordIncorrectException e) {
    // Incorrect password specified.
}
    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    );
    var future = domain.DoTakeOverFuture(
        type: 0,
        userIdentifier: "user-0001@gs2.io",
        password: "password-0001"
    );
    yield return future;
    if (future.Error != null)
    {
        if (future.Error is Gs2.Gs2Account.Exception.PasswordIncorrectException)
        {
            // Incorrect password specified.
        }
        onError.Invoke(future.Error, null);
        yield break;
    }
    var future2 = future.Result.ModelFuture();
    yield return future2;
    if (future2.Error != null)
    {
        onError.Invoke(future2.Error, null);
        yield break;
    }
    var result = future2.Result;
    const auto Domain = Gs2->Account->Namespace(
        "namespace-0001" // namespaceName
    );
    const auto Future = Domain->DoTakeOver(
        0, // type
        "user-0001@gs2.io", // userIdentifier
        "password-0001" // password
    );
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        auto e = Future->GetTask().Error();
        if (e->IsChildOf(Gs2::Account::Error::FPasswordIncorrectError::Class))
        {
            // Incorrect password specified.
        }
        return false;
    }

    // obtain changed values / result values
    const auto Future2 = Future->GetTask().Result()->Model();
    Future2->StartSynchronousTask();
    if (Future2->GetTask().IsError())
    {
        return Future2->GetTask().Error();
    }
    const auto Result = Future2->GetTask().Result();

doTakeOverOpenIdConnect

OpenID Connect を使ってアカウントの引き継ぎを実行する

Google や Apple などのログインサービス(OpenID Connect)の認証情報を使って、アカウントを引き継ぎます。
認証情報に紐づけられたアカウントの ユーザーIDパスワード が返されます。
返されたユーザーIDとパスワードをセーブデータに保存して、次回以降のログインに使ってください。

Request

有効化条件必須デフォルト値の制限説明
namespaceNamestring
~ 128文字ネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
typeint
0 ~ 1024スロット番号
0から1024までの範囲で指定され、異なる引き継ぎ情報を区別します。
idTokenstring
~ 10240文字OpenID Connect ID Token

Result

説明
itemEzAccountゲームプレイヤーアカウント

実装例

    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    );
    var result = await domain.DoTakeOverOpenIdConnectAsync(
        type: 0,
        idToken: "0123456789"
    );
    var item = await result.ModelAsync();
    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    );
    var future = domain.DoTakeOverOpenIdConnectFuture(
        type: 0,
        idToken: "0123456789"
    );
    yield return future;
    if (future.Error != null)
    {
        onError.Invoke(future.Error, null);
        yield break;
    }
    var future2 = future.Result.ModelFuture();
    yield return future2;
    if (future2.Error != null)
    {
        onError.Invoke(future2.Error, null);
        yield break;
    }
    var result = future2.Result;
    const auto Domain = Gs2->Account->Namespace(
        "namespace-0001" // namespaceName
    );
    const auto Future = Domain->DoTakeOverOpenIdConnect(
        0, // type
        "0123456789" // idToken
    );
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        return false;
    }

    // obtain changed values / result values
    const auto Future2 = Future->GetTask().Result()->Model();
    Future2->StartSynchronousTask();
    if (Future2->GetTask().IsError())
    {
        return Future2->GetTask().Error();
    }
    const auto Result = Future2->GetTask().Result();

get

指定したタイプの引き継ぎ情報を取得する

スロット番号(タイプ)を指定して、登録されている引き継ぎ情報を1件取得します。
どの引き継ぎ方法が設定されているかを確認するのに使います。
セキュリティのため、引き継ぎ用パスワードの値は取得できません。

Request

有効化条件必須デフォルト値の制限説明
namespaceNamestring
~ 128文字ネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
gameSessionGameSession
GameSession
typeint
0 ~ 1024スロット番号
0から1024までの範囲で指定され、異なる引き継ぎ情報を区別します。

Result

説明
itemEzTakeOver引き継ぎ情報

実装例

    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).TakeOver(
        type: 0,
    );
    var item = await domain.ModelAsync();
    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).TakeOver(
        type: 0,
    );
    var future = domain.ModelFuture();
    yield return future;
    var item = future.Result;
    const auto Domain = Gs2->Account->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    )->TakeOver(
        0, // type
    );
    const auto Future = Domain->Model();
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        return false;
    }
値の変更イベントハンドリング
    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).TakeOver(
        type: 0,
    );
    
    // イベントハンドリングを開始
    var callbackId = domain.Subscribe(
        value => {
            // 値が変化した時に呼び出される
            // value には変更後の値が渡ってくる
        }
    );

    // イベントハンドリングを停止
    domain.Unsubscribe(callbackId);
    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).TakeOver(
        type: 0,
    );
    
    // イベントハンドリングを開始
    var callbackId = domain.Subscribe(
        value => {
            // 値が変化した時に呼び出される
            // value には変更後の値が渡ってくる
        }
    );

    // イベントハンドリングを停止
    domain.Unsubscribe(callbackId);
    const auto Domain = Gs2->Account->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    )->TakeOver(
        0, // type
    );
    
    // イベントハンドリングを開始
    const auto CallbackId = Domain->Subscribe(
        [](TSharedPtr<Gs2::Account::Model::FTakeOver> value) {
            // 値が変化した時に呼び出される
            // value には変更後の値が渡ってくる
        }
    );

    // イベントハンドリングを停止
    Domain->Unsubscribe(CallbackId);

getAuthorizationUrl

OpenID Connect の認証URLを取得する

Google や Apple などの外部ログインサービスの認証ページへリダイレクトするためのURLを取得します。
このURLにプレイヤーを誘導することで、OpenID Connect を使った引き継ぎ情報の登録や引き継ぎの実行を開始できます。

Request

有効化条件必須デフォルト値の制限説明
namespaceNamestring
~ 128文字ネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
typeint
0 ~ 1024スロット番号
0から1024までの範囲で指定され、異なる引き継ぎ情報を区別します。

Result

説明
authorizationUrlstring認証URL

実装例

    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    );
    var result = await domain.GetAuthorizationUrlAsync(
        type: 0
    );
    var authorizationUrl = result.AuthorizationUrl;
    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    );
    var future = domain.GetAuthorizationUrlFuture(
        type: 0
    );
    yield return future;
    if (future.Error != null)
    {
        onError.Invoke(future.Error, null);
        yield break;
    }
    var authorizationUrl = future.Result.AuthorizationUrl;
    const auto Domain = Gs2->Account->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    );
    const auto Future = Domain->GetAuthorizationUrl(
        0 // type
    );
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        return false;
    }
    const auto Result = Future->GetTask().Result();
    const auto AuthorizationUrl = Result->AuthorizationUrl;

listTakeOverSettings

引き継ぎ情報の一覧を取得する

このプレイヤーに設定されている引き継ぎ情報の一覧を取得します。
セキュリティのため、引き継ぎ用パスワードの値は取得できません。

Request

有効化条件必須デフォルト値の制限説明
namespaceNamestring
~ 128文字ネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
gameSessionGameSession
GameSession
pageTokenstring~ 1024文字データの取得を開始する位置を指定するトークン
limitint301 ~ 1000データの取得件数

Result

説明
itemsList<EzTakeOver>引き継ぎ情報のリスト
nextPageTokenstringリストの続きを取得するためのページトークン

実装例

    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    );
    var items = await domain.TakeOversAsync(
    ).ToListAsync();
    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    );
    var it = domain.TakeOvers(
    );
    List<EzTakeOver> items = new List<EzTakeOver>();
    while (it.HasNext())
    {
        yield return it.Next();
        if (it.Error != null)
        {
            onError.Invoke(it.Error, null);
            break;
        }
        if (it.Current != null)
        {
            items.Add(it.Current);
        }
        else
        {
            break;
        }
    }
    const auto Domain = Gs2->Account->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    );
    const auto It = Domain->TakeOvers(
    );
    TArray<Gs2::UE5::Account::Model::FEzTakeOverPtr> Result;
    for (auto Item : *It)
    {
        if (Item.IsError())
        {
            return false;
        }
        Result.Add(Item.Current());
    }
値の変更イベントハンドリング
    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    );
    
    // イベントハンドリングを開始
    var callbackId = domain.SubscribeTakeOvers(
        () => {
            // リストの要素が変化した時に呼び出される
        }
    );

    // イベントハンドリングを停止
    domain.UnsubscribeTakeOvers(callbackId);
    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    );
    
    // イベントハンドリングを開始
    var callbackId = domain.SubscribeTakeOvers(
        () => {
            // リストの要素が変化した時に呼び出される
        }
    );

    // イベントハンドリングを停止
    domain.UnsubscribeTakeOvers(callbackId);
    const auto Domain = Gs2->Account->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    );
    
    // イベントハンドリングを開始
    const auto CallbackId = Domain->SubscribeTakeOvers(
        []() {
            // リストの要素が変化した時に呼び出される
        }
    );

    // イベントハンドリングを停止
    Domain->UnsubscribeTakeOvers(CallbackId);

updateTakeOverSetting

引き継ぎ用パスワードを変更する

引き継ぎ情報のパスワードを変更します。
変更するには、現在設定されている古いパスワードの入力が必要です。

注意: このAPIを使ってセキュアなパスワード変更を実現する場合は、
引き継ぎ情報を削除 するAPIへのアクセス権限を無効にしてください。
削除にはパスワード認証が不要なため、削除→再作成で実質的にパスワードを変更できてしまいます。

Request

有効化条件必須デフォルト値の制限説明
namespaceNamestring
~ 128文字ネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
gameSessionGameSession
GameSession
typeint
0 ~ 1024スロット番号
0から1024までの範囲で指定され、異なる引き継ぎ情報を区別します。
oldPasswordstring
~ 128文字古いパスワード
passwordstring
~ 128文字パスワード
セキュリティを考慮して、このパスワードは機密情報として扱われ、ハッシュ値のみ保存されAPIの応答には値が含まれません。

Result

説明
itemEzTakeOver更新した引き継ぎ情報

Error

このAPIには特別な例外が定義されています。
GS2-SDK for GameEngine ではゲーム内でハンドリングが必要そうなエラーは一般的な例外から派生した特殊化した例外を用意することでハンドリングしやすくしています。
一般的なエラーの種類や、ハンドリング方法は こちら のドキュメントを参考にしてください。

基底クラス説明
PasswordIncorrectExceptionUnauthorizedExceptionパスワードの指定が不適切です

実装例

try {
    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).TakeOver(
        type: 0,
    );
    var result = await domain.UpdateTakeOverSettingAsync(
        oldPassword: "password-0001",
        password: "password-1001"
    );
    var item = await result.ModelAsync();
} catch(Gs2.Gs2Account.Exception.PasswordIncorrectException e) {
    // Incorrect password specified.
}
    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).TakeOver(
        type: 0,
    );
    var future = domain.UpdateTakeOverSettingFuture(
        oldPassword: "password-0001",
        password: "password-1001"
    );
    yield return future;
    if (future.Error != null)
    {
        if (future.Error is Gs2.Gs2Account.Exception.PasswordIncorrectException)
        {
            // Incorrect password specified.
        }
        onError.Invoke(future.Error, null);
        yield break;
    }
    var future2 = future.Result.ModelFuture();
    yield return future2;
    if (future2.Error != null)
    {
        onError.Invoke(future2.Error, null);
        yield break;
    }
    var result = future2.Result;
    const auto Domain = Gs2->Account->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    )->TakeOver(
        0, // type
    );
    const auto Future = Domain->UpdateTakeOverSetting(
        "password-0001", // oldPassword
        "password-1001" // password
    );
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        auto e = Future->GetTask().Error();
        if (e->IsChildOf(Gs2::Account::Error::FPasswordIncorrectError::Class))
        {
            // Incorrect password specified.
        }
        return false;
    }

    // obtain changed values / result values
    const auto Future2 = Future->GetTask().Result()->Model();
    Future2->StartSynchronousTask();
    if (Future2->GetTask().IsError())
    {
        return Future2->GetTask().Error();
    }
    const auto Result = Future2->GetTask().Result();

addPlatformIdSetting

プラットフォームIDを登録する

X(旧Twitter)、Instagram、Facebook などの外部サービスにおけるユーザーIDを、ゲームアカウントに紐づけて保存します。

タイプ(スロット番号)には 0〜1024 の数値を指定し、プラットフォームの種類を区別します。
ユーザー識別子 には、各プラットフォームにおけるユーザーIDを指定します。

他のプレイヤーはタイプとユーザー識別子を指定して、そのプレイヤーを検索できるようになります。
たとえば、SNSのフレンドをゲーム内フレンドとして追加する機能を実装する際に利用できます。

Request

有効化条件必須デフォルト値の制限説明
namespaceNamestring
~ 128文字ネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
gameSessionGameSession
GameSession
このプラットフォームIDにリンクされた GS2-Account のユーザーIDです。外部プラットフォームのIDと GS2 の匿名アカウントとの対応付けに使用されます。
typeint
0 ~ 1024スロット番号
0から1024までの範囲で指定され、プラットフォームの種類を識別するために使用します。
userIdentifierstring
~ 1024文字各種プラットフォームにおけるユーザーID
外部プラットフォームにおけるユーザーの一意な識別子(例:ソーシャルメディアのユーザーIDやメールアドレス)です。スロット番号(type)と組み合わせて、特定のプラットフォームアカウントを識別するために使用されます。

Result

説明
itemEzPlatformId作成したプラットフォームID

実装例

    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).PlatformId(
        type: 0,
        userIdentifier: "123456"
    );
    var result = await domain.AddPlatformIdSettingAsync(
    );
    var item = await result.ModelAsync();
    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).PlatformId(
        type: 0,
        userIdentifier: "123456"
    );
    var future = domain.AddPlatformIdSettingFuture(
    );
    yield return future;
    if (future.Error != null)
    {
        onError.Invoke(future.Error, null);
        yield break;
    }
    var future2 = future.Result.ModelFuture();
    yield return future2;
    if (future2.Error != null)
    {
        onError.Invoke(future2.Error, null);
        yield break;
    }
    var result = future2.Result;
    const auto Domain = Gs2->Account->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    )->PlatformId(
        0, // type
        "123456" // userIdentifier
    );
    const auto Future = Domain->AddPlatformIdSetting(
    );
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        return false;
    }

    // obtain changed values / result values
    const auto Future2 = Future->GetTask().Result()->Model();
    Future2->StartSynchronousTask();
    if (Future2->GetTask().IsError())
    {
        return Future2->GetTask().Error();
    }
    const auto Result = Future2->GetTask().Result();

deletePlatformIdSetting

プラットフォームIDを削除する

登録済みのプラットフォームIDを削除します。
削除後は、そのプラットフォームIDを使ったプレイヤー検索ができなくなります。

Request

有効化条件必須デフォルト値の制限説明
namespaceNamestring
~ 128文字ネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
gameSessionGameSession
GameSession
このプラットフォームIDにリンクされた GS2-Account のユーザーIDです。外部プラットフォームのIDと GS2 の匿名アカウントとの対応付けに使用されます。
typeint
0 ~ 1024スロット番号
0から1024までの範囲で指定され、プラットフォームの種類を識別するために使用します。

Result

説明
itemEzPlatformId削除したプラットフォームID

実装例

    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).PlatformId(
        type: 0,
        userIdentifier: "123456"
    );
    var result = await domain.DeletePlatformIdSettingAsync(
    );
    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).PlatformId(
        type: 0,
        userIdentifier: "123456"
    );
    var future = domain.DeletePlatformIdSettingFuture(
    );
    yield return future;
    if (future.Error != null)
    {
        onError.Invoke(future.Error, null);
        yield break;
    }
    const auto Domain = Gs2->Account->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    )->PlatformId(
        0, // type
        "123456" // userIdentifier
    );
    const auto Future = Domain->DeletePlatformIdSetting(
    );
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        return false;
    }
    const auto Result = Future->GetTask().Result();

findPlatformUser

プラットフォームIDからプレイヤーを検索する

プラットフォームの種類(タイプ)とユーザー識別子を指定して、そのプラットフォームIDに紐づいたゲームプレイヤーを検索します。
たとえば、SNSのフレンドリストからゲーム内のプレイヤーを見つける際に利用できます。

Request

有効化条件必須デフォルト値の制限説明
namespaceNamestring
~ 128文字ネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
typeint
0 ~ 1024スロット番号
0から1024までの範囲で指定され、プラットフォームの種類を識別するために使用します。
userIdentifierstring
~ 1024文字各種プラットフォームにおけるユーザーID
外部プラットフォームにおけるユーザーの一意な識別子(例:ソーシャルメディアのユーザーIDやメールアドレス)です。スロット番号(type)と組み合わせて、特定のプラットフォームアカウントを識別するために使用されます。

Result

説明
itemEzPlatformUser各種プラットフォームにおけるユーザー情報

実装例

    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).PlatformId(
        type: 0,
        userIdentifier: "123456"
    );
    var result = await domain.FindPlatformUserAsync(
    );
    var item = await result.ModelAsync();
    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).PlatformId(
        type: 0,
        userIdentifier: "123456"
    );
    var future = domain.FindPlatformUserFuture(
    );
    yield return future;
    if (future.Error != null)
    {
        onError.Invoke(future.Error, null);
        yield break;
    }
    var future2 = future.Result.ModelFuture();
    yield return future2;
    if (future2.Error != null)
    {
        onError.Invoke(future2.Error, null);
        yield break;
    }
    var result = future2.Result;
    const auto Domain = Gs2->Account->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    )->PlatformId(
        0, // type
        "123456" // userIdentifier
    );
    const auto Future = Domain->FindPlatformUser(
    );
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        return false;
    }

    // obtain changed values / result values
    const auto Future2 = Future->GetTask().Result()->Model();
    Future2->StartSynchronousTask();
    if (Future2->GetTask().IsError())
    {
        return Future2->GetTask().Error();
    }
    const auto Result = Future2->GetTask().Result();

getPlatformId

指定したタイプのプラットフォームIDを取得する

スロット番号(タイプ)を指定して、登録されているプラットフォームIDを1件取得します。
特定のプラットフォームに対して、どのユーザーIDが紐づけられているかを確認するのに使います。

Request

有効化条件必須デフォルト値の制限説明
namespaceNamestring
~ 128文字ネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
gameSessionGameSession
GameSession
このプラットフォームIDにリンクされた GS2-Account のユーザーIDです。外部プラットフォームのIDと GS2 の匿名アカウントとの対応付けに使用されます。
typeint
0 ~ 1024スロット番号
0から1024までの範囲で指定され、プラットフォームの種類を識別するために使用します。

Result

説明
itemEzPlatformIdプラットフォームID

実装例

    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).PlatformId(
        type: 0,
        userIdentifier: "123456"
    );
    var item = await domain.ModelAsync();
    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).PlatformId(
        type: 0,
        userIdentifier: "123456"
    );
    var future = domain.ModelFuture();
    yield return future;
    var item = future.Result;
    const auto Domain = Gs2->Account->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    )->PlatformId(
        0, // type
        "123456" // userIdentifier
    );
    const auto Future = Domain->Model();
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        return false;
    }
値の変更イベントハンドリング
    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).PlatformId(
        type: 0,
        userIdentifier: "123456"
    );
    
    // イベントハンドリングを開始
    var callbackId = domain.Subscribe(
        value => {
            // 値が変化した時に呼び出される
            // value には変更後の値が渡ってくる
        }
    );

    // イベントハンドリングを停止
    domain.Unsubscribe(callbackId);
    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).PlatformId(
        type: 0,
        userIdentifier: "123456"
    );
    
    // イベントハンドリングを開始
    var callbackId = domain.Subscribe(
        value => {
            // 値が変化した時に呼び出される
            // value には変更後の値が渡ってくる
        }
    );

    // イベントハンドリングを停止
    domain.Unsubscribe(callbackId);
    const auto Domain = Gs2->Account->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    )->PlatformId(
        0, // type
        "123456" // userIdentifier
    );
    
    // イベントハンドリングを開始
    const auto CallbackId = Domain->Subscribe(
        [](TSharedPtr<Gs2::Account::Model::FPlatformId> value) {
            // 値が変化した時に呼び出される
            // value には変更後の値が渡ってくる
        }
    );

    // イベントハンドリングを停止
    Domain->Unsubscribe(CallbackId);

listPlatformIdSettings

登録済みのプラットフォームIDの一覧を取得する

このプレイヤーに紐づけられている外部サービスのID情報の一覧を取得します。
どのプラットフォームのIDが登録されているかを確認するのに使います。

Request

有効化条件必須デフォルト値の制限説明
namespaceNamestring
~ 128文字ネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
gameSessionGameSession
GameSession
pageTokenstring~ 1024文字データの取得を開始する位置を指定するトークン
limitint301 ~ 1000データの取得件数

Result

説明
itemsList<EzPlatformId>プラットフォームIDのリスト
nextPageTokenstringリストの続きを取得するためのページトークン

実装例

    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    );
    var items = await domain.PlatformIdsAsync(
    ).ToListAsync();
    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    );
    var it = domain.PlatformIds(
    );
    List<EzPlatformId> items = new List<EzPlatformId>();
    while (it.HasNext())
    {
        yield return it.Next();
        if (it.Error != null)
        {
            onError.Invoke(it.Error, null);
            break;
        }
        if (it.Current != null)
        {
            items.Add(it.Current);
        }
        else
        {
            break;
        }
    }
    const auto Domain = Gs2->Account->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    );
    const auto It = Domain->PlatformIds(
    );
    TArray<Gs2::UE5::Account::Model::FEzPlatformIdPtr> Result;
    for (auto Item : *It)
    {
        if (Item.IsError())
        {
            return false;
        }
        Result.Add(Item.Current());
    }
値の変更イベントハンドリング
    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    );
    
    // イベントハンドリングを開始
    var callbackId = domain.SubscribePlatformIds(
        () => {
            // リストの要素が変化した時に呼び出される
        }
    );

    // イベントハンドリングを停止
    domain.UnsubscribePlatformIds(callbackId);
    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    );
    
    // イベントハンドリングを開始
    var callbackId = domain.SubscribePlatformIds(
        () => {
            // リストの要素が変化した時に呼び出される
        }
    );

    // イベントハンドリングを停止
    domain.UnsubscribePlatformIds(callbackId);
    const auto Domain = Gs2->Account->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    );
    
    // イベントハンドリングを開始
    const auto CallbackId = Domain->SubscribePlatformIds(
        []() {
            // リストの要素が変化した時に呼び出される
        }
    );

    // イベントハンドリングを停止
    Domain->UnsubscribePlatformIds(CallbackId);