> For the complete documentation index, see [llms.txt](/llms.txt)

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

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



## モデル

### EzAccount

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

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

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

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

**関連するメソッド:**
authentication - アカウントにログインする
create - 新しいアカウントを作成する
doTakeOver - アカウントの引き継ぎを実行する
doTakeOverOpenIdConnect - OpenID Connect を使ってアカウントの引き継ぎを実行する


---

### EzTakeOver

引き継ぎ情報<br>

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

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

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

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

**関連するメソッド:**
addTakeOverSetting - 引き継ぎ情報を登録する
addTakeOverSettingOpenIdConnect - OpenID Connect を使って引き継ぎ情報を登録する
deleteTakeOverSetting - 引き継ぎ情報を削除する
get - 指定したタイプの引き継ぎ情報を取得する
listTakeOverSettings - 引き継ぎ情報の一覧を取得する
updateTakeOverSetting - 引き継ぎ用パスワードを変更する


---

### EzPlatformId

外部プラットフォームのアカウントID<br>

X、Instagram、Facebook などの外部サービスのユーザー識別子を保持します。<br>
他のプレイヤーは外部プラットフォームのアカウント情報を使用して、GS2-Account ユーザーIDを検索することができます。<br>

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

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

**関連するメソッド:**
addPlatformIdSetting - 外部プラットフォームのアカウントIDを登録する
deletePlatformIdSetting - 外部プラットフォームのアカウントIDを削除する
getPlatformId - 指定したスロット番号の外部プラットフォームのアカウントIDを取得する
listPlatformIdSettings - 登録済みの外部プラットフォームのアカウントIDの一覧を取得する


---

### EzPlatformUser

外部プラットフォームのユーザー情報<br>

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

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

**関連するメソッド:**
findPlatformUser - スロット番号と外部プラットフォームのアカウントIDからGS2-Account ユーザーIDを検索する


---

### EzBanStatus

アカウントBANステータス<br>

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

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

**関連するメソッド:**
authentication - アカウントにログインする


---

## メソッド

### authentication

アカウントにログインする<br>

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

