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

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

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



## モデル

### EzStatus

スキルツリーの解放状況<br>

特定のプレイヤーとプロパティに対するスキルツリーの解放状態を追跡するモデルです。<br>
解放済み（アンロック済み）のノード名のリストを管理します。ノードは解放（リストに追加）、拘束（リストから削除）、リセット（全クリア）が可能です。<br>
既に解放済みのノードを解放しようとしたり、未解放のノードを拘束しようとするとエラーになります。<br>
ユーザーが初めてアクセスした際に自動作成されます。

|  | 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 |
| --- | --- | --- | --- | --- | --- | --- |
| statusId | string |  | ※ |  |  ~ 1024文字 | ステータスGRN<br>※ サーバーが自動で設定 |
| userId | string |  | ✓ |  |  ~ 128文字 | ユーザーID |
| releasedNodeNames | List&lt;string&gt; |  |  | [] | 0 ~ 1000 items | 解放済みノードモデル名リスト<br>このスキルツリーでプレイヤーがアンロックしたノードモデル名のリスト。<br>解放（追加）、拘束（削除）、リセット（全クリア）操作により更新されます。<br>最大1000エントリ。 |

**関連するメソッド:**
getStatus - プレイヤーのスキルツリーの進行状況を取得する
release - スキルツリーのノードを解放する
reset - スキルツリー全体をリセットする（フルリスペック）
restrain - 特定のノードをロック状態に戻す


---

### EzNodeModel

ノードモデル<br>

スキルツリー内のノードを定義するモデルで、解放コスト・前提条件・返却動作を含みます。<br>
各ノードには検証アクション（解放前の条件チェック）、消費アクション（支払うコスト）、先に解放が必要な前提ノードを設定できます。<br>
ノードを拘束（未解放状態に戻す）すると、消費したリソースが返却率に基づいて部分的に返却されます。<br>
返却入手アクションは消費アクションに返却率を乗じて自動的に計算されます。

