Godot4 セーブデータの起動時の読み込みと終了時の保存

2D / 3D ゲームを作成できる無料・オープンソースの軽快なゲームエンジン「Godot Engine 4」で、スコアと音量の値をセーブデータとして管理して、起動時に読み込み終了時に保存する実装例を紹介します。
セーブデータのファイルの保存先や、通知イベントで受け取るアプリが終了するメッセージ番号についても紹介します。

※この記事の内容は、アプリ タップ The 宝箱 の開発でも使用しています。
※ GodotEngine のバージョンは 4.1.2 です。 .NET 版ではありません

※「いらすとや」様の画像を使用しています。
※「ふい字」フォントを使用しています。

※「魔王魂」様のサウンドを動画内で使用しています。
※「無料効果音で遊ぼう!」様のサウンドを動画内で使用しています。

※記事で紹介するスクリプト / プログラム / コードは自己責任で使用してください。

前回の記事

前回は、独自のシグナルと、それを受け取る受信側メソッドを作成して、お宝が出た際にスコアの値と表示を更新する実装例を紹介しました。

画面に以下の変更を加えました。

  • 上部に高さ 100px 程度の余白を追加して UI 全体を下側に移動
  • 上部にタイトルバナーの追加
  • スコアのラベルにアウトラインを追加。背景画像を追加。
    19 桁表示するためフォントサイズを 60 から 55 へ変更。
  • 音量調節のスライダーに背景画像を追加。
  • 下部にクレジット、作者名のラベル(アウトライン付)を追加。
Godot4 TapTheTakarabako タイトルバナー、クレジット、背景画像の追加と位置サイズ調整

セーブデータの読み込みと保存方法

セーブファイルの保存先のパスを変数に保持します。
この変数はロードとセーブの関数で用います。
紹介するスクリプトは他サイト様「【Godot4.x】セーブデータの保存方法 | 2dgames.jp」を参考にしました。
詳細はコメントをお読みください。

# セーブデータの保存先。 Windows の場合 user:// は %APPDATA%\Godot\app_userdata\プロジェクト名\ に保存されます。
var save_path = "user://TapTheTakarabako.save"

セーブの関数です。

# セーブデータを保存します。 F6 キーでは動作せず F5 キーで実行するとロードとセーブができました。
func save_app_data()->void:
	# セーブデータの変数を作成して、保存したい項目を設定します。
	var save_data = {}
	save_data["score"] = score	# スコア
	save_data["audio_volume"] = $VolumeSlider.value # 音量
	
	# セーブファイルを書き込みモードで開きます。
	var f = FileAccess.open(save_path, FileAccess.WRITE)	
	# セーブデータの変数を文字列に変換して、セーブファイルに書きます。
	var s = var_to_str(save_data)
	f.store_string(s)	
	# ファイルを閉じます。
	f.close()
	
	return

ロードの関数です。

# セーブデータをロードします。なければ既定値で初期化します。		
func load_app_data()->void:
	var save_data
	# セーブファイルが存在しない場合
	if FileAccess.file_exists(save_path) == false:
		print("セーブデータが存在しないので初期化します: %s"%save_path)
		# 初期値をセーブデータに設定します。
		save_data = {}
		save_data["score"] = 0
		save_data["audio_volume"] = 1.0
	# セーブファイルが存在する場合
	else:
		# ファイルを読み込み、セーブデータを変数に格納します。
		var f = FileAccess.open(save_path, FileAccess.READ)
		var s = f.get_as_text()
		save_data = str_to_var(s)
		# 使った後に、ファイルを閉じます。
		f.close()
	
	# 読み込んだセーブデータをメンバ変数や UI の値に反映します。
	score = save_data["score"]		# スコア
	$CoinLabel.text = str(score)	# スコアを表示するテキスト
	$VolumeSlider.value = save_data["audio_volume"]	# 音量
	return

$CoinLabel, $VolumeSlider は、シーンにある同じ名称のラベルとスライダーのノードへ $ をつけてアクセスしています。

Godot4 シーンのノードは$ノード名でGDスクリプトからアクセスできます.

ゲームデータの初期化時にロード処理を追加

ゲームデータをロードするタイミングは、メインシーンの GD スクリプトの _ready イベント関数内にしました。

# Called when the node enters the scene tree for the first time.
func _ready():
	# セーブデータを読み込みます。
	load_app_data()

アプリの終了通知イベントにセーブ処理を追加

アプリの終了通知のメッセージ番号は、 以下を検知してセーブします。

  • WM_CLOSE_REQUEST
  • Android で発生する NOTIFICATION_WM_GO_BACK_REQUEST

参考にした他サイト様「【Godot Engine】一時停止・終了確認ポップアップ – えんどーめも」に書かれていた MainLoop.NOTIFICATION_WM_FOCUS_OUT ( 4.x ではNOTIFICATION_APPLICATION_FOCUS_OUT) はバックグラウウンドへアプリが隠れた状態(一時停止?)なので、今回の終了通知には含めません。
# if 文の has 関数がかっこいい!