通常は GS2-Profile::Login を使うことで、この処理と [GS2-Auth::Login](../../auth/game_engine/#login) をまとめて実行できます。<br>
詳しくは「はじめかた」のサンプルプログラムを参照してください。<br>

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

#### Request

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

#### Result

|  | 型 | 説明 |
| --- | --- | --- |
| item | [EzAccount](#ezaccount) | ゲームプレイヤーアカウント|
| banStatuses | [List&lt;EzBanStatus&gt;](#ezbanstatus) | BAN状態リスト|
| body | string | 署名対象のアカウント認証情報|
| signature | string | 署名|

#### Error

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

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

#### 実装例




**Unity (UniTask)**
```csharp

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.
}

```

**Unity (Vanilla)**
```cs
    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;

```

**Unreal Engine 5**
```cpp
    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

新しいアカウントを作成する<br>

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

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

#### Request

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

#### Result

|  | 型 | 説明 |
| --- | --- | --- |
| item | [EzAccount](#ezaccount) | 作成したゲームプレイヤーアカウント|

#### 実装例




**Unity (UniTask)**
```csharp
    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    );
    var result = await domain.CreateAsync(
    );
    var item = await result.ModelAsync();

```

**Unity (Vanilla)**
```cs
    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;

```

**Unreal Engine 5**
```cpp
    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

引き継ぎ情報を登録する<br>

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

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

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

#### Request

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

#### Result

|  | 型 | 説明 |
| --- | --- | --- |
| item | [EzTakeOver](#eztakeover) | 作成した引き継ぎ情報|

#### 実装例




**Unity (UniTask)**
```csharp
    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();

```

**Unity (Vanilla)**
```cs
    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;

```

**Unreal Engine 5**
```cpp
    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 を使って引き継ぎ情報を登録する<br>

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

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

#### Request

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

#### Result

|  | 型 | 説明 |
| --- | --- | --- |
| item | [EzTakeOver](#eztakeover) | 作成した引き継ぎ情報|

#### 実装例




**Unity (UniTask)**
```csharp
    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();

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).TakeOver(
        type: 0,
    );
    var future = domain.AddTakeOverSettingOpenIdConnectFuture(
        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;

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->Account->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    )->TakeOver(
        0, // type
    );
    const auto Future = Domain->AddTakeOverSettingOpenIdConnect(
        "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

引き継ぎ情報を削除する<br>

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

#### Request

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

#### Result

|  | 型 | 説明 |
| --- | --- | --- |
| item | [EzTakeOver](#eztakeover) | 削除した引き継ぎ情報|

#### 実装例




**Unity (UniTask)**
```csharp
    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    );
    var result = await domain.DeleteTakeOverSettingAsync(
        type: 0
    );

```

**Unity (Vanilla)**
```cs
    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;
    }

```

**Unreal Engine 5**
```cpp
    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

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

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

#### Request

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

#### Result

|  | 型 | 説明 |
| --- | --- | --- |
| item | [EzAccount](#ezaccount) | ゲームプレイヤーアカウント|

#### Error

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

| 型 | 基底クラス | 説明 |
| --- | --- | --- |
| PasswordIncorrectException | UnauthorizedException | パスワードの指定が不適切です |

#### 実装例




**Unity (UniTask)**
```csharp

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.
}

```

**Unity (Vanilla)**
```cs
    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;

```

**Unreal Engine 5**
```cpp
    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 を使ってアカウントの引き継ぎを実行する<br>

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

#### Request

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

#### Result

|  | 型 | 説明 |
| --- | --- | --- |
| item | [EzAccount](#ezaccount) | ゲームプレイヤーアカウント|

#### 実装例




**Unity (UniTask)**
```csharp
    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    );
    var result = await domain.DoTakeOverOpenIdConnectAsync(
        type: 0,
        idToken: "0123456789"
    );
    var item = await result.ModelAsync();

```

**Unity (Vanilla)**
```cs
    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;

```

**Unreal Engine 5**
```cpp
    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

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

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

#### Request

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

#### Result

|  | 型 | 説明 |
| --- | --- | --- |
| item | [EzTakeOver](#eztakeover) | 引き継ぎ情報|

#### 実装例




**Unity (UniTask)**
```csharp
    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).TakeOver(
        type: 0,
    );
    var item = await domain.ModelAsync();

```

**Unity (Vanilla)**
```cs
    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;

```

**Unreal Engine 5**
```cpp
    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;
    }

```


##### 値の変更イベントハンドリング




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

    // イベントハンドリングを停止
    domain.Unsubscribe(callbackId);

```

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

    // イベントハンドリングを停止
    domain.Unsubscribe(callbackId);

```

**Unreal Engine 5**
```cpp
    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);

```


{{% alert title="Warning" color="warning" %}}このイベントはSDKがもつローカルキャッシュの値が変更された時に呼び出されます。

ローカルキャッシュは SDK が持つ API の実行、または GS2-Gateway の通知を有効にした GS2-Distributor 経由でのスタンプシートの実行、または GS2-Gateway の通知を有効にした GS2-JobQueue の実行によって変化したもののみが対象となります。

そのため、これらの方法以外で値が変更されてもコールバックは呼び出されません。
{{% /alert %}}

---

### getAuthorizationUrl

OpenID Connect の認証URLを取得する<br>

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

#### Request

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

#### Result

|  | 型 | 説明 |
| --- | --- | --- |
| authorizationUrl | string | 認証URL|

#### 実装例




**Unity (UniTask)**
```csharp
    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    );
    var result = await domain.GetAuthorizationUrlAsync(
        type: 0
    );
    var authorizationUrl = result.AuthorizationUrl;

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    );
    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;

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->Account->Namespace(
        "namespace-0001" // namespaceName
    );
    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

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

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

#### Request

|  | 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 |
| --- | --- | --- | --- | --- | --- | --- |
| namespaceName | string |  | ✓|  |  ~ 128文字 | ネームスペース名<br>ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。 |
| gameSession | GameSession | | ✓|  |  | GameSession |
| pageToken | string |  | |  |  ~ 1024文字 | データの取得を開始する位置を指定するトークン |
| limit | int |  | | 30 | 1 ~ 1000 | データの取得件数 |

#### Result