|  | 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 |
| --- | --- | --- | --- | --- | --- | --- |
| name | string |  | ✓ |  |  ~ 128文字 | ノードモデル名<br>ノードモデル固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。 |
| metadata | string |  |  |  |  ~ 2048文字 | メタデータ<br>メタデータには任意の値を設定できます。<br>これらの値は GS2 の動作には影響しないため、ゲーム内で利用する情報の保存先として使用できます。 |
| releaseVerifyActions | [List&lt;EzVerifyAction&gt;](#ezverifyaction) |  |  | [] | 0 ~ 10 items | 解放検証アクションリスト<br>このノードを解放する前に実行され、条件が満たされているかを確認する検証アクションのリスト。<br>例えば、プレイヤーが特定のレベルに達しているか、特定のアイテムを所持しているかを検証できます。<br>いずれかの検証アクションが失敗すると、ノード解放は拒否されます。最大10アクション。 |
| releaseConsumeActions | [List&lt;EzConsumeAction&gt;](#ezconsumeaction) |  |  | [] | 1 ~ 10 items | 解放消費アクションリスト<br>このノードを解放する際に実行される消費アクションのリストで、解放コストを表します。<br>これらのアクションは返却入手アクションの計算にも使用されます。ノードを拘束する際、各消費アクションが返却率に基づいて逆転されます。<br>最低1つの消費アクションが必要です。最大10アクション。 |
| returnAcquireActions | [List&lt;EzAcquireAction&gt;](#ezacquireaction) |  |  |  | 0 ~ 10 items | 返却入手アクションリスト<br>このノードを拘束（取り消し）する際に実行される入手アクションのリストで、プレイヤーに返却されるリソースを表します。<br>このフィールドは解放消費アクションに返却率を乗じて自動生成されます。<br>例えば、解放コストが100ゴールドで返却率が0.8の場合、拘束時に80ゴールドが返却されます。<br>最大10アクション。 |
| restrainReturnRate | float |  |  | 1.0 | 0.0 ~ 1.0 | 返却率<br>このノードを拘束（未解放状態に戻す）した際に消費リソースが返却される割合。<br>1.0 は全額返却、0.5 は半額返却、0.0 は返却なしを意味します。<br>デフォルトは 1.0（全額返却）。有効範囲: 0.0〜1.0。 |

**関連するメソッド:**
getNodeModel - 特定のスキルツリーノードの詳細を取得する
listNodeModels - スキルツリーの全ノードの一覧を取得する


---

### EzConfig

コンフィグ設定<br>

トランザクションの変数に適用する設定値

|  | 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 |
| --- | --- | --- | --- | --- | --- | --- |
| key | string |  | ✓ |  |  ~ 64文字 | 名前 |
| value | string |  |  |  |  ~ 51200文字 | 値 |


---

### EzAcquireAction

入手アクション

|  | 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 |
| --- | --- | --- | --- | --- | --- | --- |
| action | 文字列列挙型<br>enum {<br>}<br> |  | ✓ |  |  | 入手アクションで実行するアクションの種類 |
| request | string |  | ✓ |  |  ~ 524288文字 | アクション実行時に使用されるリクエストのJSON文字列 |


**関連するモデル:**
EzNodeModel - ノードモデル



---

### EzConsumeAction

消費アクション

|  | 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 |
| --- | --- | --- | --- | --- | --- | --- |
| action | 文字列列挙型<br>enum {<br>}<br> |  | ✓ |  |  | 消費アクションで実行するアクションの種類 |
| request | string |  | ✓ |  |  ~ 524288文字 | アクション実行時に使用されるリクエストのJSON文字列 |


**関連するモデル:**
EzNodeModel - ノードモデル



---

### EzVerifyAction

検証アクション

|  | 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 |
| --- | --- | --- | --- | --- | --- | --- |
| action | 文字列列挙型<br>enum {<br>}<br> |  | ✓ |  |  | 検証アクションで実行するアクションの種類 |
| request | string |  | ✓ |  |  ~ 524288文字 | アクション実行時に使用されるリクエストのJSON文字列 |


**関連するモデル:**
EzNodeModel - ノードモデル



---

### EzVerifyActionResult

検証アクションの実行結果

|  | 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 |
| --- | --- | --- | --- | --- | --- | --- |
| action | 文字列列挙型<br>enum {<br>}<br> |  | ✓ |  |  | 検証アクションで実行するアクションの種類 |
| verifyRequest | string |  | ✓ |  |  ~ 524288文字 | アクション実行時に使用されるリクエストのJSON文字列 |
| statusCode | int |  |  |  | 0 ~ 999 | ステータスコード |
| verifyResult | string |  |  |  |  ~ 1048576文字 | 結果内容 |


**関連するモデル:**
EzTransactionResult - トランザクション実行結果



---

### EzConsumeActionResult

消費アクションの実行結果

|  | 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 |
| --- | --- | --- | --- | --- | --- | --- |
| action | 文字列列挙型<br>enum {<br>}<br> |  | ✓ |  |  | 消費アクションで実行するアクションの種類 |
| consumeRequest | string |  | ✓ |  |  ~ 524288文字 | アクション実行時に使用されるリクエストのJSON文字列 |
| statusCode | int |  |  |  | 0 ~ 999 | ステータスコード |
| consumeResult | string |  |  |  |  ~ 1048576文字 | 結果内容 |


**関連するモデル:**
EzTransactionResult - トランザクション実行結果



---

### EzAcquireActionResult

入手アクションの実行結果

|  | 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 |
| --- | --- | --- | --- | --- | --- | --- |
| action | 文字列列挙型<br>enum {<br>}<br> |  | ✓ |  |  | 入手アクションで実行するアクションの種類 |
| acquireRequest | string |  | ✓ |  |  ~ 524288文字 | アクション実行時に使用されるリクエストのJSON文字列 |
| statusCode | int |  |  |  | 0 ~ 999 | ステータスコード |
| acquireResult | string |  |  |  |  ~ 1048576文字 | 結果内容 |


**関連するモデル:**
EzTransactionResult - トランザクション実行結果



---

### EzTransactionResult

トランザクション実行結果<br>

サーバーサイドでのトランザクションの自動実行機能を利用して実行されたトランザクションの実行結果

|  | 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 |
| --- | --- | --- | --- | --- | --- | --- |
| transactionId | string |  | ✓ |  | 36 ~ 36文字 | トランザクションID |
| verifyResults | [List&lt;EzVerifyActionResult&gt;](#ezverifyactionresult) |  |  |  | 0 ~ 10 items | 検証アクションの実行結果リスト |
| consumeResults | [List&lt;EzConsumeActionResult&gt;](#ezconsumeactionresult) |  |  | [] | 0 ~ 10 items | 消費アクションの実行結果リスト |
| acquireResults | [List&lt;EzAcquireActionResult&gt;](#ezacquireactionresult) |  |  | [] | 0 ~ 100 items | 入手アクションの実行結果リスト |

**関連するメソッド:**
release - スキルツリーのノードを解放する
reset - スキルツリー全体をリセットする（フルリスペック）
restrain - 特定のノードをロック状態に戻す


---

## メソッド

### getNodeModel

特定のスキルツリーノードの詳細を取得する<br>

ノード名を指定して、前提条件、解放コスト、返還設定を含む詳細を取得します。<br>

プレイヤーがスキルツリーでノードをタップした際に詳細情報を表示する場合に使います。たとえば:<br>
- 「パワーストライク」— 必要: 通常攻撃（解放済み）。コスト: スキルポイント3。効果: 攻撃力+50%<br>
- ノードの拘束返還率が80%なら、このノードを戻す際にコストの80%が返還される<br>

レスポンスには以下が含まれます:<br>
- 前提ノード名: 先に解放が必要なノードのリスト<br>
- 解放時の消費アクション: 解放に必要なコスト（例: スキルポイント3消費）<br>
- 解放時の検証アクション: 解放を許可する前にチェックされる条件（例: プレイヤーレベル >= 10）<br>
- 拘束返還率: ノードを戻す際に返還されるリソースの割合（0.0〜1.0）

#### Request

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

#### Result

|  | 型 | 説明 |
| --- | --- | --- |
| item | [EzNodeModel](#eznodemodel) | ノードモデル|

#### 実装例




**Unity (UniTask)**
```csharp
    var domain = gs2.SkillTree.Namespace(
        namespaceName: "namespace-0001"
    ).NodeModel(
        nodeModelName: "node-0001"
    );
    var item = await domain.ModelAsync();

```

**Unity (Vanilla)**
```cs
    var domain = gs2.SkillTree.Namespace(
        namespaceName: "namespace-0001"
    ).NodeModel(
        nodeModelName: "node-0001"
    );
    var future = domain.ModelFuture();
    yield return future;
    var item = future.Result;

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->SkillTree->Namespace(
        "namespace-0001" // namespaceName
    )->NodeModel(
        "node-0001" // nodeModelName
    );
    const auto Future = Domain->Model();
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        return false;
    }

```


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




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

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

```

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

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

```

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

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

```


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

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

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

---

### listNodeModels

スキルツリーの全ノードの一覧を取得する<br>

スキルツリーのすべてのノード定義を取得します。<br>
各ノードはプレイヤーがリソースを消費して解放（アンロック）できるスキル、能力、または強化を表します。<br>

スキルツリーは分岐構造で、ノードには前提条件があります。後のノードを解放するには先のノードを解放済みにしておく必要があります。<br>
たとえば「通常攻撃」→「パワーストライク」→「クリティカルスラッシュ」のように、各ノードの解放には前のノードが必要です。<br>

各ノード定義には以下が含まれます:<br>
- 前提ノード: このノードを解放する前に解放済みである必要がある他のノード<br>
- 解放コスト: ノードを解放するためにプレイヤーが消費するリソース（例: スキルポイント、ゴールド、素材）<br>
- 解放条件: 追加で満たす必要がある要件（例: 最低レベル）<br>
- 拘束返還率: プレイヤーが後でこのノードを戻す（ロックする）際に返還されるリソースの割合<br>

スキルツリーUIを構築する際に使います。全ノードを描画し、前提条件に基づいて接続し、どのノードが解放可能かを表示できます。

#### Request

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

#### Result

|  | 型 | 説明 |
| --- | --- | --- |
| items | [List&lt;EzNodeModel&gt;](#eznodemodel) | ノードモデルのリスト|

#### 実装例




**Unity (UniTask)**
```csharp
    var domain = gs2.SkillTree.Namespace(
        namespaceName: "namespace-0001"
    );
    var items = await domain.NodeModelsAsync(
    ).ToListAsync();

```

**Unity (Vanilla)**
```cs
    var domain = gs2.SkillTree.Namespace(
        namespaceName: "namespace-0001"
    );
    var it = domain.NodeModels(
    );
    List<EzNodeModel> items = new List<EzNodeModel>();
    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->SkillTree->Namespace(
        "namespace-0001" // namespaceName
    );
    const auto It = Domain->NodeModels(
    );
    TArray<Gs2::UE5::SkillTree::Model::FEzNodeModelPtr> Result;
    for (auto Item : *It)
    {
        if (Item.IsError())
        {
            return false;
        }
        Result.Add(Item.Current());
    }

```


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




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

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

```

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

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

```

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

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

```


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

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

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

---

### getStatus

プレイヤーのスキルツリーの進行状況を取得する<br>

指定されたプロパティIDのスキルツリーで、プレイヤーがどのノードを解放（アンロック）済みかを取得します。<br>

propertyId はどのスキルツリーのインスタンスを参照するかを特定します。ゲームがキャラクターごとに1つのスキルツリーを持つ場合、propertyId にはキャラクターIDを使えます。<br>
たとえば戦士キャラクターと魔法使いキャラクターはそれぞれ異なる propertyId で別々のスキルツリー進行状況が管理されます。<br>

スキルツリー画面を描画する際に使います。ListNodeModels でツリー全体の構造を取得し、プレイヤーの解放状態を重ねて表示します:<br>
- 解放済みノード（アンロック済み、ハイライト表示）<br>
- 解放可能ノード（前提条件を満たしている、次に解放できる）<br>
- ロック中ノード（前提条件を満たしていない、グレーアウト表示）

#### Request

|  | 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 |
| --- | --- | --- | --- | --- | --- | --- |
| namespaceName | string |  | ✓|  |  ~ 128文字 | ネームスペース名<br>ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。 |
| gameSession | GameSession | | ✓|  |  | GameSession |
| propertyId | string |  | ✓|  |  ~ 1024文字 | プロパティID<br>ユーザーごとに複数の独立したスキルツリーインスタンスを持つための識別子。<br>同一ネームスペース内で、プレイヤーが異なるキャラクターやコンテキストに対して別々のスキルツリーを持つシナリオを実現します。<br>最大1024文字。 |

#### Result

|  | 型 | 説明 |
| --- | --- | --- |
| item | [EzStatus](#ezstatus) | ステータス|

#### 実装例




**Unity (UniTask)**
```csharp
    var domain = gs2.SkillTree.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).Status(
        propertyId: "property-0001"
    );
    var item = await domain.ModelAsync();

```

**Unity (Vanilla)**
```cs
    var domain = gs2.SkillTree.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).Status(
        propertyId: "property-0001"
    );
    var future = domain.ModelFuture();
    yield return future;
    var item = future.Result;

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->SkillTree->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    )->Status(
        "property-0001" // propertyId
    );
    const auto Future = Domain->Model();
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        return false;
    }

```


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




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

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

```

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

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

```

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

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

```


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

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

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

---

### release

スキルツリーのノードを解放する<br>

スキルツリーの1つまたは複数のノードを解放（アンロック）します。プレイヤーが必要なリソースを消費し、ノードが有効になります。<br>

スキルツリーUIの「スキル習得」「アンロック」ボタンに対応します。プレイヤーが解放したいノードをタップすると:<br>
1. すべての前提ノードが既に解放済みかチェックされる<br>
2. 解放条件（検証アクション）がチェックされる（例: プレイヤーの最低レベル）<br>
3. 解放コスト（消費アクション）が差し引かれる（例: スキルポイント3消費）<br>
4. ノードが解放済みとしてマークされる<br>

複数のノード名を渡すことで一度に複数のノードを解放できます。各ノードの前提条件とコストがそれぞれ検証されます。<br>

前提条件が満たされていない場合や、プレイヤーのリソースが不足している場合は解放が失敗し、リソースは消費されません。

#### Request

|  | 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 |
| --- | --- | --- | --- | --- | --- | --- |
| namespaceName | string |  | ✓|  |  ~ 128文字 | ネームスペース名<br>ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。 |
| gameSession | GameSession | | ✓|  |  | GameSession |
| nodeModelNames | List&lt;string&gt; |  | ✓|  | 1 ~ 1000 items | ノードモデル名のリスト |
| propertyId | string |  | ✓|  |  ~ 1024文字 | プロパティID<br>ユーザーごとに複数の独立したスキルツリーインスタンスを持つための識別子。<br>同一ネームスペース内で、プレイヤーが異なるキャラクターやコンテキストに対して別々のスキルツリーを持つシナリオを実現します。<br>最大1024文字。 |

#### Result

|  | 型 | 説明 |
| --- | --- | --- |
| item | [EzStatus](#ezstatus) | ステータス|
| transactionId | string | 発行されたトランザクションID|
| stampSheet | string | 解放処理の実行に使用するスタンプシート|
| stampSheetEncryptionKeyId | string | スタンプシートの署名計算に使用した暗号鍵GRN|
| autoRunStampSheet | bool | トランザクションの自動実行が有効か|
| atomicCommit | bool | トランザクションをアトミックにコミットするか|
| transaction | string | 発行されたトランザクション|
| transactionResult | [EzTransactionResult](#eztransactionresult) | トランザクション実行結果|

#### 実装例




**Unity (UniTask)**
```csharp
    var domain = gs2.SkillTree.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).Status(
        propertyId: "property-0001"
    );
    var result = await domain.ReleaseAsync(
        nodeModelNames: new List<string> {
            "node-0001",
        }
    );
    // New Experience ではスタンプシートはSDKレベルで自動的に実行されます。
    // エラーが発生すると TransactionException がスローされます。
    // TransactionException::Retry() でリトライが可能です。

```

**Unity (Vanilla)**
```cs
    var domain = gs2.SkillTree.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).Status(
        propertyId: "property-0001"
    );
    var future = domain.ReleaseFuture(
        nodeModelNames: new List<string> {
            "node-0001",
        }
    );
    yield return future;
    if (future.Error != null)
    {
        onError.Invoke(future.Error, null);
        yield break;
    }
    // New Experience ではスタンプシートはSDKレベルで自動的に実行されます。
    // エラーが発生すると TransactionException がスローされます。
    // TransactionException::Retry() でリトライが可能です。

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->SkillTree->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    )->Status(
        "property-0001" // propertyId
    );
    const auto Future = Domain->Release(
        []
        {
            auto v = TOptional<TArray<FString>>();
            v->Add("node-0001");
            return v;
        }() // nodeModelNames
    );
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        return false;
    }

```


---

### reset

スキルツリー全体をリセットする（フルリスペック）<br>

スキルツリーのすべての解放済みノードを一括で未解放状態に戻します。各ノードの拘束返還率に基づいてリソースが返還されます。<br>

「全スキルリセット」「フルリスペック」ボタンに対応します。プレイヤーはスキルツリーをゼロからやり直します。<br>

たとえばプレイヤーが様々なコストで10個のノードを解放済みの場合、10個すべてが戻され、設定された返還率に基づいてそれぞれ部分的な返金が行われます。<br>

主な使い方:<br>
- プレイヤーが異なる戦略でスキルツリーを組み直せる「リスペック」機能<br>
- 全プレイヤーがゼロからやり直すシーズンリセット<br>
- ゲームバランスの変更で現在のビルドが最適でなくなった際に、プレイヤーに再調整させたい場合<br>

Restrain（特定のノードを選択的に戻す）とは異なり、Reset は依存関係に関係なくツリー全体に影響します。

#### Request

|  | 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 |
| --- | --- | --- | --- | --- | --- | --- |
| namespaceName | string |  | ✓|  |  ~ 128文字 | ネームスペース名<br>ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。 |
| gameSession | GameSession | | ✓|  |  | GameSession |
| propertyId | string |  | ✓|  |  ~ 1024文字 | プロパティID<br>ユーザーごとに複数の独立したスキルツリーインスタンスを持つための識別子。<br>同一ネームスペース内で、プレイヤーが異なるキャラクターやコンテキストに対して別々のスキルツリーを持つシナリオを実現します。<br>最大1024文字。 |

#### Result

|  | 型 | 説明 |
| --- | --- | --- |
| item | [EzStatus](#ezstatus) | ステータス|
| transactionId | string | 発行されたトランザクションID|
| stampSheet | string | リセット処理の実行に使用するスタンプシート|
| stampSheetEncryptionKeyId | string | スタンプシートの署名計算に使用した暗号鍵GRN|
| autoRunStampSheet | bool | トランザクションの自動実行が有効か|
| atomicCommit | bool | トランザクションをアトミックにコミットするか|
| transaction | string | 発行されたトランザクション|
| transactionResult | [EzTransactionResult](#eztransactionresult) | トランザクション実行結果|

#### 実装例




**Unity (UniTask)**
```csharp
    var domain = gs2.SkillTree.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).Status(
        propertyId: "property-0001"
    );
    var result = await domain.ResetAsync(
    );
    // New Experience ではスタンプシートはSDKレベルで自動的に実行されます。
    // エラーが発生すると TransactionException がスローされます。
    // TransactionException::Retry() でリトライが可能です。

```

**Unity (Vanilla)**
```cs
    var domain = gs2.SkillTree.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).Status(
        propertyId: "property-0001"
    );
    var future = domain.ResetFuture(
    );
    yield return future;
    if (future.Error != null)
    {
        onError.Invoke(future.Error, null);
        yield break;
    }
    // New Experience ではスタンプシートはSDKレベルで自動的に実行されます。
    // エラーが発生すると TransactionException がスローされます。
    // TransactionException::Retry() でリトライが可能です。

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->SkillTree->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    )->Status(
        "property-0001" // propertyId
    );
    const auto Future = Domain->Reset(
    );
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        return false;
    }

