敵を倒したときに経験値を受け取り、一定量に達したらレベルアップする仕組みを作ります。固定値を足すだけで終わらせず、レベルが上がるほど必要経験値が増えるテーブルへ移し、次回の強化選択につなげます。
今回の完成形
- 敵の撃破時にPlayerへ経験値を渡す
- 現在レベル、経験値、次のレベルに必要な量をHUDへ表示する
- レベルごとの必要経験値を関数で計算する
- レベルアップを強化選択の開始イベントとして扱う
Playerに経験値とレベルを持たせる
経験値の所有者は敵やHUDではなくPlayerにします。敵は「撃破されたので経験値を渡す」だけ、HUDはPlayerの値を表示するだけにすると、責務が分かれます。
signal level_up_requested(level: int)
var level := 1
var experience := 0
func required_experience(next_level: int) -> int:
return 5 + (next_level - 1) * 3
func gain_experience(amount: int) -> void:
experience += amount
while experience >= required_experience(level + 1):
experience -= required_experience(level + 1)
level += 1
level_up_requested.emit(level)
「while」を使うのは、1回の報酬で複数レベル上がる可能性を残すためです。複数回の通知を強化選択画面につなぐ場合は、未処理の選択回数を保持し、1回選ぶごとに次を表示する必要があります。レベルアップの処理を別の関数やシグナルへ分けると、後から強化画面を追加しやすくなります。
敵の撃破から経験値へつなぐ
弾が敵へダメージを与え、敵のHPが0になった場所で経験値を渡します。経験値ジェムを後から追加する場合も、まずは「撃破時に経験値が増える」流れを確認してから、報酬を画面上のアイテムへ分離します。
必要経験値をHUDへ表示する
HUDは、Playerの「level」「experience」「required_experience(level + 1)」を読み取ります。表示更新をレベルアップ処理の中だけに置くと、敵を倒した直後の経験値が画面へ反映されないことがあります。経験値を受け取った直後にも更新関数を呼びます。
調整するときの考え方
必要経験値の式は、ゲームのテンポを決める値です。序盤でレベルアップが遠すぎると強化を試せず、増え方が急すぎると後半が停滞します。まず小さな値で動かし、1ウェーブで何回レベルアップするかを確認してから係数を調整します。
動作確認
- 敵を倒すと経験値が増える
- 必要経験値に達するとレベルが1上がる
- 経験値の余りが次のレベルへ引き継がれる
- HUDの表示が撃破直後に更新される
- レベルアップイベントから強化選択へ進める
経験値が増えないときは、撃破処理が呼ばれているか、Player参照が有効か、HUDが別のPlayerを見ていないかを確認します。「level_up_requested」が複数回接続されている場合は、1回のレベルアップで画面が二重に開くことがあります。
まとめ
経験値・レベル・必要経験値をPlayerへ集約すると、HUDと強化システムを後から拡張できます。次は、このレベルアップを3つの強化候補とビルド管理へつなげます。
統合版プロジェクトとの対応
統合版プロジェクトでは必要経験値が10の固定値です。この記事のレベル別テーブルは含まれていないため、使う場合は関数を別途追加してください。
統合版のコードには、1回の経験値取得で複数レベル上がると、強化候補の表示が上書きされ、選択回数が不足する可能性があります。このケースの実行確認はまだできていません。統合版には後続記事の機能も含まれます。記事の機能を確認するときは該当する操作を先に試し、最後にGodot 4.7でF5起動、入力、セーブ・ロード、再起動後の復元を確認してください。
