実践ガイド

【Godot 4.7】Brotato風ゲームの強化候補とビルドをまとめて設計する

【Godot 4.7】Brotato風ゲームの強化候補とビルドをまとめて設計するのアイキャッチ

レベルアップ時に強化を1つ選ぶ仕組みを、候補の抽選・上限管理・ビルド分類まで含めて作ります。強化をボタンの処理へ直接書かず、データとして扱うのがポイントです。

強化をデータとして定義する

強化候補を配列にまとめ、各項目へID、分類、最大値、重みを持たせます。表示名は別の辞書でIDに対応付けるか、各項目に追加します。

const UPGRADE_POOL := [
    {"id": "attack_speed", "category": "attack", "max_level": 5, "weight": 1.0},
    {"id": "bullet_damage", "category": "attack", "max_level": 5, "weight": 1.0},
    {"id": "recovery_amount", "category": "recovery", "max_level": 3, "weight": 1.0},
    {"id": "pickup_radius", "category": "collection", "max_level": 4, "weight": 1.0},
]

ボタン側はIDを受け取り、Playerの「apply_upgrade(id)」を呼ぶだけにします。表示文、適用処理、上限判定を分離できるため、候補を増やしてもHUDのコードが膨らみません。

3つの候補を重複なく選ぶ

まず最大値に達していない候補だけを残し、その配列から必要な数を選びます。選んだ候補を一時的な候補配列から外しておくと、同じ強化が3枠に並ぶことを防げます。候補が3件未満のときは、存在しないボタンを無効化し、すべて上限ならレベルアップ画面を開かずにゲームを続けます。

ビルド分類を記録する

強化を適用したあとで、「attack」「recovery」「collection」などの分類カウントを増やします。抽選前にカウントを増やすと、表示されただけの候補がビルドへ加算されるため注意してください。HUDには現在の分類数を表示すると、どの方向へ育っているかを確認できます。

重み付き抽選を追加する

重みは候補ごとの選ばれやすさを変える値です。候補ごとの重みを合計し、乱数をその範囲へ割り当てます。ビルドに合う分類へ少しだけ加点し、上限を設けます。重みを大きくしすぎると同じ候補ばかりになるため、出現保証とは分けて考えます。

抽選の順番は、次のように固定します。

  1. 最大値に達した候補を除外する
  2. 残った候補の重みを計算する
  3. 重みで候補を1つ選ぶ
  4. 選んだ候補を一時配列から外す
  5. 必要な数まで繰り返す

吸引範囲もPlayerの強化として扱う

経験値ジェムの吸引範囲は、ジェムごとに持たせずPlayerの現在値として管理します。初期値を140、1回の強化量を40、最大値を300にすると、強化効果と上限を同じ場所で管理できます。

const START_MAGNET_RANGE := 140.0
const MAGNET_RANGE_UPGRADE := 40.0
const MAX_MAGNET_RANGE := 300.0

var magnet_range := START_MAGNET_RANGE

func get_magnet_range() -> float:
    return magnet_range

UPGRADE_POOLの候補IDはpickup_radiusにそろえ、apply_upgrade()でPlayerの実値へ反映します。

"pickup_radius":
    magnet_range = minf(
        MAX_MAGNET_RANGE,
        magnet_range + MAGNET_RANGE_UPGRADE
    )

ExperienceGem側はget_magnet_range()から現在値を読み取ります。ジェムが初期値を持つのではなく、Playerの強化後の値を参照するため、あとから生成されたジェムにも同じ効果が反映されます。HUDにも現在の範囲を表示すると、選択直後に効果を確認できます。

強化適用時の上限を残す

抽選側で上限を除外しても、「apply_upgrade」側の上限判定は残します。ロードデータ、デバッグ操作、将来の別UIから呼ばれた場合にも、能力値が最大値を超えないためです。

動作確認

  • レベルアップ画面に異なる候補が3つ出る
  • 選択した1件だけが能力値へ反映される
  • 最大値の強化が候補から消える
  • 候補不足でも空のボタンや無限停止が起きない
  • ビルド分類の表示が選択後に更新される
  • 重みを変えると出現傾向が変わる
  • 「拾う範囲 +40」を選ぶと吸引範囲が広がり、300で上限になる

まとめ

強化候補をデータ化し、利用可能判定・重み付き抽選・適用時の上限を分けると、ビルドを増やしても安全に拡張できます。吸引範囲のような新しい能力も、Playerの現在値と候補IDを結び付ければ同じ設計で追加できます。次は、強化が実際の生存とゲームオーバーへどう影響するかをまとめます。

統合版プロジェクトとの対応

統合版プロジェクトでは弾ダメージの候補IDに damage を使います。この記事の例の bullet_damage を取り入れる際は、候補側と適用側のIDを統一してください。統合版の候補重みは固定で、記事のビルド分類による加点や上限は含まれません。

統合版のコードには、1回の経験値取得で複数レベル上がると、強化候補の表示が上書きされ、選択回数が不足する可能性があります。このケースの実行確認はまだできていません。統合版には後続記事の機能も含まれます。記事の機能を確認するときは該当する操作を先に試し、最後にGodot 4.7でF5起動、入力、セーブ・ロード、再起動後の復元を確認してください。

← 記事一覧・検索