この記事について

音量スライダーを動かしても、その値を変数に入れただけではゲームを終了すると消えてしまいます。この記事では、音量をConfigFileで保存し、次回起動時に同じ値へ戻す設定画面を作ります。

Godot 4.6.3のGDScriptを使います。エディターの項目名は英語表記です。保存するのは音量1項目だけで、ゲーム進行のセーブやパスワードの保管は扱いません。

この記事でわかること

  • HSliderの値をConfigFileへ書き込む方法
  • user://へ保存し、起動時に読み込む方法
  • 初回起動や不正な値でも初期値で動かす方法

基本手順

完成サンプルはこちらのGodotプロジェクトZIPから開けます。ZIPを展開し、Project ManagerのImportでproject.godotを選んでください。自分で新規作成する場合は、レンダラーをCompatibilityにして進めます。

手順1:音量設定の画面を作る

空のプロジェクトでScene → New Sceneを開き、User Interfaceを選びます。ルートのControlをSettingsUIへ名前変更し、main.tscnとして保存します。SettingsUIの子にVBoxContainerを追加してContentと名付け、その子に次のノードを追加します。

SettingsUI (Control)
└ Content (VBoxContainer)
  ├ TitleLabel (Label)
  ├ ValueLabel (Label)
  ├ VolumeSlider (HSlider)
  ├ SaveButton (Button)
  └ StatusLabel (Label)

ContentのInspectorでLayout → TransformのPositionをX=40、Y=40、SizeのXを640にします。Theme Overrides → ConstantsのSeparationは16です。LabelとButtonのFont Sizeは24、ボタンとスライダーのCustom Minimum SizeのYは48にします。

TitleLabelのTextを「音量設定を保存する」、ValueLabelを「音量: 60%」、SaveButtonを「設定を保存」にします。StatusLabelはTextを空欄にし、Autowrap ModeをWord Smartにします。VolumeSliderはMin Value=0、Max Value=100、Step=1、Value=60です。

手順1:VolumeSliderの範囲を0〜100、初期値を60にします。
手順1:VolumeSliderの範囲を0〜100、初期値を60にします。

手順2:親ノードへ保存・読み込みコードを付ける

SettingsUIを選び、Attach Scriptからres://main.gdを作ります。Templateのチェックを外し、Createを押してください。内容を次のコードへ置き換えます。シグナルは_ready()で接続するため、Signalsタブで重ねて接続する必要はありません。

extends Control

const SAVE_PATH := "user://settings.cfg"
const DEFAULT_VOLUME := 60.0
@onready var slider: HSlider = $Content/VolumeSlider
@onready var value_label: Label = $Content/ValueLabel
@onready var status_label: Label = $Content/StatusLabel

func _ready() -> void:
	slider.value_changed.connect(_on_volume_changed)
	$Content/SaveButton.pressed.connect(_save_settings)
	_load_settings()

func _on_volume_changed(value: float) -> void:
	value_label.text = "音量: %d%%" % roundi(value)
	AudioServer.set_bus_volume_linear(0, value / 100.0)

func _load_settings() -> void:
	var config := ConfigFile.new()
	var error := config.load(SAVE_PATH)
	var volume := DEFAULT_VOLUME
	if error == OK:
		var saved: Variant = config.get_value("audio", "volume", DEFAULT_VOLUME)
		if (saved is float or saved is int) and is_finite(float(saved)):
			volume = clampf(float(saved), 0.0, 100.0)
			status_label.text = "保存した設定を読み込みました"
		else:
			status_label.text = "値が不正なため、初期値を使います"
	elif error == ERR_FILE_NOT_FOUND:
		status_label.text = "初回起動: 初期値を使います"
	else:
		status_label.text = "読み込めませんでした: %s" % error_string(error)
	slider.set_value_no_signal(volume)
	_on_volume_changed(volume)

func _save_settings() -> void:
	var config := ConfigFile.new()
	config.set_value("audio", "volume", slider.value)
	var error := config.save(SAVE_PATH)
	if error == OK:
		status_label.text = "保存しました: %d%%" % roundi(slider.value)
	else:
		status_label.text = "保存に失敗しました: %s" % error_string(error)

