6. コインでスタミナを回復する
冒険で集めたコインを、今度は使ってみましょう。作るのは、20 コインでスタミナを 10 回復できる商品です。refill という名前で登録し、冒険の報酬でもらった無償コインで買えるようにします。
支払いと回復をまとめて処理する
商品を買うときは、コインの支払いとスタミナの回復をセットで行いたいので、二つの処理を一つのトランザクションにまとめます。コインが足りないときには、スタミナだけ回復することなく、購入が失敗するようにします。
手順
商品の表を作る
機能を追加で「スタミナショップ」を追加し、表 → スタミナ商品(EnergyProduct) に次の行を作ります。
| 項目 | 値 |
|---|---|
| ID | refill |
| 回復対象(energy) | stamina の行 |
| 回復量(recoveryValue) | 10 |
| 購入コスト(consumeActions) | 下記の消費アクションを1件 |
購入コスト のセルをダブルクリックし、アイテムを追加 → 未設定 を開きます。アクションで WithdrawByUserId(ウォレットから残高を消費)を選び、ターゲットリソースは なし のまま次の値を入力します。
| 項目 | 値 |
|---|---|
| namespaceName | Currency |
| userId | #{userId} |
| slot | 0 |
| withdrawCount | 20 |
| paidOnly | false |
paidOnly を false にすると、この教材で集めた無償コインを支払いに使えます。
右側の編集欄を閉じ、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);
}設定を更新する
第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);
}購入中はボタンを押せないようにし、完了後のコインとスタミナを画面に表示します。
商品を買ってみましょう
これまでの冒険で集めたコインを使って、同じプレイヤーのスタミナを回復します。
- コインが 20 枚以上、スタミナが 10 以下であることを確認します。コインが足りない場合やスタミナが多い場合は、森の探索を開始・クリアして調整します。
- 購入前のコインとスタミナを控え、購入ボタンを押します。
- コインが 20 減り、スタミナが 10 増えたことを確かめます。たとえば、コイン 30・スタミナ 5 なら、コイン 10・スタミナ 15 になります。
- 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コイン減ることを確かめて進みます。

