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

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

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



## モデル

### EzStamina

スタミナ<br>

スタミナとは現実時間の時間経過で回復するポイントです。<br>
一般的にこのスタミナを消費してゲームをプレイできるようにすることで、プレイヤーの1日のプレイ回数を制限し、ゲームの進行速度をゲーム提供側がコントロールする目的で使用されます。

|  | 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 |
| --- | --- | --- | --- | --- | --- | --- |
| staminaName | string |  | ✓ |  |  ~ 128文字 | スタミナモデル名<br>このスタミナインスタンスの回復パラメータ、容量、テーブル参照を定義する StaminaModel の名前。<br>ユーザーごとのスタミナ状態を対応するモデル定義に紐づけます。 |
| value | int |  | ✓ |  | 0 ~ 2147483646 | スタミナ値<br>オーバーフロー分を除く、このユーザーの現在のスタミナ量。<br>回復間隔と回復量に基づいて時間経過で自動的に増加し、maxValue まで回復します。<br>lastRecoveredAt からの経過時間を用いて recoverSteps = elapsedMinutes / recoverIntervalMinutes の式で計算されます。 |
| overflowValue | int |  | ✓ |  | 0 ~ 2147483646 | オーバーフロー値<br>通常の最大値（maxValue）を超えて格納されているスタミナ量。<br>StaminaModel の isOverflow が有効な場合のみ使用されます。実効スタミナの合計は value + overflowValue で、maxCapacity が上限です。<br>スタミナ消費時はオーバーフロー分が先に消費されます。 |
| maxValue | int |  | ✓ |  | 1 ~ 2147483646 | スタミナの最大値<br>StaminaModel から解決され、オプションでプレイヤーの GS2-Experience ランクに基づく MaxStaminaTable でオーバーライドされるユーザーごとのスタミナ最大値。<br>オーバーフロー無効時は initialCapacity が下限となります。オーバーフロー有効時は maxCapacity が上限となります。<br>自然回復はこの値で停止します。 |
| recoverIntervalMinutes | int |  |  |  | 1 ~ 2147483646 | スタミナの回復間隔（分）<br>StaminaModel から解決され、オプションでプレイヤーの GS2-Experience ランクに基づく RecoverIntervalTable でオーバーライドされるユーザーごとの回復間隔（分）。<br>テーブルが設定されていない場合、モデルのデフォルト recoverIntervalMinutes にフォールバックします。 |
| recoverValue | int |  |  |  | 1 ~ 2147483646 | スタミナの回復量<br>StaminaModel から解決され、オプションでプレイヤーの GS2-Experience ランクに基づく RecoverValueTable でオーバーライドされるユーザーごとのティックあたりの回復量。<br>テーブルが設定されていない場合、モデルのデフォルト recoverValue にフォールバックします。 |
| nextRecoverAt | long |  |  |  |  | 次回回復時刻<br>次のスタミナ回復ティックが発生する Unix タイムスタンプ（ミリ秒）。<br>lastRecoveredAt + recoverIntervalMinutes * 60 * 1000 で計算されます。スタミナが既に maxValue の場合、このフィールドは未設定になることがあります。 |

**関連するメソッド:**
apply - スタミナの時間経過による自然回復を適用する
consume - スタミナを使用（消費）する
getStamina - 特定の種別のプレイヤーの現在スタミナを取得する
listStaminas - プレイヤーのスタミナ値一覧を取得する
setMaxValue - プレイヤーレベルに基づいてスタミナ上限を更新する
setRecoverInterval - プレイヤーレベルに基づいてスタミナ回復間隔を更新する
setRecoverValue - プレイヤーレベルに基づいてスタミナ回復量を更新する


---

### EzStaminaModel

スタミナモデル<br>

スタミナの最大値や、回復間隔、回復量といったパラメータを定義できます。<br>
GS2-Experience と連動させて、最大値や回復量をコントロールすることもできます。