_on_volume_changed()は表示文字を更新し、Masterバスの音量にも値を反映します。AudioServerのバス番号0がMasterです。スライダーの0〜100を100で割り、0〜1の値として渡しています。このサンプルには音源を置いていないため、まず表示と保存結果を確認してください。音量調整は、このプロジェクトのMasterバスを通る音へ適用されます。

手順2:起動時に読み込み、保存ボタンでConfigFile.save()を呼びます。
手順2:起動時に読み込み、保存ボタンでConfigFile.save()を呼びます。

手順3:初回起動で60%になることを確認する

シーンとスクリプトを保存し、Run Current Scene(標準ではF6)で実行します。まだこのサンプルの設定を保存していなければ「音量: 60%」「初回起動: 初期値を使います」と表示されます。

ConfigFile.load()の結果がERR_FILE_NOT_FOUNDなら、保存ファイルがない初回起動として扱います。get_value()の第3引数も初期値です。ファイルはあってもaudioセクションやvolumeキーがない場合に60を使います。

set_value_no_signal()でスライダーを復元した後、_on_volume_changed()を1回呼び、文字と実際のバス音量もそろえます。スライダーの値だけを戻すと、音量側が初期状態のままになるためです。

手順3:初回起動では、保存ファイルがなくても60%で動きます。
手順3:初回起動では、保存ファイルがなくても60%で動きます。

手順4:値を保存し、終了してから再実行する

スライダーを好きな値へ動かし、「設定を保存」をクリックします。たとえば37にすると「保存しました: 37%」と表示されます。GodotのStop(標準ではF8)で実行を止め、もう一度F6で実行してください。「音量: 37%」「保存した設定を読み込みました」へ戻れば成功です。

独立したウィンドウで試す場合は、保存後にProject → Quit to Project Listへ戻り、Project Managerでこのプロジェクトを選んでRunを押します。独立実行を終えるときは、その実行ウィンドウを閉じます。

set_value()はメモリー上の内容を変更し、save()がファイルへ書き込みます。今回はボタンを押した時だけ保存します。スライダーを動かした後、保存せず終了した場合は、最後に保存した値が次回の起動時に使われます。

手順4:37%を保存し、実行を終了して再起動しても37%へ戻ります。
手順4:37%を保存し、実行を終了して再起動しても37%へ戻ります。

手順5:保存ファイルの場所と内容を確認する

エディターのProject → Open User Data Folderで、このプロジェクトの保存先を開きます。settings.cfgの中には次のような内容が入ります。res://はプロジェクト内の素材やスクリプト、user://は実行時の保存データに使う場所です。実際のフォルダー位置はOSとプロジェクト名によって変わります。

volume=37.0

今回は1項目専用のファイルを毎回作り直して保存しています。同じファイルに別の設定を追加する場合は、すべての項目を保存するか、既存ファイルを読み込んでから変更してください。このまま別のキーを足しても、保存時にそのキーは残りません。

手順5:Project → Open User Data Folderからsettings.cfgを確認できます。
手順5:Project → Open User Data Folderからsettings.cfgを確認できます。

うまくいかないときの確認箇所

終了すると初期値へ戻ってしまう

「設定を保存」を押し、成功表示が出てから終了したか確認します。SAVE_PATHの文字列が保存側と読み込み側で一致していることも確認してください。プロジェクト名を変えたり別のプロジェクトを開いたりすると、異なる保存先になる場合があります。

値を読み込めない、またはファイルが壊れている

このコードは読み込みに失敗すると初期値60を使い、画面へエラーを表示します。数値以外の値も初期値へ戻し、範囲外の数値は0〜100に収めます。保存データを調べる場合は、まず実行を止めてsettings.cfgのコピーを取ってください。次に「設定を保存」を押すと既存ファイルを上書きするため、原因調査前に保存し直さないようにします。

保存に失敗したと表示される

画面に出たエラー名とDebuggerを確認します。保存先はuser://settings.cfgのまま試してください。書き込みできない場所へ変更したり、存在しないサブフォルダーを指定したりすると失敗する場合があります。成功を決め打ちせず、save()の戻り値がOKか確認することが大切です。

まとめ

設定の保存は、値をConfigFileへ入れる処理、save()で書き込む処理、起動時にload()して画面へ戻す処理の3つに分けると整理できます。初回起動の既定値を用意し、保存に成功したことと、終了後も値が復元されることを確認しましょう。