# 通知イベントで呼び出されます。
func _notification(what):
	var quit_type = [
		# 閉じる
		NOTIFICATION_WM_CLOSE_REQUEST,
		# バックグラウンド
		#NOTIFICATION_APPLICATION_FOCUS_OUT,
		# バックキー (android)
		NOTIFICATION_WM_GO_BACK_REQUEST,
	]
	# quit_type の要素のいずれかにあてはまる通知の場合は、セーブします。
	if quit_type.has(what):
		# セーブデータを書き込みます。
		print("セーブします")
		save_app_data()
		get_tree().quit() # default behavior
	return

Android 環境で発生する NOTIFICATION_WM_GO_BACK_REQUEST 通知を受けるには、プロジェクト設定ウィンドウの「一般」タブの「アプリケーション」→「構成」で、「高度な設定」を有効にしてから表示される、「「戻る」で終了」がチェック(既定でチェックされています)されている必要があります。
※プロジェクト設定ウィンドウは、メニュー「プロジェクト」→「プロジェクト設定」で表示できます。

Godot4 NOTIFICATION_WM_GO_BACK_REQUEST イベント通知を受けるにはプロジェクト設定で「戻る」で終了がチェックされている必要があります.

テストは F6 ではなく F5 キーで行います

アプリのセーブデータの読み込みは、 F6 キーの現在のシーンを再生でメインのシーンを再生しても行われませんでした
セーブデータのテストをする際はメインのシーンを開いた状態で F5 キーを押して、確認ダイアログで「現在のものを選択」ボタンを押して、メインシーンを設定してから実行します。

Godot4 セーブデータのテストはF6キーではなく F5 キーで実行すると正しく処理されました.

メインシーンの設定は、メニュー「プロジェクト」→「プロジェクト設定」で表示した「プロジェクト設定」ダイアログの「一般」タブの「アプリケーション」→「実行」ページの「メインシーン」の項目で確認・変更できます。

Godot4 メインシーンの設定はプロジェクト設定ウィンドウのアプリケーション>実行のページで確認変更できます.

メインシーンを設定してからそのシーンを再生すると F6 キーで試していた際に書き込まれていたであろうファイルからセーブデータがロードされました
その後、スコアや音量を変更して閉じてから再び F5 キーで実行すると、変更したスコアと音量がロードされました。

セーブデータのファイルの保存場所

セーブデータがない状態でテストしたい場合は、保存場所のファイルを削除します。
Windows の場合は「%APPDATA%\Godot\app_userdata\」のフォルダの下に、指定したパスで保存されています。

On desktop platforms, the actual directory paths for user:// are:

TypeLocation
DefaultWindows: %APPDATA%\Godot\app_userdata\[project_name]macOS: ~/Library/Application Support/Godot/app_userdata/[project_name]Linux: ~/.local/share/godot/app_userdata/[project_name]
Custom dirWindows: %APPDATA%\[project_name]macOS: ~/Library/Application Support/[project_name]Linux: ~/.local/share/[project_name]
Custom dir and nameWindows: %APPDATA%\[custom_user_dir_name]macOS: ~/Library/Application Support/[custom_user_dir_name]Linux: ~/.local/share/[custom_user_dir_name]
File paths in Godot projects — Godot Engine (stable) documentation in English

エクスプローラのアドレスのテキストボックスに「%APPDATA%\Godot\app_userdata\」を貼り付けると、それに対応したパスが表示されました。
プロジェクト名のフォルダがあるのでそれを開くと、先ほど指定した名前のセーブファイルがありました。

Godot4 user に対応したフォルダにプロジェクト名のフォルダがあり、その中に保存したセーブファイルもありました.

このセーブファイルを消すことで、最初の起動時の初期化の確認も行えます。
※整数1つと小数1つの辞書型の変数を保存した TapTheTakarabako.save ファイルの容量は 37 バイトでした。

テスト

F5 キーメインシーンを再生して、セーブデータがない状態ではスコアが 0 と表示され、セーブデータがある場合は、その値が表示されることを確認しました。
2回目の起動で前回終了時のスコアが保存されていて、その値が2回目の起動時に表示されることも確認できました。

Godot4 TapTheTakarabako アプリの初回起動時は初期値が割り当てられてスコアと音量を変更して閉じてから起動するとその値がロードされました..

まとめ

今回は、2D / 3D ゲームを作成できる無料・オープンソースの軽快なゲームエンジン「Godot Engine 4」で、スコアと音量の値をセーブデータとして管理して、起動時に読み込み終了時に保存する実装例を紹介しました。
セーブデータのファイルの保存先や、通知イベントで受け取るアプリが終了するメッセージ番号についても紹介しました。
メインシーンを設定していないとセーブ処理が行われなかったことも記載しました。

参照サイト Thank You!

記事一覧 → Compota-Soft-Press

コメント

Ads Blocker Image Powered by Code Help Pro

お願い - Ads Blocker Detected

このサイトは広告を掲載して運営しています。

ポップアップを閉じて閲覧できますが、よろしければ

このサイト内の広告を非表示にする拡張機能をオフにしていただけませんか?

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.

タイトルとURLをコピーしました