今回はゲームの設定を保存するファイルとして使える ConfigFile の使い方を説明します。
目次
ConfigFileの使い方
ConfigFileとは
繰り返しになりますが、ConfigFileとは Godot Engineで設定ファイルとして使うことを想定されているデータ形式です。
このファイルはINIファイルのようなファイル形式で、セクションとデータ部に分かれたデータ構造となります。
ConfigFileの出力例としては以下のようなフォーマットとなります。
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")
完成プロジェクト
今回作成したプロジェクトファイルを添付しておきます。