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

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

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

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

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

手順

商品の表を作る

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

項目値
IDrefill
回復対象(energy)stamina の行
回復量(recoveryValue)10
購入コスト(consumeActions)下記の消費アクションを1件

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

項目値
namespaceNameCurrency
userId#{userId}
slot0
withdrawCount20
paidOnlyfalse

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

購入コストの設定。Currency のスロット0から20コインを支払い、paidOnly は false

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

スタミナ商品の表。refill は stamina を10回復し、購入コストを1件持つ

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

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

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);
}

この章の AdventureStudioView.cs をダウンロード

設定を更新する

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

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

Unity のコードを更新する

AdventurePlay.cs をダウンロードし、Assets にある同名ファイルを置き換えます。AdventurePlayer.cs は第5章のものをそのまま使います。

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

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

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コインしか減らない場合は、少し待ってから次の購入で確かめます。

ヒント

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

次の章へ進む前に

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

次へ:設定を変更してゲームへ反映する