LoginSignup
0
1

More than 1 year has passed since last update.

【Godot 4.0】スマホ3Dゲームを作るための勉強 その23 ゲームシステムを作る その8 設定を保存する

Posted at

 ゲームエンジンGodot4.0で3Dスマホゲームを作りたいと思いますが、その前にお勉強しています。
 2023/3/1にstable版がリリースされました。
Godot_v4.0-stable_win64.exe.zipを使用しています。

目的

 ゲームシステムをつくっていきます。
 設定をPlayerの発射間隔に反映します。また保存できるようにします。

ベースプロジェクト

 下記で作成したプロジェクトをベースに機能追加をします。
 【Godot 4.0】スマホ3Dゲームを作るための勉強 その22 ゲームシステムを作る その7 PopupPanelをデザインする
 https://qiita.com/FootInGlow/items/8dd07805f4c8f2f72cb2
 
 github(Godotのプロジェクトマネージャーからインポートして利用できます)
 https://github.com/footinglow/Godot4/tree/main/02_study/S22_GameSystem_007

設定を適用する

 PopupPanelで変更した発射間隔を保存して、Player.tscnに反映するようにします。

設定値を保存するスクリプトを追加する

 スクリプトを新規追加します。
 画面上部の「Script」をクリックして、ファイルメニューの「新規スクリプト」を実行します。
スクリーンショット (128).png
「global_settings.gd」という名前にして「作成」ボタンを押下します。
スクリーンショット (129).png
追加されました。
スクリーンショット (130).png

シングルトン(自動読み込み)としてAutoloadに登録する

 シーン間(Title.tscn、game_system.tscn)で共通の設定変数を定義するスクリプトはシングルトン(自動読み込み)として登録します。

 プロジェクトメニューからプロジェクト設定を実行します。
 パスに「res://global_settings.gd」を登録します。設定されたノード名を確認して、「追加」ボタンを押下します。
スクリーンショット (131).png
 追加されました。
 「グローバル変数」の「有効」にチェックがついていることを確認します。チェックが入っていると、どのスクリプトからでも名前"GlobalSettings"でアクセスできるようになります。
スクリーンショット (132).png

設定値を保存する変数を追加する。

 res://global_settings.gdを開きます。
 下記のように修正して、設定値を保存する変数を定義します。

extends Node

var m_firing_timing_sec = 1.0

PopupPanelで設定する

 PopupPanelのスライダーで変更し、「設定完了」ボタンを押下したら、m_firintiming_secを更新します。

 res://settings_popup_panel.gdを開きます。

extends PopupPanel

func open():
	get_tree().paused = true
	popup_centered()

func _on_h_slider_drag_ended(value_changed):
	$ControlBaseSize/VBoxContainer/MarginContainer/Label.text = "発射間隔 %.1f秒" % $ControlBaseSize/VBoxContainer/MarginContainer2/HSlider.value

func _on_button_pressed():
	GlobalSettings.m_firing_timing_sec = $ControlBaseSize/VBoxContainer/MarginContainer2/HSlider.value
	hide()

func _on_popup_hide():
	get_tree().paused = false

 HSlider.valueに設定された0.1~1.0の値を、_on_button_pressed()メソッドが呼ばれたときにGlobalSettings.m_firing_timing_secに設定する処理を追加しました。

発射間隔を適用する

 res://Characters/player.tscnを開きます。Timer_fireを選択してインスペクタを確認します。
 Timer_fireに設定したタイマーの間隔が発射間隔なので、スクリプトから変更します。
 スクリーンショット (133).png

 res://Characters/Player.gdを開きます。
 下記の処理を追加しましょう。

func _ready():
	$Timer_fire.wait_time = GlobalSettings.m_firing_timing_sec

 「Game Start!」ボタンが押下されるとGameSystem.tscnが新規に生成されて、その中でPlayer.tscnが生成、スクリプトの_ready()が呼ばれます。
 Timerノードの待ち時間はwait_timeに設定すると変更できます。

 実行します。発射間隔を0.1秒にするとたくさん発射されるようになりました。
スクリーンショット (135).png
スクリーンショット (137).png

保存する

 ConfigFileクラスを使用して保存・読み出しをします。
 ConfigFileクラスを使用すると、カテゴリ+キーに対して値を保存・読み出しできるようになります。今回はカテゴリを"Player"、キーを"firing_timing"にして、発射間隔0.1~1.0の値を保存・読み出しするようにします。
 あと、ファイル名を決める必要があるので、「config.cfg」にします。
 
 res://global_settings.gdを開きます。
 下記のように修正します。

extends Node

var m_firing_timing_sec = 1.0

const M_FILE_NAME = "user://config.cfg"

func _ready():
	# ConfigFile生成
	var config = ConfigFile.new()
	# ファイルから読み出し
	var err = config.load(M_FILE_NAME)
	# エラーの場合終了(最初の軌道の場合はファイルがない)
	if err != OK:
		return
	# クション"Player"のキー"firing_timing"に対する値を読み出す
	m_firing_timing_sec = config.get_value("Player", "firing_timing")

func save():
	# ConfigFile生成
	var config = ConfigFile.new()
	# セクション"Player"のキー"firing_timing"に対して、m_firing_timing_secを保存する
	config.set_value("Player", "firing_timing", m_firing_timing_sec)

	# ファイルに保存する (上書き).
	config.save(M_FILE_NAME)

 急に処理がたくさんありますが、カスタマイズするとしたら下記の部分です。

  • func _ready(): Configファイルの読み出し
     m_firing_timing_sec = config.get_value("Player", "firing_timing")
     カテゴリ"Player"+キー"firing_timing"で保存している値をm_firing_timing_secに読み出します。

  • func save():: Configファイルの保存
     config.set_value("Player", "firing_timing", m_firing_timing_sec)
     カテゴリ"Player"+キー"firing_timing"に対して、m_firing_timing_secを値として保存するという指定です。

 次にPopupPanelの設定完了ボタンを押下したときに保存するようにします。
 res://settings_popup_panel.gdを開きます。
 func _on_button_pressed()メソッドに「GlobalSettings.save()」の1行を追加して、設定を保存するようにしました。

extends PopupPanel

func open():
	get_tree().paused = true
	popup_centered()

func _on_h_slider_drag_ended(value_changed):
	$ControlBaseSize/VBoxContainer/MarginContainer/Label.text = "発射間隔 %.1f秒" % $ControlBaseSize/VBoxContainer/MarginContainer2/HSlider.value

func _on_button_pressed():
	GlobalSettings.m_firing_timing_sec = $ControlBaseSize/VBoxContainer/MarginContainer2/HSlider.value
	GlobalSettings.save()
	hide()

func _on_popup_hide():
	get_tree().paused = false

 ファイルが保存されるパスはプラットフォームごとに異なっています。

Godot Engine 4.0 documentation in English
File and data I/O File paths in Godot projects
https://docs.godotengine.org/en/latest/tutorials/io/data_paths.html#accessing-persistent-user-data-user

 Windowsで実行した場合は「Windows: %APPDATA%\Godot\app_userdata[project_name]」にあるようです。
 C:\Users......\AppData\Roaming\Godot\app_userdata\S23_GameSystem_008に「config.cfg」というファイルが生成されました。
 中を見るとテキストファイルで、下記のように保存されていました。

[Player]

firing_timing=0.1

 以上です。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1