複数のビルドを保存し、ロード画面から選び、上書きと削除を確認してから実行する仕組みを作ります。スロット番号から保存先を決め、カード表示にも同じ情報を使うのがポイントです。
スロットごとの保存先を決める
保存先は「user://」の下にまとめ、スロット番号からファイル名を作ります。たとえば「user://save_slot_1.cfg」のようにすると、現在のスロットを変えるだけで保存・読み込み先を切り替えられます。
func save_path(slot: int) -> String:
return "user://save_slot_%d.cfg" % slot
この関数はファイル名の例です。実際に保存・削除する前には、スロット番号が許可された範囲内かを必ず検証します。保存データには、レベル、経験値、能力値、強化履歴、ウェーブ番号をまとめます。保存処理とUIのボタンを直接結び付けず、「save_game(slot)」と「load_game(slot)」を入口にします。
ロード画面は保存データを読むだけにする
ロード画面を開いたら各スロットを読み取り、空きスロットか保存済みか、レベルやウェーブをカードへ表示します。カードを選んだ時点では現在のプレイ状態を変更せず、ロードを確定したときだけPlayerへ適用します。
現在のプレイ中データを上書きする場合は、ロード前に確認を表示します。読み取り用の関数と、Playerへ適用する関数を分けると、ロード画面を開くだけでゲーム状態が変わる事故を防げます。
上書きと削除は確認してから実行する
保存済みスロットへ保存するときは、空きスロットと既存スロットを分けます。既存スロットなら上書き確認を開き、確定したときだけ保存します。削除時には対象スロットにデータがあるか確認し、対象スロット番号を保留したままダイアログを開きます。
ダイアログを閉じたら保留中の操作を解除し、次の確認を開く際に対象スロットを必ず設定します。
ニューゲームとの関係
ニューゲームが削除するのは、現在選択中のスロットだけにします。全スロットを一括削除するボタンとは分け、確認文にもスロット番号を表示します。
動作確認
- スロット1と2へ別のビルドを保存できる
- 空きスロットと保存済みスロットがカードで区別できる
- 選んだカードのデータだけをロードできる
- 上書き・削除をキャンセルするとファイルは変わらない
- ロード中に現在のプレイ状態を誤って上書きしない
- ニューゲームが意図したスロットだけを削除する
まとめ
スロット番号、保存ファイル、カード表示、確認ダイアログを同じデータ構造でつなぐと、セーブUIの状態が分かりやすくなります。次は、保存データ自体をバックアップと整合性確認で守ります。
統合版プロジェクトとの対応
この記事で扱う機能は、企画全体をまとめたauto_attack_final_verified.zipにも組み込んでいます。この記事のコードは段階的に追加するための説明なので、途中の記事と統合版全体のファイル構成は一致しない場合があります。
統合版ではスロットの状態をラベルに表示し、各スロットのロードボタンから確認画面を開きます。削除確認をキャンセルしても現在の対象スロットは変わるため、次にニューゲームを始める前に対象を確認してください。統合版には後続記事の機能も含まれます。記事の機能を確認するときは該当する操作を先に試し、最後にGodot 4.7でF5起動、入力、セーブ・ロード、再起動後の復元を確認してください。