```


---

### restrain

特定のノードをロック状態に戻す<br>

解放済みの1つまたは複数のノードを未解放状態に戻します。各ノードの拘束返還率に基づいて、解放時に消費したリソースの一部が返還されます。<br>

「部分的なリスペック」機能です。スキルツリー全体をリセットする代わりに、特定のノードだけを選んで取り消せます。<br>

たとえばノードの解放に100ゴールドかかり、拘束返還率が0.8（80%）の場合、拘束時に80ゴールドが返還されます。<br>

重要なルール:<br>
- 他の解放済みノードが依存しているノード（前提条件として参照されているノード）は拘束できない<br>
- 他の解放済みノードの前提となっているノードを拘束するには、先に依存するノードを拘束する必要がある<br>
- これによりスキルツリーは常に有効な状態が保たれます（孤立したノードが発生しません）<br>

スキルツリーUIの「スキル取り消し」「元に戻す」機能として使います。

#### Request

|  | 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 |
| --- | --- | --- | --- | --- | --- | --- |
| namespaceName | string |  | ✓|  |  ~ 128文字 | ネームスペース名<br>ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。 |
| gameSession | GameSession | | ✓|  |  | GameSession |
| nodeModelNames | List&lt;string&gt; |  | ✓|  | 1 ~ 1000 items | ノードモデル名のリスト |
| propertyId | string |  | ✓|  |  ~ 1024文字 | プロパティID<br>ユーザーごとに複数の独立したスキルツリーインスタンスを持つための識別子。<br>同一ネームスペース内で、プレイヤーが異なるキャラクターやコンテキストに対して別々のスキルツリーを持つシナリオを実現します。<br>最大1024文字。 |

#### Result

|  | 型 | 説明 |
| --- | --- | --- |
| item | [EzStatus](#ezstatus) | ステータス|
| transactionId | string | 発行されたトランザクションID|
| stampSheet | string | 未解放状態に戻す処理の実行に使用するスタンプシート|
| stampSheetEncryptionKeyId | string | スタンプシートの署名計算に使用した暗号鍵GRN|
| autoRunStampSheet | bool | トランザクションの自動実行が有効か|
| atomicCommit | bool | トランザクションをアトミックにコミットするか|
| transaction | string | 発行されたトランザクション|
| transactionResult | [EzTransactionResult](#eztransactionresult) | トランザクション実行結果|

#### 実装例




**Unity (UniTask)**
```csharp
    var domain = gs2.SkillTree.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).Status(
        propertyId: "property-0001"
    );
    var result = await domain.RestrainAsync(
        nodeModelNames: new List<string> {
            "node-0001",
        }
    );
    // New Experience ではスタンプシートはSDKレベルで自動的に実行されます。
    // エラーが発生すると TransactionException がスローされます。
    // TransactionException::Retry() でリトライが可能です。

```

**Unity (Vanilla)**
```cs
    var domain = gs2.SkillTree.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).Status(
        propertyId: "property-0001"
    );
    var future = domain.RestrainFuture(
        nodeModelNames: new List<string> {
            "node-0001",
        }
    );
    yield return future;
    if (future.Error != null)
    {
        onError.Invoke(future.Error, null);
        yield break;
    }
    // New Experience ではスタンプシートはSDKレベルで自動的に実行されます。
    // エラーが発生すると TransactionException がスローされます。
    // TransactionException::Retry() でリトライが可能です。

```

**Unreal Engine 5**
```cpp
    const auto Domain = Gs2->SkillTree->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    )->Status(
        "property-0001" // propertyId
    );
    const auto Future = Domain->Restrain(
        []
        {
            auto v = TOptional<TArray<FString>>();
            v->Add("node-0001");
            return v;
        }() // nodeModelNames
    );
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        return false;
    }

```


---



