2D / 3D ゲームを作成できる無料・オープンソースの軽快なゲームエンジン「Godot Engine 4」で、スコアと音量の値をセーブデータとして管理して、起動時に読み込み、終了時に保存する実装例を紹介します。
セーブデータのファイルの保存先や、通知イベントで受け取るアプリが終了するメッセージ番号についても紹介します。
※この記事の内容は、アプリ タップ The 宝箱 の開発でも使用しています。
※ GodotEngine のバージョンは 4.1.2 です。 .NET 版ではありません。
※「いらすとや」様の画像を使用しています。
※「ふい字」フォントを使用しています。
※「魔王魂」様のサウンドを動画内で使用しています。
※「無料効果音で遊ぼう!」様のサウンドを動画内で使用しています。
※記事で紹介するスクリプト / プログラム / コードは自己責任で使用してください。
前回の記事
前回は、独自のシグナルと、それを受け取る受信側メソッドを作成して、お宝が出た際にスコアの値と表示を更新する実装例を紹介しました。
画面に以下の変更を加えました。
- 上部に高さ 100px 程度の余白を追加して UI 全体を下側に移動。
- 上部にタイトルバナーの追加
- スコアのラベルにアウトラインを追加。背景画像を追加。
19 桁表示するためフォントサイズを 60 から 55 へ変更。 - 音量調節のスライダーに背景画像を追加。
- 下部にクレジット、作者名のラベル(アウトライン付)を追加。
セーブデータの読み込みと保存方法
セーブファイルの保存先のパスを変数に保持します。
この変数はロードとセーブの関数で用います。
紹介するスクリプトは他サイト様「【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 は、シーンにある同じ名称のラベルとスライダーのノードへ $ をつけてアクセスしています。
ゲームデータの初期化時にロード処理を追加
ゲームデータをロードするタイミングは、メインシーンの 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 通知を受けるには、プロジェクト設定ウィンドウの「一般」タブの「アプリケーション」→「構成」で、「高度な設定」を有効にしてから表示される、「「戻る」で終了」がチェック(既定でチェックされています)されている必要があります。
※プロジェクト設定ウィンドウは、メニュー「プロジェクト」→「プロジェクト設定」で表示できます。
テストは F6 ではなく F5 キーで行います
アプリのセーブデータの読み込みは、 F6 キーの現在のシーンを再生でメインのシーンを再生しても行われませんでした。
セーブデータのテストをする際はメインのシーンを開いた状態で F5 キーを押して、確認ダイアログで「現在のものを選択」ボタンを押して、メインシーンを設定してから実行します。
メインシーンの設定は、メニュー「プロジェクト」→「プロジェクト設定」で表示した「プロジェクト設定」ダイアログの「一般」タブの「アプリケーション」→「実行」ページの「メインシーン」の項目で確認・変更できます。
メインシーンを設定してからそのシーンを再生すると F6 キーで試していた際に書き込まれていたであろうファイルからセーブデータがロードされました。
その後、スコアや音量を変更して閉じてから再び F5 キーで実行すると、変更したスコアと音量がロードされました。
セーブデータのファイルの保存場所
セーブデータがない状態でテストしたい場合は、保存場所のファイルを削除します。
Windows の場合は「%APPDATA%\Godot\app_userdata\
」のフォルダの下に、指定したパスで保存されています。
On desktop platforms, the actual directory paths for
user://
are:File paths in Godot projects — Godot Engine (stable) documentation in English
Type Location Default Windows: %APPDATA%\Godot\app_userdata\[project_name]
macOS:~/Library/Application Support/Godot/app_userdata/[project_name]
Linux:~/.local/share/godot/app_userdata/[project_name]
Custom dir Windows: %APPDATA%\[project_name]
macOS:~/Library/Application Support/[project_name]
Linux:~/.local/share/[project_name]
Custom dir and name Windows: %APPDATA%\[custom_user_dir_name]
macOS:~/Library/Application Support/[custom_user_dir_name]
Linux:~/.local/share/[custom_user_dir_name]
エクスプローラのアドレスのテキストボックスに「%APPDATA%\Godot\app_userdata\
」を貼り付けると、それに対応したパスが表示されました。
プロジェクト名のフォルダがあるのでそれを開くと、先ほど指定した名前のセーブファイルがありました。
このセーブファイルを消すことで、最初の起動時の初期化の確認も行えます。
※整数1つと小数1つの辞書型の変数を保存した TapTheTakarabako.save ファイルの容量は 37 バイトでした。
テスト
F5 キーでメインシーンを再生して、セーブデータがない状態ではスコアが 0 と表示され、セーブデータがある場合は、その値が表示されることを確認しました。
2回目の起動で前回終了時のスコアが保存されていて、その値が2回目の起動時に表示されることも確認できました。
まとめ
今回は、2D / 3D ゲームを作成できる無料・オープンソースの軽快なゲームエンジン「Godot Engine 4」で、スコアと音量の値をセーブデータとして管理して、起動時に読み込み、終了時に保存する実装例を紹介しました。
セーブデータのファイルの保存先や、通知イベントで受け取るアプリが終了するメッセージ番号についても紹介しました。
メインシーンを設定していないとセーブ処理が行われなかったことも記載しました。
参照サイト Thank You!
- Godot Engine – Free and open source 2D and 3D game engine
- かわいいフリー素材集 いらすとや
- 魔王魂 | 無料で使える森田交一の音楽
- 無料効果音で遊ぼう!
- ゲームの保存 — Godot Engine (4.x)の日本語のドキュメント
- 【Godot4.x】セーブデータの保存方法 | 2dgames.jp
- How to save game progress on android? – Archive – Godot Forum
user://
はどこを指しているのか | Godot Engine – BioErrorLog Tech Blog- File paths in Godot projects — Godot Engine (stable) documentation in English
- 終了リクエストの処理 — Godot Engine (4.x)の日本語のドキュメント
- Godot 4, using notification to catch back button. – Godot Forums
- FileAccess — Godot Engine (4.x)の日本語のドキュメント
- godot-3to4.vercel.app
記事一覧 → Compota-Soft-Press
コメント