5. 冒険の開始時にスタミナを消費する
ここからは、冒険にスタミナを使うようにしていきます。森の探索を始めるのに必要なのは 5。足りないときは回復を待つ、というルールにしましょう。
始める前に
進行中の冒険があればクリアしてから、スタミナの設定を追加します。
追加する設定
スタミナの設定には stamina という名前を付けます。最初の値は 20、通常の回復上限も 20 です。冒険で使った分は、300 秒ごとに 1 ずつ自然に回復するようにします。
手順
スタミナの表を作る
機能を追加で「スタミナ」を追加し、表 → スタミナ(Energy) に次の行を作ります。
| 項目 | 値 |
|---|---|
| ID | stamina |
| 初期上限(defaultMaximum) | 20 |
| 上限超過を許可(useOverflow) | オフ |
| 超過時上限(overflowedMaximum) | 20 |
| 回復間隔(recoveryIntervalMinutes) | 5(分) |
| 1回の回復量(recoveryValue) | 1 |
回復間隔の入力単位は分です。300 秒にしたいので、入力するのは 5 です。
クエスト(Quest) の forest の 開始時消費 をダブルクリックします。アイテムを追加 → 未設定 を開き、アクションで ConsumeStaminaByUserId(スタミナを消費)を選びます。ターゲットリソースは なし のまま、次の値を入力します。
| 項目 | 値 |
|---|---|
| namespaceName | Energy |
| staminaName | stamina |
| userId | #{userId} |
| consumeValue | 5 |
通常クリア報酬は第3章のまま、Currency のスロット 0 に10コインを入金します。
サーバーへデプロイし、Unity を更新します。
この章の AdventureStudioView.cs をダウンロードし、既存の Assets/AdventureStudioView.cs を置き換えます。
Unity の Gs2 オブジェクトに EnergyHandler を追加して Id を stamina にし、AdventureStudioView の Energy に割り当てます。
現在値の表示は DrawPlayerStatus() にまとめています。ハンドラーが更新したスタミナも、この中で表示します。
private void DrawPlayerStatus()
{
GUILayout.Label(wallet.HasValue
? "コイン: " + wallet.Model.Free
: "コインを読み込み中です");
if (!progress.HasValue)
{
GUILayout.Label("進行を読み込み中です");
}
else
{
GUILayout.Label(progress.Model.InProgress
? "冒険中です"
: "冒険を選んでください");
}
GUILayout.Label(energy.HasValue
? "スタミナ: " + energy.Model.CurrentValue
: "スタミナを読み込み中です");
}設定を更新する
第5章のテンプレートをダウンロードし、Deploy → adventure-game → スタックを更新を開き、テンプレートデータでダウンロードしたファイルを選びます。これは前の章のリソースも含む完全なテンプレートです。更新内容を確認して適用し、実行状態が更新完了になるまで待ちます。
テンプレートのスタミナ設定は次の値です。recoverIntervalMinutes は分単位なので、300 秒ではなく 5 と書きます。
staminaModels:
- name: stamina
initialCapacity: 20
isOverflow: false
maxCapacity: 20
recoverIntervalMinutes: 5
recoverValue: 1開始時消費には Gs2Stamina:ConsumeStaminaByUserId を設定し、staminaName = stamina、consumeValue = 5 を渡します。Unity の開始ボタンは第3章と同じ StartAsync() を呼びます。
Unity のコードを更新する
次の二つのファイルを Assets に入れます。同名ファイルがある場合は置き換えてください。
- AdventurePlay.cs:冒険の操作と画面表示
- AdventurePlayer.cs:表示用データの購読と解除
Inspector の設定はそのまま使えます。
この章で使う処理は次の部分です。抜粋を別のクラスとして追加する必要はありません。
var meter = Gs2.Stamina.Namespace("adventure-stamina").Me(Session).Stamina("stamina");
var subscription = await meter.SubscribeWithInitialCallAsync(value => Stamina = value);消費や購入による変更は、このコールバックで表示に反映します。自然回復は、描画時に SDK の PredictRecovery() で反映します。返ってきた値を表示すれば、待っている間もスタミナが増えていきます。
using Gs2.Unity.Gs2Stamina.Model;
var now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
+ (player.Session.AccessToken.TimeOffset ?? 0) * 1000L;
var stamina = player.Stamina.PredictRecovery(now);
GUILayout.Label("スタミナ: " + stamina.Value + " / " + stamina.MaxValue);now はセッションの時刻に合わせたミリ秒です。PredictRecovery() は購読で受け取った元のデータを変更せず、自然回復後の値を返します。
スタミナを使ってみましょう
これまで使ってきたプレイヤーで試します。消費量の設定が反映されるまで最大5分かかります。まだスタミナが減らない場合は、その冒険をクリアし、少し待ってから新しく始めて確かめます。
- スタミナが 5 以上あることを確認し、現在の値を控えます。
- 森の探索を始め、スタミナが開始前より 5 減ったか見てみましょう。たとえば、20 なら 15 になります。
- 冒険をクリアし、コインが 10 増えたことも確かめます。
操作の間に自然回復した場合は、その回復分も加えて比べてください。
練習:設定を変えて試す
冒険に必要なスタミナを 8 に変えてみましょう。Studio は開始時消費の consumeValue、SDK はテンプレートの consumeValue を 8 にしてデプロイします。
スタミナが 8 以上ある状態で森の探索を始め、開始前より 8 減ることを確認します。足りない場合は自然回復を待ちます。まだ 5 しか減らない場合は、その冒険をクリアし、少し待ってから新しく始めます。確認できたら冒険をクリアし、消費量を 5 に戻してデプロイ してください。通常報酬は 10 コインのままです。
スタミナが足りないときの動きを確かめる
消費量を戻したデプロイから5分待って、森の探索を新しく始めます。スタミナが 5 減ることを確かめてクリアしてから、不足する状態を作ります。
- 森の探索の開始とクリアを繰り返し、スタミナを 5 未満にします。
- もう一度開始ボタンを押します。エラーメッセージが表示され、冒険が始まらないことを確認します。
- 失敗した操作では、スタミナが消費されていないことも確かめます。
スタミナは 300 秒ごとに 1 ずつ自然回復します。5 以上に戻ると、また冒険を始められます。