|  | 型 | 説明 |
| --- | --- | --- |
| items | [List&lt;EzTakeOver&gt;](#eztakeover) | 引き継ぎ情報のリスト|
| nextPageToken | string | リストの続きを取得するためのページトークン|

#### 実装例




**Unity (UniTask)**
```csharp
    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    );
    var items = await domain.TakeOversAsync(
    ).ToListAsync();

```

**Unity (Vanilla)**
```cs
    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;
        }
    }

```

**Unreal Engine 5**
```cpp
    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());
    }

```


##### 値の変更イベントハンドリング




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

    // イベントハンドリングを停止
    domain.UnsubscribeTakeOvers(callbackId);

```

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

    // イベントハンドリングを停止
    domain.UnsubscribeTakeOvers(callbackId);

```

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

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

```


{{% alert title="Warning" color="warning" %}}このイベントはSDKがもつローカルキャッシュの値が変更された時に呼び出されます。

ローカルキャッシュは SDK が持つ API の実行、または GS2-Gateway の通知を有効にした GS2-Distributor 経由でのスタンプシートの実行、または GS2-Gateway の通知を有効にした GS2-JobQueue の実行によって変化したもののみが対象となります。

そのため、これらの方法以外で値が変更されてもコールバックは呼び出されません。
{{% /alert %}}

---

### updateTakeOverSetting

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

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

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

#### Request

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

#### Result

|  | 型 | 説明 |
| --- | --- | --- |
| item | [EzTakeOver](#eztakeover) | 更新した引き継ぎ情報|

#### Error

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

| 型 | 基底クラス | 説明 |
| --- | --- | --- |
| PasswordIncorrectException | UnauthorizedException | パスワードの指定が不適切です |

#### 実装例




**Unity (UniTask)**
```csharp

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.
}

```

**Unity (Vanilla)**
```cs
    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;

```

**Unreal Engine 5**
```cpp
    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を登録する<br>

X（旧Twitter）、Instagram、Facebook などの外部サービスにおけるユーザーIDを、GS2のゲームプレイヤーアカウントに紐づけて保存します。<br>

`type`には 0〜1024 の数値を指定し、プラットフォームの種類を区別します。<br>
`userIdentifier`には、外部プラットフォームのユーザーIDを指定します。<br>

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

#### Request

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

#### Result

|  | 型 | 説明 |
| --- | --- | --- |
| item | [EzPlatformId](#ezplatformid) | 作成した外部プラットフォームのアカウントID|

#### 実装例




**Unity (UniTask)**
```csharp
    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).PlatformId(
        type: 0,
    );
    var result = await domain.AddPlatformIdSettingAsync(
        userIdentifier: "user-0001@gs2.io"
    );
    var item = await result.ModelAsync();

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).PlatformId(
        type: 0,
    );
    var future = domain.AddPlatformIdSettingFuture(
        userIdentifier: "user-0001@gs2.io"
    );
    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;

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->Account->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    )->PlatformId(
        0, // type
    );
    const auto Future = Domain->AddPlatformIdSetting(
        "user-0001@gs2.io" // userIdentifier
    );
    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を削除する<br>

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

#### Request

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

#### Result

|  | 型 | 説明 |
| --- | --- | --- |
| item | [EzPlatformId](#ezplatformid) | 削除した外部プラットフォームのアカウントID|

#### 実装例




**Unity (UniTask)**
```csharp
    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).PlatformId(
        type: 0,
    );
    var result = await domain.DeletePlatformIdSettingAsync(
    );

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).PlatformId(
        type: 0,
    );
    var future = domain.DeletePlatformIdSettingFuture(
    );
    yield return future;
    if (future.Error != null)
    {
        onError.Invoke(future.Error, null);
        yield break;
    }

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->Account->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    )->PlatformId(
        0, // type
    );
    const auto Future = Domain->DeletePlatformIdSetting(
    );
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        return false;
    }
    const auto Result = Future->GetTask().Result();

