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

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

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

1. 回復薬を登録する

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

  1. 機能を追加で「アイテム」を追加します。
  2. 表 → アイテム(Item) に行を追加し、ID を potion にします。所持数はプレイヤーのデータなので、表では入力しません。
  3. 反映 → サーバとの差分を確認 からデプロイし、続いて Unity プロジェクトを更新する を実行します。
  4. 回復薬の使用・購入テンプレートをダウンロードします。

回復薬の保存・使用・購入テンプレートをダウンロードします。次の設定が入っています。

設定値
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. 森の探索の報酬に回復薬を加える

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

項目入れる値
アクションAcquireSimpleItemsByUserId(inventory)
ターゲットリソースなし
namespaceNameInventory
inventoryNameInventory
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 の再生を止めて再開し、同じプレイヤーでログインします。購入した回復薬が残っていることを確かめてから、次のキャラクターを追加します。

次へ:キャラクターを集めて育てる