|  | 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 |
| --- | --- | --- | --- | --- | --- | --- |
| name | string |  | ✓ |  |  ~ 128文字 | スタミナモデル名<br>スタミナモデル固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。 |
| metadata | string |  |  |  |  ~ 128文字 | メタデータ<br>メタデータには任意の値を設定できます。<br>これらの値は GS2 の動作には影響しないため、ゲーム内で利用する情報の保存先として使用できます。 |
| recoverIntervalMinutes | int |  | ✓ |  | 0 ~ 2147483646 | 回復間隔（分）<br>スタミナ回復ティックの間隔（分単位）。<br>この間隔が経過するたびに、プレイヤーのスタミナが回復量分だけ増加します。<br>RecoverIntervalTable を使用して GS2-Experience のランクごとにユーザー単位でオーバーライド可能です。<br>0 に設定すると時間ベースの自動回復が無効になります。 |
| recoverValue | int |  |  | 1 | 0 ~ 2147483646 | 回復量<br>回復ティックごとに回復するスタミナの量。<br>回復間隔が経過するたびに、最大値に達するまでこの値分スタミナが増加します。<br>RecoverValueTable を使用して GS2-Experience のランクごとにユーザー単位でオーバーライド可能です。<br>デフォルトは 1。 |
| initialCapacity | int |  | ✓ |  | 0 ~ 2147483646 | 最大値の初期値<br>全プレイヤーに対するデフォルトのスタミナ最大値。<br>オーバーフローが無効の場合、ユーザーごとの最大値の下限として機能します。<br>MaxStaminaTable を使用して GS2-Experience のランクごとにユーザー単位でオーバーライド可能です。 |
| isOverflow | bool |  | ✓ |  |  | オーバーフロー可否<br>アイテム使用などの手段でスタミナが初期最大値を超えられるかどうか。<br>有効の場合、スタミナは initialCapacity を超えて maxCapacity まで設定可能です。自然回復は通常の最大値で停止します。<br>無効の場合、ユーザーごとの最大値は initialCapacity 以上に制限されます。 |
| maxCapacity | int | {isOverflow} == true | ✓※ |  | 0 ~ 2147483646 | オーバーフロー時の最大値<br>オーバーフロー有効時のスタミナの絶対上限値。<br>オーバーフローでもスタミナはこの値を超えることはできません。isOverflow が true の場合のみ表示されます。<br>例えば initialCapacity が 100、maxCapacity が 200 の場合、アイテムでスタミナを 200 まで増やせますが、自然回復は 100 で停止します。<br><br>※ isOverflow が true であれば 必須 |
| maxStaminaTable | [EzMaxStaminaTable](#ezmaxstaminatable) |  |  |  |  | スタミナ最大値テーブル<br>プレイヤーの GS2-Experience ランクに基づいてスタミナ最大値を動的に決定する MaxStaminaTable への参照。<br>設定時、プレイヤーの最大スタミナは現在のランクインデックスでテーブルから参照され、initialCapacity をオーバーライドします。<br>未設定の場合、全プレイヤーが同じ initialCapacity を最大値として共有します。 |
| recoverIntervalTable | [EzRecoverIntervalTable](#ezrecoverintervaltable) |  |  |  |  | 回復間隔テーブル<br>プレイヤーの GS2-Experience ランクに基づいて回復間隔を動的に決定する RecoverIntervalTable への参照。<br>設定時、プレイヤーの回復間隔は現在のランクインデックスでテーブルから参照され、recoverIntervalMinutes をオーバーライドします。<br>未設定の場合、全プレイヤーが同じ recoverIntervalMinutes を共有します。 |
| recoverValueTable | [EzRecoverValueTable](#ezrecovervaluetable) |  |  |  |  | 回復量テーブル<br>プレイヤーの GS2-Experience ランクに基づいて回復量を動的に決定する RecoverValueTable への参照。<br>設定時、プレイヤーの回復量は現在のランクインデックスでテーブルから参照され、recoverValue をオーバーライドします。<br>未設定の場合、全プレイヤーが同じ recoverValue を共有します。 |

**関連するメソッド:**
getStaminaModel - 特定のスタミナ種別の定義を取得する
listStaminaModels - スタミナ種別の定義一覧を取得する
apply - スタミナの時間経過による自然回復を適用する
consume - スタミナを使用（消費）する
getStamina - 特定の種別のプレイヤーの現在スタミナを取得する
setMaxValue - プレイヤーレベルに基づいてスタミナ上限を更新する
setRecoverInterval - プレイヤーレベルに基づいてスタミナ回復間隔を更新する
setRecoverValue - プレイヤーレベルに基づいてスタミナ回復量を更新する


---

### EzMaxStaminaTable

スタミナ最大値テーブル<br>

スタミナ最大値テーブルは、GS2-Experience のランクごとにスタミナの最大値を定義するエンティティです。

|  | 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 |
| --- | --- | --- | --- | --- | --- | --- |
| name | string |  | ✓ |  |  ~ 128文字 | スタミナ最大値テーブル名<br>スタミナ最大値テーブル固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。 |
| metadata | string |  |  |  |  ~ 128文字 | メタデータ<br>メタデータには任意の値を設定できます。<br>これらの値は GS2 の動作には影響しないため、ゲーム内で利用する情報の保存先として使用できます。 |
| experienceModelId | string |  | ✓ |  |  ~ 1024文字 | 経験値モデルID<br>プレイヤーの現在のランクを参照するために使用する GS2-Experience の ExperienceModel の GRN。<br>ランクインデックスが values リストの配列インデックスとして使用され、ユーザーごとのスタミナ最大値が決定されます。 |
| values | List&lt;int&gt; |  | ✓ |  | 1 ~ 1024 items | ランク毎のスタミナ最大値<br>プレイヤーの GS2-Experience ランクインデックスで索引されるスタミナ最大値の配列。<br>インデックス i の値がランク i のプレイヤーの最大スタミナとして使用されます。配列長は参照先の ExperienceModel で定義されたランク数と一致させる必要があります。 |


**関連するモデル:**
EzStaminaModel - スタミナモデル



---

### EzRecoverIntervalTable

回復間隔テーブル<br>

回復間隔テーブルは、GS2-Experience のランクごとにスタミナの回復間隔を定義するエンティティです。

|  | 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 |
| --- | --- | --- | --- | --- | --- | --- |
| name | string |  | ✓ |  |  ~ 128文字 | 回復間隔テーブル名<br>回復間隔テーブル固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。 |
| metadata | string |  |  |  |  ~ 128文字 | メタデータ<br>メタデータには任意の値を設定できます。<br>これらの値は GS2 の動作には影響しないため、ゲーム内で利用する情報の保存先として使用できます。 |
| experienceModelId | string |  | ✓ |  |  ~ 1024文字 | 経験値モデルID<br>プレイヤーの現在のランクを参照するために使用する GS2-Experience の ExperienceModel の GRN。<br>ランクインデックスが values リストの配列インデックスとして使用され、ユーザーごとの回復間隔が決定されます。 |
| values | List&lt;int&gt; |  | ✓ |  | 1 ~ 1024 items | ランク毎の回復間隔<br>プレイヤーの GS2-Experience ランクインデックスで索引される回復間隔値（分単位）の配列。<br>インデックス i の値がランク i のプレイヤーの回復間隔として使用され、モデルのデフォルト recoverIntervalMinutes をオーバーライドします。 |


**関連するモデル:**
EzStaminaModel - スタミナモデル



---

### EzRecoverValueTable

スタミナ回復量テーブル<br>

スタミナ回復量テーブルは、GS2-Experience のランクごとにスタミナの回復量を定義するエンティティです。

|  | 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 |
| --- | --- | --- | --- | --- | --- | --- |
| name | string |  | ✓ |  |  ~ 128文字 | スタミナ回復量テーブル名<br>スタミナ回復量テーブル固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。 |
| metadata | string |  |  |  |  ~ 128文字 | メタデータ<br>メタデータには任意の値を設定できます。<br>これらの値は GS2 の動作には影響しないため、ゲーム内で利用する情報の保存先として使用できます。 |
| experienceModelId | string |  | ✓ |  |  ~ 1024文字 | 経験値モデルID<br>プレイヤーの現在のランクを参照するために使用する GS2-Experience の ExperienceModel の GRN。<br>ランクインデックスが values リストの配列インデックスとして使用され、ユーザーごとの回復量が決定されます。 |
| values | List&lt;int&gt; |  | ✓ |  | 1 ~ 1024 items | ランク毎の回復量<br>プレイヤーの GS2-Experience ランクインデックスで索引される回復量値の配列。<br>インデックス i の値がランク i のプレイヤーのティックあたりの回復量として使用され、モデルのデフォルト recoverValue をオーバーライドします。 |


**関連するモデル:**
EzStaminaModel - スタミナモデル



---

## メソッド

### getStaminaModel

特定のスタミナ種別の定義を取得する<br>

特定のスタミナの種別定義を取得します。<br>
レスポンスには、回復間隔（どのくらいの頻度で回復するか）、回復量（1回にどれだけ回復するか）、最大容量、オーバーフロー設定が含まれます。<br>
特定のスタミナの種別ルールを表示するのに使います。たとえば、スタミナ詳細画面で「アクションスタミナ: 5分ごとに1回復、最大100」のように表示するのに便利です。

#### Request

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

#### Result

|  | 型 | 説明 |
| --- | --- | --- |
| item | [EzStaminaModel](#ezstaminamodel) | スタミナモデル|

#### 実装例




**Unity (UniTask)**
```csharp
    var domain = gs2.Stamina.Namespace(
        namespaceName: "namespace-0001"
    ).StaminaModel(
        staminaName: "stamina-0001"
    );
    var item = await domain.ModelAsync();

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Stamina.Namespace(
        namespaceName: "namespace-0001"
    ).StaminaModel(
        staminaName: "stamina-0001"
    );
    var future = domain.ModelFuture();
    yield return future;
    var item = future.Result;

```

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

```


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




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

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

```

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

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

```

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

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

```


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

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

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

---

### listStaminaModels

スタミナ種別の定義一覧を取得する<br>

ゲームに設定されたすべてのスタミナモデル定義を取得します。<br>
スタミナモデルは、スタミナの種別ごとのルールを定義します。時間経過での回復速度、1回の回復量、最大容量、最大値を超えたオーバーフローの可否などが含まれます。<br>
たとえば「アクションスタミナ」（5分ごとに1回復、最大100）と「アリーナチケット」（2時間ごとに1回復、最大5）のように別々のスタミナモデルを用意できます。<br>
一部のスタミナモデルはプレイヤーレベル（GS2-Experience経由）に連動させることもでき、レベルが高いプレイヤーほどスタミナ上限が増えたり回復が早くなったりします。<br>
ヘルプ画面や設定画面で、利用可能なスタミナの種類とルールを表示するのに使います。

#### Request

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

#### Result

|  | 型 | 説明 |
| --- | --- | --- |
| items | [List&lt;EzStaminaModel&gt;](#ezstaminamodel) | スタミナモデルのリスト|

#### 実装例




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

```

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

```


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




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

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

```

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

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

```

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

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

```


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

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

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

---

### apply

スタミナの時間経過による自然回復を適用する<br>

最後の更新からの経過時間に基づいてスタミナがどれだけ回復したかを計算し、現在値に反映します。<br>
スタミナは時間経過で自動的に回復します。たとえば、回復間隔が5分、回復量が1の場合、プレイヤーは5分ごとにスタミナが1ずつ最大値まで回復します。<br>
通常、スタミナ値を読み取る際にサーバーが自動的に回復を計算します。このAPIを明示的に呼ぶのは、最新の回復値をサーバーに確実に書き込みたい場合です。たとえば、GS2のトランザクションで管理されていないアクションの前にスタミナが足りているか確認する場合に便利です。

#### Request

|  | 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 |
| --- | --- | --- | --- | --- | --- | --- |
| namespaceName | string |  | ✓|  |  ~ 128文字 | ネームスペース名<br>ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。 |
| staminaName | string |  | ✓|  |  ~ 128文字 | スタミナモデル名<br>このスタミナインスタンスの回復パラメータ、容量、テーブル参照を定義する StaminaModel の名前。<br>ユーザーごとのスタミナ状態を対応するモデル定義に紐づけます。 |
| gameSession | GameSession | | ✓|  |  | GameSession |

#### Result

|  | 型 | 説明 |
| --- | --- | --- |
| item | [EzStamina](#ezstamina) | スタミナ|
| staminaModel | [EzStaminaModel](#ezstaminamodel) | スタミナモデル|

#### 実装例




**Unity (UniTask)**
```csharp
    var domain = gs2.Stamina.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).Stamina(
        staminaName: "stamina-0001"
    );
    var result = await domain.ApplyAsync(
    );
    var item = await result.ModelAsync();

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Stamina.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).Stamina(
        staminaName: "stamina-0001"
    );
    var future = domain.ApplyFuture(
    );
    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->Stamina->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    )->Stamina(
        "stamina-0001" // staminaName
    );
    const auto Future = Domain->Apply(
    );
    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();

```


---

### consume

スタミナを使用（消費）する<br>

プレイヤーの現在のスタミナから指定した量を差し引きます。<br>
スタミナが足りない場合はエラーとなり、消費は行われません。スタミナがゼロ以下になることはありません。<br>
たとえば、クエストに20スタミナ必要でプレイヤーが15しか持っていない場合、消費は失敗し「スタミナが足りません」というメッセージを表示できます。<br>
注意: 多くの場合、スタミナの消費はGS2-QuestやGS2-Showcaseがクエスト開始や購入時に自動的に処理します。このAPIを直接呼ぶ必要があるのは、それらのフロー外でスタミナを消費したい場合のみです。たとえば、独自のミニゲームやトレーニング機能でスタミナを消費する場合に便利です。

#### Request

|  | 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 |
| --- | --- | --- | --- | --- | --- | --- |
| namespaceName | string |  | ✓|  |  ~ 128文字 | ネームスペース名<br>ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。 |
| staminaName | string |  | ✓|  |  ~ 128文字 | スタミナモデル名<br>このスタミナインスタンスの回復パラメータ、容量、テーブル参照を定義する StaminaModel の名前。<br>ユーザーごとのスタミナ状態を対応するモデル定義に紐づけます。 |
| gameSession | GameSession | | ✓|  |  | GameSession |
| consumeValue | int |  | ✓|  | 1 ~ 2147483646 | 消費するスタミナ量 |

#### Result

|  | 型 | 説明 |
| --- | --- | --- |
| item | [EzStamina](#ezstamina) | スタミナ|
| staminaModel | [EzStaminaModel](#ezstaminamodel) | スタミナモデル|

#### Error

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

| 型 | 基底クラス | 説明 |
| --- | --- | --- |
| InsufficientException | BadRequestException | スタミナの残量が不足しています |

#### 実装例




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

try {
    var domain = gs2.Stamina.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).Stamina(
        staminaName: "stamina-0001"
    );
    var result = await domain.ConsumeAsync(
        consumeValue: 50
    );
    var item = await result.ModelAsync();
} catch(Gs2.Gs2Stamina.Exception.InsufficientException e) {
    // Insufficient remaining stamina.
}

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Stamina.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).Stamina(
        staminaName: "stamina-0001"
    );
    var future = domain.ConsumeFuture(
        consumeValue: 50
    );
    yield return future;
    if (future.Error != null)
    {
        if (future.Error is Gs2.Gs2Stamina.Exception.InsufficientException)
        {
            // Insufficient remaining stamina.
        }
        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->Stamina->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    )->Stamina(
        "stamina-0001" // staminaName
    );
    const auto Future = Domain->Consume(
        50 // consumeValue
    );
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        auto e = Future->GetTask().Error();
        if (e->IsChildOf(Gs2::Stamina::Error::FInsufficientError::Class))
        {
            // Insufficient remaining stamina.
        }
        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();

```


---

### getStamina

特定の種別のプレイヤーの現在スタミナを取得する<br>

特定のスタミナ種別について、プレイヤーの現在のスタミナ値をモデル定義とともに取得します。<br>
レスポンスには、現在値、最大容量、回復間隔、回復量、オーバーフロー量が含まれます。<br>
特定のスタミナゲージを表示するのに使います。たとえば、クエスト開始画面で「アクションスタミナ: 45/100」をプログレスバーとともに表示し、「全回復まで4時間35分」と表示するのに便利です。

#### Request

|  | 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 |
| --- | --- | --- | --- | --- | --- | --- |
| namespaceName | string |  | ✓|  |  ~ 128文字 | ネームスペース名<br>ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。 |
| staminaName | string |  | ✓|  |  ~ 128文字 | スタミナモデル名<br>このスタミナインスタンスの回復パラメータ、容量、テーブル参照を定義する StaminaModel の名前。<br>ユーザーごとのスタミナ状態を対応するモデル定義に紐づけます。 |
| gameSession | GameSession | | ✓|  |  | GameSession |

#### Result

|  | 型 | 説明 |
| --- | --- | --- |
| item | [EzStamina](#ezstamina) | スタミナ|
| staminaModel | [EzStaminaModel](#ezstaminamodel) | スタミナモデル|

#### 実装例




**Unity (UniTask)**
```csharp
    var domain = gs2.Stamina.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).Stamina(
        staminaName: "stamina-0001"
    );
    var item = await domain.ModelAsync();

```

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

```

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

```


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




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

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

```

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

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

```

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

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

```


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

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

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

---

### listStaminas

プレイヤーのスタミナ値一覧を取得する<br>

プレイヤーの全スタミナ種別における現在のスタミナ値を取得します。<br>
各エントリには、スタミナ種別ごとの現在値、最大容量、回復状況が含まれます。<br>
スタミナの概要を表示するのに使います。たとえば、ホーム画面やステータスバーで「アクションスタミナ: 85/100（全回復まで1時間15分）」「アリーナチケット: 3/5（次の回復まで1時間30分）」のように表示するのに便利です。

#### Request

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

#### Result

|  | 型 | 説明 |
| --- | --- | --- |
| items | [List&lt;EzStamina&gt;](#ezstamina) | スタミナのリスト|
| nextPageToken | string | リストの続きを取得するためのページトークン|

#### 実装例




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

```

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

```


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




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

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

```

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

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

```

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

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

```


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

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

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

---

### setMaxValue

プレイヤーレベルに基づいてスタミナ上限を更新する<br>

GS2-Experienceのプレイヤーの現在レベル（ランク）に基づいて、スタミナの最大容量を更新します。<br>
スタミナモデルには「スタミナ最大値テーブル」を設定でき、プレイヤーレベルとスタミナ上限を対応させます。たとえば、レベル1=上限50、レベル10=上限80、レベル50=上限150のように設定できます。<br>
このAPIを呼ぶと、署名付きGS2-Experienceステータスからプレイヤーの現在レベルを読み取り、テーブルから対応するスタミナ上限を参照して更新します。<br>
プレイヤーがレベルアップした後にスタミナ上限を更新するのに使います。たとえば、レベルアップ時にこのAPIを呼び、スタミナ上限を80から85に増やすといった処理に便利です。

#### Request

|  | 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 |
| --- | --- | --- | --- | --- | --- | --- |
| namespaceName | string |  | ✓|  |  ~ 128文字 | ネームスペース名<br>ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。 |
| staminaName | string |  | ✓|  |  ~ 128文字 | スタミナモデル名<br>このスタミナインスタンスの回復パラメータ、容量、テーブル参照を定義する StaminaModel の名前。<br>ユーザーごとのスタミナ状態を対応するモデル定義に紐づけます。 |
| gameSession | GameSession | | ✓|  |  | GameSession |
| keyId | string |  | | "grn:gs2:{region}:{ownerId}:key:default:key:default" |  ~ 1024文字 | 暗号鍵GRN |
| signedStatusBody | string |  | ✓|  |  ~ 524288文字 | 署名対象の GS2-Experience ステータスのボディ |
| signedStatusSignature | string |  | ✓|  |  ~ 128文字 | GS2-Experience ステータスの署名 |

#### Result

|  | 型 | 説明 |
| --- | --- | --- |
| item | [EzStamina](#ezstamina) | スタミナ|
| old | [EzStamina](#ezstamina) | スタミナ|
| staminaModel | [EzStaminaModel](#ezstaminamodel) | スタミナモデル|

#### 実装例




**Unity (UniTask)**
```csharp
    var domain = gs2.Stamina.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).Stamina(
        staminaName: "stamina-0001"
    );
    var result = await domain.SetMaxValueAsync(
        signedStatusBody: "statusBody...",
        signedStatusSignature: "statusSignature...",
        keyId: "key-0001"
    );
    var item = await result.ModelAsync();

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Stamina.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).Stamina(
        staminaName: "stamina-0001"
    );
    var future = domain.SetMaxValueFuture(
        signedStatusBody: "statusBody...",
        signedStatusSignature: "statusSignature...",
        keyId: "key-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->Stamina->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    )->Stamina(
        "stamina-0001" // staminaName
    );
    const auto Future = Domain->SetMaxValue(
        "statusBody...", // signedStatusBody
        "statusSignature...", // signedStatusSignature
        "key-0001" // keyId
    );
    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();

```


---

### setRecoverInterval

プレイヤーレベルに基づいてスタミナ回復間隔を更新する<br>

GS2-Experienceのプレイヤーの現在レベル（ランク）に基づいて、スタミナが回復する頻度を更新します。<br>
スタミナモデルには「回復間隔テーブル」を設定でき、プレイヤーレベルと回復間隔（分）を対応させます。たとえば、レベル1=6分ごとに回復、レベル20=5分ごと、レベル50=3分ごとのように設定できます。<br>
プレイヤーがレベルアップした後にスタミナ回復頻度を上げるのに使います。たとえば、プレイヤーがレベル20に達すると回復間隔が6分から5分に短縮され、より頻繁にスタミナが回復するようになります。

#### Request

|  | 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 |
| --- | --- | --- | --- | --- | --- | --- |
| namespaceName | string |  | ✓|  |  ~ 128文字 | ネームスペース名<br>ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。 |
| staminaName | string |  | ✓|  |  ~ 128文字 | スタミナモデル名<br>このスタミナインスタンスの回復パラメータ、容量、テーブル参照を定義する StaminaModel の名前。<br>ユーザーごとのスタミナ状態を対応するモデル定義に紐づけます。 |
| gameSession | GameSession | | ✓|  |  | GameSession |
| keyId | string |  | | "grn:gs2:{region}:{ownerId}:key:default:key:default" |  ~ 1024文字 | 暗号鍵GRN |
| signedStatusBody | string |  | ✓|  |  ~ 524288文字 | 署名対象の GS2-Experience ステータスのボディ |
| signedStatusSignature | string |  | ✓|  |  ~ 128文字 | GS2-Experience ステータスの署名 |

#### Result

|  | 型 | 説明 |
| --- | --- | --- |
| item | [EzStamina](#ezstamina) | スタミナ|
| old | [EzStamina](#ezstamina) | スタミナ|
| staminaModel | [EzStaminaModel](#ezstaminamodel) | スタミナモデル|

#### 実装例




**Unity (UniTask)**
```csharp
    var domain = gs2.Stamina.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).Stamina(
        staminaName: "stamina-0001"
    );
    var result = await domain.SetRecoverIntervalAsync(
        signedStatusBody: "statusBody...",
        signedStatusSignature: "statusSignature...",
        keyId: "key-0001"
    );
    var item = await result.ModelAsync();

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Stamina.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).Stamina(
        staminaName: "stamina-0001"
    );
    var future = domain.SetRecoverIntervalFuture(
        signedStatusBody: "statusBody...",
        signedStatusSignature: "statusSignature...",
        keyId: "key-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->Stamina->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    )->Stamina(
        "stamina-0001" // staminaName
    );
    const auto Future = Domain->SetRecoverInterval(
        "statusBody...", // signedStatusBody
        "statusSignature...", // signedStatusSignature
        "key-0001" // keyId
    );
    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();

```


---

### setRecoverValue

プレイヤーレベルに基づいてスタミナ回復量を更新する<br>

GS2-Experienceのプレイヤーの現在レベル（ランク）に基づいて、1回あたりのスタミナ回復量を更新します。<br>
スタミナモデルには「回復量テーブル」を設定でき、プレイヤーレベルと回復量を対応させます。たとえば、レベル1=1回復/間隔、レベル20=2回復、レベル50=3回復のように設定できます。<br>
プレイヤーがレベルアップした後にスタミナ回復を速くするのに使います。たとえば、プレイヤーがレベル20に達すると回復量が1回復/間隔から2回復/間隔に増え、スタミナが2倍速く回復するようになります。

#### Request

|  | 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 |
| --- | --- | --- | --- | --- | --- | --- |
| namespaceName | string |  | ✓|  |  ~ 128文字 | ネームスペース名<br>ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。 |
| staminaName | string |  | ✓|  |  ~ 128文字 | スタミナモデル名<br>このスタミナインスタンスの回復パラメータ、容量、テーブル参照を定義する StaminaModel の名前。<br>ユーザーごとのスタミナ状態を対応するモデル定義に紐づけます。 |
| gameSession | GameSession | | ✓|  |  | GameSession |
| keyId | string |  | | "grn:gs2:{region}:{ownerId}:key:default:key:default" |  ~ 1024文字 | 暗号鍵GRN |
| signedStatusBody | string |  | ✓|  |  ~ 524288文字 | 署名対象の GS2-Experience ステータスのボディ |
| signedStatusSignature | string |  | ✓|  |  ~ 128文字 | GS2-Experience ステータスの署名 |

#### Result

|  | 型 | 説明 |
| --- | --- | --- |
| item | [EzStamina](#ezstamina) | スタミナ|
| old | [EzStamina](#ezstamina) | スタミナ|
| staminaModel | [EzStaminaModel](#ezstaminamodel) | スタミナモデル|

#### 実装例




**Unity (UniTask)**
```csharp
    var domain = gs2.Stamina.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).Stamina(
        staminaName: "stamina-0001"
    );
    var result = await domain.SetRecoverValueAsync(
        signedStatusBody: "statusBody...",
        signedStatusSignature: "statusSignature...",
        keyId: "key-0001"
    );
    var item = await result.ModelAsync();

```

**Unity (Vanilla)**
```cs
    var domain = gs2.Stamina.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).Stamina(
        staminaName: "stamina-0001"
    );
    var future = domain.SetRecoverValueFuture(
        signedStatusBody: "statusBody...",
        signedStatusSignature: "statusSignature...",
        keyId: "key-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->Stamina->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    )->Stamina(
        "stamina-0001" // staminaName
    );
    const auto Future = Domain->SetRecoverValue(
        "statusBody...", // signedStatusBody
        "statusSignature...", // signedStatusSignature
        "key-0001" // keyId
    );
    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();

```


---



