Godot Engineで使用するノードに関しての備忘録です。
この記事はAIを活用して作成しました。
Godot 4.6のConfigFileを初心者向けに理解する
Godotでゲームを作っていると、
- プレイヤーの名前
- レベル
- 所持金
- HP
- BGM音量
- 効果音音量
- キー設定
- ハイスコア
- セーブデータ
などを保存したくなることがあります。
そんなときに便利なのが、Godotの ConfigFile です。
この記事では、Godot 4.6のConfigFileについて、初心者向けにできるだけ分かりやすく説明します。
ConfigFileとは?
一言でいうと、
「ゲームのデータをファイルに保存して、あとで読み込むための仕組み」
です。
GodotのConfigFileは、INI形式に似た構造でデータを保存できます。
例えば、次のようなデータです。
[Player]
name="劉備"
level=10
gold=500
[Settings]
bgm_volume=80
se_volume=70
この中で、
[Player]
[Settings]
がセクションです。
そして、
name
level
gold
bgm_volume
se_volume
がキーです。
それぞれのキーに値が保存されています。
1. データを保存する
まずは一番基本的な使い方です。
var config = ConfigFile.new()
config.set_value("Player", "name", "劉備")
config.set_value("Player", "level", 10)
config.set_value("Player", "gold", 500)
config.save("user://save.cfg")
これで、
user://save.cfg
というファイルにデータが保存されます。
特に重要なのが、この部分です。
config.set_value("Player", "level", 10)
これは、
セクション = Player
キー = level
値 = 10
という意味です。
2. 保存したデータを読み込む
次に、保存したデータを読み込んでみます。
var config = ConfigFile.new()
var err = config.load("user://save.cfg")
if err != OK:
return
var player_name = config.get_value("Player", "name")
var level = config.get_value("Player", "level")
var gold = config.get_value("Player", "gold")
これで、
player_name
には、
劉備
が入ります。
また、
level
には、
10
が入り、
gold
には、
500
が入ります。
load()が正常に完了するとOKが返されます。
そのため、
if err != OK:
で読み込みに失敗した場合の処理を作ることができます。
3. 「セクション」と「キー」を理解する
ConfigFileを理解するうえで重要なのが、
- セクション
- キー
- 値
の3つです。
例えば、
config.set_value("Player", "name", "劉備")
と書いた場合、
Player
↓
name → 劉備
という構造になります。
複数のデータを保存すると、
config.set_value("Player", "name", "劉備")
config.set_value("Player", "level", 10)
config.set_value("Player", "hp", 150)
config.set_value("Settings", "bgm", 80)
config.set_value("Settings", "se", 70)
次のようなデータになります。
[Player]
name="劉備"
level=10
hp=150
[Settings]
bgm=80
se=70
つまり、
セクション
↓
キー
↓
値
という構造だと考えると分かりやすいです。
4. デフォルト値を設定する
get_value()では、デフォルト値を設定することができます。
例えば、
var level = config.get_value("Player", "level", 1)
とします。
この場合、
Player → level
が存在すれば、その保存されている値を取得します。
もし存在しなければ、
1
を返します。
つまり、
var bgm_volume = config.get_value("Settings", "bgm_volume", 100)
とすると、
BGM音量が保存されていれば、その値を使う。
保存されていなければ100を使う。
という処理になります。
これはゲームの設定などを扱うときに非常に便利です。
5. 「保存したつもり」にならないように注意
ここは初心者が間違えやすいポイントです。
例えば、
var config = ConfigFile.new()
config.set_value("Player", "gold", 1000)
と書いただけでは、ファイルには保存されません。
set_value()は、ConfigFileのメモリ上のデータを変更しているだけです。
実際にファイルへ書き込むには、
config.save("user://save.cfg")
が必要です。
つまり、
set_value()
↓
メモリ上のデータを変更
↓
save()
↓
実際のファイルに保存
という流れです。
6. user://とは?
Godotでは、
"user://save.cfg"
という書き方をよく使います。
user://は、ゲームをプレイしているユーザーのためのデータ保存場所です。
例えば、
config.save("user://save.cfg")
としておけば、WindowsやAndroidなど、それぞれの実行環境に適したユーザーデータ領域に保存できます。
そのため、ゲームのセーブデータなどには、
user://
を使うのが基本です。
例えば、
user://save.cfg
のようにします。
7. セーブデータを作ってみる
ここまでの内容を使って、RPGのセーブデータを作ってみます。
例えば、三国志をテーマにしたRPGなら、
func save_game():
var config = ConfigFile.new()
config.set_value("Player", "name", "劉備")
config.set_value("Player", "level", 10)
config.set_value("Player", "hp", 150)
config.set_value("Player", "gold", 500)
config.set_value("World", "map", "china")
config.set_value("World", "x", 320)
config.set_value("World", "y", 180)
config.save("user://save.cfg")
この処理を実行すると、保存されるデータはイメージとして次のようになります。
[Player]
name="劉備"
level=10
hp=150
gold=500
[World]
map="china"
x=320
y=180
このように、
Player
と
World
を別々のセクションにすることで、データを整理して保存できます。
8. セーブデータを読み込む
次は、保存したデータを読み込んでみます。
func load_game():
var config = ConfigFile.new()
var err = config.load("user://save.cfg")
if err != OK:
print("セーブデータがありません")
return
var player_name = config.get_value("Player", "name", "劉備")
var level = config.get_value("Player", "level", 1)
var hp = config.get_value("Player", "hp", 100)
var gold = config.get_value("Player", "gold", 0)
print(player_name)
print(level)
print(hp)
print(gold)
例えば保存されているデータが、
name = 劉備
level = 10
hp = 150
gold = 500
なら、読み込んだ変数にはそれぞれ、
player_name → 劉備
level → 10
hp → 150
gold → 500
が入ります。
9. よく使う命令
ConfigFileにはいくつかのメソッドがありますが、最初は次のものを覚えておけば十分です。
| 命令 | 意味 |
|---|---|
ConfigFile.new() |
ConfigFileを作る |
set_value() |
データを設定する |
get_value() |
データを取得する |
save() |
ファイルに保存する |
load() |
ファイルから読み込む |
さらに、
config.has_section("Player")
を使うと、指定したセクションが存在するか確認できます。
また、
config.has_section_key("Player", "level")
を使うと、指定したセクションに特定のキーが存在するか確認できます。
10. ConfigFileはセーブデータに使える?
はい、使えます。
例えば、
user://save1.cfg
user://save2.cfg
user://save3.cfg
のようにすれば、
セーブ1
セーブ2
セーブ3
といった複数のセーブデータを作ることもできます。
例えば、
config.save("user://save1.cfg")
ならセーブ1、
config.save("user://save2.cfg")
ならセーブ2、
config.save("user://save3.cfg")
という形にできます。
11. ConfigFileは何に向いている?
ConfigFileは、特に次のようなデータを保存するのに便利です。
- ゲーム設定
- BGM音量
- 効果音音量
- キー設定
- ハイスコア
- 簡単なセーブデータ
- プレイヤー情報
- ゲームの進行状況
例えば、
[Settings]
bgm_volume=80
se_volume=70
[Player]
level=10
gold=500
[World]
map="china"
x=320
y=180
のように整理して保存できます。
12. 大量で複雑なデータの場合は?
ConfigFileは便利ですが、ゲームのデータが非常に大量になった場合や、複雑な構造のデータを保存したい場合には、JSONや独自のセーブシステムなどを検討することもできます。
例えば、
ConfigFile
↓
設定や比較的シンプルなセーブデータ
JSON
↓
構造化された大量のデータ
独自セーブシステム
↓
より複雑なゲームデータ
というように使い分けることができます。
13. 暗号化して保存することもできる
ConfigFileには、暗号化して保存するためのメソッドもあります。
代表的なものとして、
save_encrypted()
や、
save_encrypted_pass()
があります。
公式ドキュメントでは、save_encrypted()はAES-256による暗号化を使用すると説明されています。
セーブデータの内容を通常のConfigFileとしてそのまま保存したくない場合などに利用できます。
ただし、暗号化したからといって、ゲームのセーブデータを完全に改ざんできなくするという意味ではありません。
14. ConfigFileの基本をまとめる
ConfigFileの基本的な流れは非常にシンプルです。
保存
var config = ConfigFile.new()
config.set_value("Player", "gold", 500)
config.save("user://save.cfg")
流れとしては、
ConfigFileを作る
↓
set_value()でデータを入れる
↓
save()で保存する
です。
読み込み
var config = ConfigFile.new()
config.load("user://save.cfg")
var gold = config.get_value("Player", "gold", 0)
流れとしては、
ConfigFileを作る
↓
load()でファイルを読み込む
↓
get_value()でデータを取得する
です。
15. 最低限これだけ覚えればOK
ConfigFileを初めて使うなら、まずはこの形を覚えておけば大丈夫です。
保存
var config = ConfigFile.new()
config.set_value("Player", "gold", 500)
config.save("user://save.cfg")
読み込み
var config = ConfigFile.new()
config.load("user://save.cfg")
var gold = config.get_value("Player", "gold", 0)
つまり、
set_value()→save()で保存
そして、
load()→get_value()で読み込み
と覚えておけばOKです。
まとめ
GodotのConfigFileは、
ゲーム内の設定やデータをファイルに保存・読み込みするための便利なクラス
です。
基本的な構造は、
[セクション]
キー = 値
です。
例えば、
[Player]
name="劉備"
level=10
gold=500
というデータを作ることができます。
GDScriptでは、
config.set_value("Player", "gold", 500)
でデータを設定し、
config.save("user://save.cfg")
で保存します。
そして、
config.load("user://save.cfg")
で読み込み、
var gold = config.get_value("Player", "gold", 0)
でデータを取得します。
まずは、
set_value()
save()
load()
get_value()
この4つを覚えておけば、ConfigFileの基本は理解できます。
参考
Godot Engine 4.6公式ドキュメント
ConfigFile