【Godot】ConfigFileの使い方

今回はゲームの設定を保存するファイルとして使える ConfigFile の使い方を説明します。

ConfigFileの使い方

ConfigFileとは

繰り返しになりますが、ConfigFileとは Godot Engineで設定ファイルとして使うことを想定されているデータ形式です。
このファイルはINIファイルのようなファイル形式で、セクションとデータ部に分かれたデータ構造となります。

ConfigFileの出力例としては以下のようなフォーマットとなります。

[player] ;←「player」セクション
name=”勇者” ;←データセクション
hp=100
position=Vector2( 12, 8 )

[enemy] ;←「enemy」セクション
name=”スライム” ;←データセクション
hp=10
position=Vector2( 5, 10 )

ConfigFileでは、値に「文字列」や「数値」、Vector2などのデータ型を指定できます。

サンプルコード(書き込み)

では、実際にConfigFileを使用するコードを紹介します。

extends Node2D

func _ready() -> void:
	# ConfigFileのインスタンスを生成
	var config = ConfigFile.new()
	
	# 保存するパラメータを設定
	config.set_value("player", "name", "勇者")
	config.set_value("player", "hp", 100)
	config.set_value("player", "position", Vector2(12, 8))

	config.set_value("enemy", "name", "スライム")
	config.set_value("enemy", "hp", 10)
	config.set_value("enemy", "position", Vector2(5, 10))

	# ユーザーディレクトリに保存する
	config.save("user://game.cfg")

ConfigFileのインスタンスを作成し、set_value() でセクションとキー、値を設定します。
そして save() でパスを指定して保存します。

なお「user://」というパスはWindowsの場合

%APPDATA%\Godot\app_userdata[プロジェクト名]

macOSの場合は

%USER/Library/Application Support/Godot/app_userdata/[プロジェクト名]

に保存されます。

このパスに保存したファイルをテキストエディタで開くと、以下のような内容になっていると思います。

[player]

name="勇者"
hp=100
position=Vector2( 12, 8 )

[enemy]

name="スライム"
hp=10
position=Vector2( 5, 10 )

サンプルコード(読み込み)

次にConfigFileの読み込みを行うサンプルコードです。

func _load_and_print() -> void:
	var config = ConfigFile.new()
	
	# Configファイルを読み込む
	var ret = config.load("user://game.cfg")
	if ret != OK:
		return # 読み込み失敗
	
	# セクションとキーを指定して値を取得する
	print("player name     :", config.get_value("player", "name"))
	print("player hp       :", config.get_value("player", "hp"))
	print("player position :", config.get_value("player", "position"))

	print("enemy name      :", config.get_value("enemy", "name"))
	print("enemy hp        :", config.get_value("enemy", "hp"))
	print("enemy position  :", config.get_value("enemy", "position"))

実行結果

player hp :100
player position :(12, 8)
enemy name :スライム
enemy hp :10
enemy position :(5, 10)

config.load() で読み込みを行います。
ファイルパスを間違えて読み込みに失敗した場合は OK(0) 以外の値が返却されます。
そして、config.get_value() でセクションとキーを指定して値を取得します。

まとめて取得する方法

config.get_sections() を使用するとセクション名をすべて取得でき、config.get_section_keys() を使用すると指定のセクションに存在するキーをすべて取得できます。

以下、サンプルコードです。

func _load_and_print2() -> void:
	var config = ConfigFile.new()
	
	# Configファイルを読み込む
	var ret = config.load("user://game.cfg")
	if ret != OK:
		return # 読み込み失敗
	
	# すべてのセクションとキーを出力する
	for section in config.get_sections():
		for key in config.get_section_keys(section):
			print("%s %8s :"%[section, key], config.get_value(section, key))

この記述をすることで、すべてのセクションとキーに対応する値を出力できます。

■実行結果

player name :勇者
player hp :100
player position :(12, 8)
enemy name :スライム
enemy hp :10
enemy position :(5, 10)

暗号化

設定ファイルを平文(可読性のあるテキストファイル)で出力したくない場合は、

config.save_encrypted_pass("user://game.cfg", "pass")

config.save_encrypted_pass() を使用することで暗号化できます。(ここでは “pass” というわかりやすい文字にしましたが、もう少し複雑なパスワード文字を指定したほうが良いです)

この処理により保存したテキストは以下のようになります。

GDEC Q+2H×#ïáV¸~à wÑ»ü¦ªJKLäôÏzçž\Îtˆ¶úœ~áÜÙQVLP¨#ì_9oÊñ;ÿN©ŽãÖu¾}@T+î›bU§ºCZ(dÕihÊøÖ-P†¾Ì2gˆ’<ôTQÒÆzÚ«­å´Z¨iÃb„]4 ðh€³-ç:ž
]ӄ
“eãr¥=Ú\y

この暗号化されたファイルは、config.load_encrypted_pass() で保存時に使用した文字列 “pass” を指定します

config.load_encrypted_pass("user://game.cfg", "pass")

完成プロジェクト

今回作成したプロジェクトファイルを添付しておきます。

参考