```


---

### findPlatformUser

スロット番号と外部プラットフォームのアカウントIDからGS2-Account ユーザーIDを検索する<br>

`type` (スロット番号)と `userIdentifier` (外部プラットフォームのユーザーID)を指定して、その外部プラットフォームのアカウントIDに紐づいたゲームプレイヤーを検索します。<br>
たとえば、SNSのフレンドリストからゲーム内のプレイヤーを見つける際に利用できます。

#### Request

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

#### Result

|  | 型 | 説明 |
| --- | --- | --- |
| item | [EzPlatformUser](#ezplatformuser) | 外部プラットフォームのユーザー情報|

#### 実装例




**Unity (UniTask)**
```csharp
    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).PlatformId(
        type: 0,
    );
    var result = await domain.FindPlatformUserAsync(
        userIdentifier: "user-0001@gs2.io"
    );
    var item = await result.ModelAsync();

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).PlatformId(
        type: 0,
    );
    var future = domain.FindPlatformUserFuture(
        userIdentifier: "user-0001@gs2.io"
    );
    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;

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->Account->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    )->PlatformId(
        0, // type
    );
    const auto Future = Domain->FindPlatformUser(
        "user-0001@gs2.io" // userIdentifier
    );
    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を取得する<br>

`type` （スロット番号）を指定して、登録されている外部サービスのアカウントを1件取得します。<br>
特定のプラットフォームに対して、どのユーザーIDが紐づけられているかを確認するのに使います。

#### Request

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

#### Result

|  | 型 | 説明 |
| --- | --- | --- |
| item | [EzPlatformId](#ezplatformid) | 外部プラットフォームのアカウントID|

#### 実装例




**Unity (UniTask)**
```csharp
    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).PlatformId(
        type: 0,
    );
    var item = await domain.ModelAsync();

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).PlatformId(
        type: 0,
    );
    var future = domain.ModelFuture();
    yield return future;
    var item = future.Result;

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->Account->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    )->PlatformId(
        0, // type
    );
    const auto Future = Domain->Model();
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        return false;
    }

```


##### 値の変更イベントハンドリング




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

    // イベントハンドリングを停止
    domain.Unsubscribe(callbackId);

```

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

    // イベントハンドリングを停止
    domain.Unsubscribe(callbackId);

```

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

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

```


{{% alert title="Warning" color="warning" %}}このイベントはSDKがもつローカルキャッシュの値が変更された時に呼び出されます。

ローカルキャッシュは SDK が持つ API の実行、または GS2-Gateway の通知を有効にした GS2-Distributor 経由でのスタンプシートの実行、または GS2-Gateway の通知を有効にした GS2-JobQueue の実行によって変化したもののみが対象となります。

そのため、これらの方法以外で値が変更されてもコールバックは呼び出されません。
{{% /alert %}}

---

### listPlatformIdSettings

登録済みの外部プラットフォームのアカウントIDの一覧を取得する<br>

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

#### Request

|  | 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 |
| --- | --- | --- | --- | --- | --- | --- |
| namespaceName | string |  | ✓|  |  ~ 128文字 | ネームスペース名<br>ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。 |
| gameSession | GameSession | | ✓|  |  | GameSession |
| pageToken | string |  | |  |  ~ 1024文字 | データの取得を開始する位置を指定するトークン |
| limit | int |  | | 30 | 1 ~ 1000 | データの取得件数 |

#### Result

|  | 型 | 説明 |
| --- | --- | --- |
| items | [List&lt;EzPlatformId&gt;](#ezplatformid) | 外部プラットフォームアカウントIDのリスト|
| nextPageToken | string | リストの続きを取得するためのページトークン|

#### 実装例




**Unity (UniTask)**
```csharp
    var domain = gs2.Account.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    );
    var items = await domain.PlatformIdsAsync(
    ).ToListAsync();

```

**Unity (Vanilla)**
```cs
    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;
        }
    }

```

**Unreal Engine 5**
```cpp
    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());
    }

```


##### 値の変更イベントハンドリング




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

    // イベントハンドリングを停止
    domain.UnsubscribePlatformIds(callbackId);

```

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

    // イベントハンドリングを停止
    domain.UnsubscribePlatformIds(callbackId);

```

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

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

```


{{% alert title="Warning" color="warning" %}}このイベントはSDKがもつローカルキャッシュの値が変更された時に呼び出されます。

ローカルキャッシュは SDK が持つ API の実行、または GS2-Gateway の通知を有効にした GS2-Distributor 経由でのスタンプシートの実行、または GS2-Gateway の通知を有効にした GS2-JobQueue の実行によって変化したもののみが対象となります。

そのため、これらの方法以外で値が変更されてもコールバックは呼び出されません。
{{% /alert %}}

---



