アイテムとショップを作る
森の探索をクリアすると、コインに加えて回復薬を1個もらえるようにします。回復薬は1個使うとスタミナが5回復し、ショップでは20コインで1個買えます。
1. 回復薬を登録する
アイテムは、種類ごとに所持数を管理する「シンプルインベントリ」に保存します。回復薬のIDは potion です。
- 機能を追加で「アイテム」を追加します。
- 表 → アイテム(Item) に行を追加し、ID を
potionにします。所持数はプレイヤーのデータなので、表では入力しません。 - 反映 → サーバとの差分を確認 からデプロイし、続いて Unity プロジェクトを更新する を実行します。
- 回復薬の使用・購入テンプレートをダウンロードします。
回復薬の保存・使用・購入テンプレートをダウンロードします。次の設定が入っています。
| 設定 | 値 |
|---|---|
| Inventory ネームスペース | adventure-inventory |
| シンプルインベントリ | Inventory |
| アイテム | potion |
| 使用・購入用の Exchange ネームスペース | adventure-item-actions |
ダウンロードしたテンプレートを、マネージメントコンソールから反映します。
- 東京リージョンで Deploy → スタックリスト → スタックを新規作成 を開きます。
- スタック名を
adventure-itemsにし、テンプレートデータでダウンロードした JSON ファイルを選びます。 - 作成 を押し、実行状態が 作成完了 になるまで待ちます。
これで、adventure-item-actions に次の二つの交換設定ができます。
| 交換名 | 消費 | 獲得 |
|---|---|---|
use_potion | 回復薬1個 | スタミナ5 |
buy_potion | 無償コイン20枚 | 回復薬1個 |
2. 森の探索の報酬に回復薬を加える
表 → クエスト(Quest) の forest を開き、通常クリア報酬 → アイテムを追加 → 未設定 で次のアクションを追加します。コインの入金と、前のページで追加したミッションカウンターの加算は残します。
| 項目 | 入れる値 |
|---|---|
| アクション | AcquireSimpleItemsByUserId(inventory) |
| ターゲットリソース | なし |
| namespaceName | Inventory |
| inventoryName | Inventory |
| userId | #{userId} |
acquireCounts に1件追加し、itemName を potion、count を 1 にします。保存してサーバーへデプロイし、Unity プロジェクトも更新します。
adventure-game に使用したテンプレートを開きます。forest の contents → completeAcquireActions の末尾に、次の項目を追加します。コイン入金とミッションカウンター加算の項目は残します。
- action: Gs2Inventory:AcquireSimpleItemsByUserId
request: |-
{"namespaceName":"adventure-inventory","inventoryName":"Inventory","userId":"#{userId}","acquireCounts":[{"itemName":"potion","count":1}]}Deploy → adventure-game → スタックを更新 で、テンプレートデータで編集したファイルを選び、更新します。実行状態が 更新完了 になるまで待ちます。
3. Unity に所持数と使用・購入ボタンを追加する
Unity の再生を止めます。次のファイルを追加すると、右側の画面が回復薬の所持数と操作ボタンに変わります。左側の冒険画面はそのまま使います。
空の GameObject を作り、Extensions と名付けます。ログインボーナスとミッションのボタンは、冒険画面に残したまま進めます。
AdventureItems.cs を Assets/AdventureExtensions に入れ、Extensions に Adventure Items を追加します。接続には、ログイン済みの Gs2ClientHolder と Gs2GameSessionHolder を使います。
Extensions の Adventure Daily のチェックを外します。
AdventureItems.cs を Assets/AdventureExtensions に入れ、Extensions に Adventure Items を追加します。Login に、シーン内の AdventureLogin を割り当てます。
Game ビューを横に広げ、左の冒険画面と右の回復薬の画面が両方見えるようにします。再生してログインし、回復薬の所持数が表示されることを確かめます。
所持数は、SimpleInventory("Inventory").SimpleItem("potion") を購読して表示します。初回の値と、その後の変更を同じコールバックで受け取ります。
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 は、通信エラー後に同じ操作を送り直すためのキーです。
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 にします。
RunWrite(id => Exchange("buy_potion", id)).Forget();購入の消費は Gs2Money2:WithdrawByUserId の slot = 0、withdrawCount = 20、paidOnly = false、獲得は Gs2Inventory:AcquireSimpleItemsByUserId の potion 1個です。
Unity の再生を止めて再開し、同じプレイヤーでログインします。購入した回復薬が残っていることを確かめてから、次のキャラクターを追加します。