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


# アイテムとショップを作る

冒険の報酬に回復薬を加え、使うボタンと購入ボタンを作ります。



森の探索をクリアすると、コインに加えて回復薬を1個もらえるようにします。回復薬は1個使うとスタミナが5回復し、ショップでは20コインで1個買えます。

## 1. 回復薬を登録する

アイテムは、種類ごとに所持数を管理する「シンプルインベントリ」に保存します。回復薬のIDは `potion` です。


**Studio**

1. **機能を追加**で「アイテム」を追加します。
2. **表 → アイテム（Item）** に行を追加し、ID を `potion` にします。所持数はプレイヤーのデータなので、表では入力しません。
3. **反映 → サーバとの差分を確認** からデプロイし、続いて **Unity プロジェクトを更新する** を実行します。
4. <a href="/samples/adventure/extensions/items-studio.json" download>回復薬の使用・購入テンプレート</a>をダウンロードします。


**SDK（Unity）**

<a href="/samples/adventure/extensions/items-sdk.json" download>回復薬の保存・使用・購入テンプレート</a>をダウンロードします。次の設定が入っています。

| 設定 | 値 |
| --- | --- |
| Inventory ネームスペース | `adventure-inventory` |
| シンプルインベントリ | `Inventory` |
| アイテム | `potion` |
| 使用・購入用の Exchange ネームスペース | `adventure-item-actions` |




ダウンロードしたテンプレートを、マネージメントコンソールから反映します。

1. 東京リージョンで **Deploy → スタックリスト → スタックを新規作成** を開きます。
2. スタック名を `adventure-items` にし、**テンプレートデータ**でダウンロードした JSON ファイルを選びます。
3. **作成** を押し、実行状態が **作成完了** になるまで待ちます。

これで、`adventure-item-actions` に次の二つの交換設定ができます。

| 交換名 | 消費 | 獲得 |
| --- | --- | --- |
| `use_potion` | 回復薬1個 | スタミナ5 |
| `buy_potion` | 無償コイン20枚 | 回復薬1個 |

## 2. 森の探索の報酬に回復薬を加える


**Studio**

**表 → クエスト（Quest）** の `forest` を開き、**通常クリア報酬 → アイテムを追加 → 未設定** で次のアクションを追加します。コインの入金と、前のページで追加したミッションカウンターの加算は残します。

| 項目 | 入れる値 |
| --- | --- |
| アクション | `AcquireSimpleItemsByUserId`（inventory） |
| ターゲットリソース | なし |
| namespaceName | `Inventory` |
| inventoryName | `Inventory` |
| userId | `#{userId}` |

**acquireCounts** に1件追加し、`itemName` を `potion`、`count` を `1` にします。保存してサーバーへデプロイし、Unity プロジェクトも更新します。


**SDK（Unity）**

`adventure-game` に使用したテンプレートを開きます。`forest` の `contents → completeAcquireActions` の末尾に、次の項目を追加します。コイン入金とミッションカウンター加算の項目は残します。

```yaml
- action: Gs2Inventory:AcquireSimpleItemsByUserId
  request: |-
    {"namespaceName":"adventure-inventory","inventoryName":"Inventory","userId":"#{userId}","acquireCounts":[{"itemName":"potion","count":1}]}
```

**Deploy → adventure-game → スタックを更新** で、**テンプレートデータ**で編集したファイルを選び、更新します。実行状態が **更新完了** になるまで待ちます。




## 3. Unity に所持数と使用・購入ボタンを追加する

Unity の再生を止めます。次のファイルを追加すると、右側の画面が回復薬の所持数と操作ボタンに変わります。左側の冒険画面はそのまま使います。


**Studio**

空の GameObject を作り、`Extensions` と名付けます。ログインボーナスとミッションのボタンは、冒険画面に残したまま進めます。

<a href="/samples/adventure/extensions/studio/AdventureItems.cs" download>AdventureItems.cs</a> を `Assets/AdventureExtensions` に入れ、`Extensions` に **Adventure Items** を追加します。接続には、ログイン済みの `Gs2ClientHolder` と `Gs2GameSessionHolder` を使います。


**SDK（Unity）**

`Extensions` の **Adventure Daily** のチェックを外します。

<a href="/samples/adventure/extensions/sdk/AdventureItems.cs" download>AdventureItems.cs</a> を `Assets/AdventureExtensions` に入れ、`Extensions` に **Adventure Items** を追加します。**Login** に、シーン内の `AdventureLogin` を割り当てます。




Game ビューを横に広げ、左の冒険画面と右の回復薬の画面が両方見えるようにします。再生してログインし、回復薬の所持数が表示されることを確かめます。

所持数は、`SimpleInventory("Inventory").SimpleItem("potion")` を購読して表示します。初回の値と、その後の変更を同じコールバックで受け取ります。

```csharp
var item = Client.Inventory.Namespace(InventoryNamespace).Me(Session)
    .SimpleInventory("Inventory").SimpleItem("potion");
var id = await item.SubscribeWithInitialCallAsync(value => potion = value);
```

左側で森の探索を始めてクリアします。右側の回復薬が1個増え、左側のコインも増えていれば、報酬の追加ができています。報酬の追加が反映されるまで最大5分かかります。コインだけ増える場合は、少し待ってから森の探索を新しく始めてクリアします。コインとスタミナは、引き続き左側の冒険画面で確認します。

## 4. 回復薬を使う

スタミナが15以下の状態で、**回復薬を1個使ってスタミナを5回復** を押します。回復薬が1個減り、スタミナが5増えます。途中で自然回復した場合は、その分も加わります。

使用ボタンは `RunWrite(id => Exchange("use_potion", id))` で、次の交換処理を呼びます。`requestId` は、通信エラー後に同じ操作を送り直すためのキーです。

```csharp
private async UniTask Exchange(string rate, string requestId)
{
    var transaction = await Client.Exchange.Namespace("adventure-item-actions").Me(Session).Exchange()
        .ExchangeAsync(rate, 1, speculativeExecute: false, duplicationAvoider: requestId);
    if (transaction != null) await transaction.WaitAsync(all: true);
}
```

テンプレートでは、消費に `Gs2Inventory:ConsumeSimpleItemsByUserId`、獲得に `Gs2Stamina:RecoverStaminaByUserId` を指定しています。回復薬が0個の状態でも使用ボタンを押してみてください。不足が表示され、スタミナは増えません。

## 5. コインで回復薬を買う

コインを20枚以上用意し、**20コインで回復薬を1個買う** を押します。コインが20減り、回復薬が1個増えます。

購入ボタンも同じ交換APIを使い、交換名だけを `buy_potion` にします。

```csharp
RunWrite(id => Exchange("buy_potion", id)).Forget();
```

購入の消費は `Gs2Money2:WithdrawByUserId` の `slot = 0`、`withdrawCount = 20`、`paidOnly = false`、獲得は `Gs2Inventory:AcquireSimpleItemsByUserId` の `potion` 1個です。

Unity の再生を止めて再開し、同じプレイヤーでログインします。購入した回復薬が残っていることを確かめてから、次のキャラクターを追加します。

[次へ：キャラクターを集めて育てる]()



