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


# 6. コインでスタミナを回復する

集めたコインで、スタミナを回復できるようにしましょう。小さなショップを作って購入を試します。



冒険で集めたコインを、今度は使ってみましょう。作るのは、20 コインでスタミナを 10 回復できる商品です。`refill` という名前で登録し、冒険の報酬でもらった無償コインで買えるようにします。

## 支払いと回復をまとめて処理する

商品を買うときは、コインの支払いとスタミナの回復をセットで行いたいので、二つの処理を一つのトランザクションにまとめます。コインが足りないときには、スタミナだけ回復することなく、購入が失敗するようにします。

## 手順



**Studio**

### 商品の表を作る

**機能を追加**で「スタミナショップ」を追加し、**表 → スタミナ商品（EnergyProduct）** に次の行を作ります。

| 項目 | 値 |
| --- | --- |
| ID | `refill` |
| 回復対象（energy） | `stamina` の行 |
| 回復量（recoveryValue） | `10` |
| 購入コスト（consumeActions） | 下記の消費アクションを1件 |

**購入コスト** のセルをダブルクリックし、**アイテムを追加 → 未設定** を開きます。アクションで `WithdrawByUserId`（ウォレットから残高を消費）を選び、ターゲットリソースは **なし** のまま次の値を入力します。

| 項目 | 値 |
| --- | --- |
| namespaceName | `Currency` |
| userId | `#{userId}` |
| slot | `0` |
| withdrawCount | `20` |
| paidOnly | `false` |

`paidOnly` を `false` にすると、この教材で集めた無償コインを支払いに使えます。

<a href="/images/adventure/later-chapters/06-shop-cost.jpg" target="_blank" rel="noopener" aria-label="購入コストの設定。Currency のスロット0から20コインを支払い、paidOnly は false（別タブで拡大）"><img src="/images/adventure/later-chapters/06-shop-cost.jpg" alt="購入コストの設定。Currency のスロット0から20コインを支払い、paidOnly は false" loading="lazy"></a>

右側の編集欄を閉じ、`refill` の回復対象が `stamina`、回復量が `10`、購入コストが1件になっていることを確認して保存します。

<a href="/images/adventure/later-chapters/06-shop-product.jpg" target="_blank" rel="noopener" aria-label="スタミナ商品の表。refill は stamina を10回復し、購入コストを1件持つ（別タブで拡大）"><img src="/images/adventure/later-chapters/06-shop-product.jpg" alt="スタミナ商品の表。refill は stamina を10回復し、購入コストを1件持つ" loading="lazy"></a>

サーバーへデプロイし、Unity を更新します。`AdventureStudioView.cs` をこの章のコードに置き換えると、購入ボタンが追加されます。既存の Quests・Progress・Wallet・Energy の割り当てを確認してください。

スタミナショップのパッケージが作る Exchange ネームスペースは `EnergyProduct` です。購入ボタンから呼ぶ `Buy()` は次のとおりです。画面の配置や現在値の表示は別のメソッドに分けています。

```csharp
private async Task Buy()
{
    var request = Gs2ClientHolder.Instance.Gs2.Exchange.Namespace("EnergyProduct")
        .Me(Gs2GameSessionHolder.Instance.GameSession).Exchange();
    var transaction = await request.ExchangeAsync("refill", 1, speculativeExecute: false);
    if (transaction != null) await transaction.WaitAsync(all: true);
}
```

<a href="/samples/adventure/06/AdventureStudioView.cs" download>この章の AdventureStudioView.cs をダウンロード</a>




**SDK（Unity）**

### 設定を更新する

<a href="/samples/adventure/06/adventure-game.yaml" download>第6章のテンプレートをダウンロード</a>し、**Deploy → adventure-game → スタックを更新**を開き、**テンプレートデータ**でダウンロードしたファイルを選びます。これは前の章のリソースも含む完全なテンプレートです。更新内容を確認して適用し、実行状態が**更新完了**になるまで待ちます。

テンプレートの `refill` は、`Gs2Money2:WithdrawByUserId` の `withdrawCount = 20`、`paidOnly = false` と、`Gs2Stamina:RecoverStaminaByUserId` の `recoverValue = 10` を組み合わせています。交換は `timingType: immediate` です。

### Unity のコードを更新する

<a href="/samples/adventure/06/AdventurePlay.cs" download>AdventurePlay.cs</a> をダウンロードし、`Assets` にある同名ファイルを置き換えます。`AdventurePlayer.cs` は第5章のものをそのまま使います。

Inspector の設定はそのまま使えます。

この章で使う処理は次の部分です。抜粋を別のクラスとして追加する必要はありません。

```csharp
private async UniTask BuyRefill()
{
    var transaction = await player.Gs2.Exchange.Namespace("adventure-shop").Me(player.Session)
        .Exchange().ExchangeAsync("refill", 1, speculativeExecute: false);
    awaitingResult = true;
    if (transaction != null) await transaction.WaitAsync(all: true);
}
```






購入中はボタンを押せないようにし、完了後のコインとスタミナを画面に表示します。

## 商品を買ってみましょう

これまでの冒険で集めたコインを使って、同じプレイヤーのスタミナを回復します。

1. コインが 20 枚以上、スタミナが 10 以下であることを確認します。コインが足りない場合やスタミナが多い場合は、森の探索を開始・クリアして調整します。
2. 購入前のコインとスタミナを控え、購入ボタンを押します。
3. コインが 20 減り、スタミナが 10 増えたことを確かめます。たとえば、コイン 30・スタミナ 5 なら、コイン 10・スタミナ 15 になります。
4. Unity の Play を止め、再生し直します。Studio は自動でログインします。SDK は **ログイン** ボタンを押します。購入後の残高と、回復したスタミナが残っていることを確かめます。

スタミナは上限 20 まで回復します。操作や再起動の間に自然回復した場合は、その分も加えて比べてください。

コインが 20 枚未満のときは購入できず、エラーメッセージが表示されます。失敗した購入でコインが減ったり、スタミナが回復したりすることはありません。

## 練習：設定を変えて試す

価格を 25 コインに変えてみましょう。試す前に森の探索をクリアし、コインを 25 枚以上、スタミナを 10 以下にしておきます。画面に出る価格も、買ったときに減るコインも、25 になっているでしょうか。消費設定の反映には最大5分かかります。表示は25でも20コインしか減らない場合は、少し待ってから次の購入で確かめます。

<details>
Studio は商品の購入コストにある `withdrawCount`、SDK はテンプレートの `withdrawCount` を `25` にしてデプロイします。確認用コードの購入ボタンは固定の文言なので、`20 コインでスタミナを 10 回復` も `25 コインでスタミナを 10 回復` に変えます。


## 次の章へ進む前に

練習で変えた商品の価格を **20 コインに戻し、画面表示と消費設定の両方を反映** します。回復量は 10 のままです。デプロイから5分待ち、森の探索でコインを用意してから購入し、20コイン減ることを確かめて進みます。

[次へ：設定を変更してゲームへ反映する]()



