Godot Mod Loaderの設定ファイルの使い方
はじめに
この記事はGodot Modding 入門に関連してMODの設定を書出し、リリース後にユーザが設定を変更できる仕組みづくりをまとめたものです。
成果物
この解説を通して解説する内容に関連する成果物を先に示します。
- 設定読み込み機能を利用した例
Tiny Pasture 双子三つ子MODを作成しました。
動物を交配した際に固定で1匹新しい動物が産まれる仕組みについて、確率で2匹や3匹産まれる仕組みを追加するというものです。
交配した際に何匹生まれるのかの確率をユーザが変更できる仕組みを導入しています。
- Godot Mod Loaderに実装されている設定周りの機能をテストした例
Tiny Pasture 双子三つ子MOD
では利用しなかったMod Loaderに用意されている機能を利用した例を実装しています。
設定機能の使い方
MOD基本情報の構成
MODの基本情報である名前や説明はmanifest.json
に書き込みます。
MODの設定はextra.godot.config_schema
に定義します。
{
"dependencies": [],
"description": "Provides the ability to occasionally have twins or triplets",
"extra": {
"godot": {
"authors": ["rin_jugatla"],
"compatible_game_version": ["1.0.10"],
"compatible_mod_loader_version": ["7.0.1"],
"config_schema": {
// ここにデフォルト設定を書き込む
},
"description_rich": "",
"image": null,
"incompatibilities": [],
"load_before": [],
"optional_dependencies": [],
"tags": []
}
},
"name": "multi_baby",
"namespace": "rin_jugatla",
"version_number": "0.0.2",
"website_url": "https://github.com/rinjugatla/TinyPasture-multi_baby"
}
定義方法
MODの基本情報を書き込むmanifest.json
に設定を書き込みます。
MOD設定を定義、編集するGUIはまだ一般公開されていないのでjsonファイルを手動で編集します。
manifest.json
にはMOD名や依存関係など様々な情報が書き込まれますが、今回は設定に関連する項目のみを抜き出して表記します。
データ型や他の定義例については公式サイトを参照してください。
{
"extra": {
"godot": {
"config_schema": {
// ここから
"title": "Config", // テキストは自由記述
"description": "Config for this Mod", // テキストは自由記述
"type": "object", // object固定
"properties": { // 設定の定義
"create_baby_probability": { // 設定キー
"title": "create_baby_probability", // 設定名
"type": "object", // データタイプ
"default": { // デフォルト設定
"single": 85,
"double": 10,
"triple": 5
}
}
}
// ここまで
},
}
},
}
設定ファイルの保存先
設定
を利用する場合は必ずデフォルト設定
が必要です。
ゲームが起動しMODが読み込まれた際にデフォルト設定をまとめたdefault.json
がセーブフォルダに書き出されます。
- デフォルト設定ファイルパス
セーブフォルダはゲームに違う可能性がありますがTiny Pasture
では以下に保存されます。
# 書式
C:\Users\%username%\AppData\Roaming\[ゲーム名]\mod_configs\[MODワークスペース-MOD名]\default.json
# 例
C:\Users\%username%\AppData\Roaming\TinyPasture\mod_configs\rin_jugatla-multi_baby\default.json
デフォルト設定ファイル例
manifest.json
に以下のように定義した場合のdefault.json
を紹介します。
{
"config_schema": {
"title": "Config",
"description": "Config for this Mod",
"type": "object",
"properties": {
"create_baby_probability": {
"title": "create_baby_probability",
"type": "object",
"default": {
"single": 85,
"double": 10,
"triple": 5
}
}
}
}
}
default.json
は以下のように出力されます。
manifest.json
に表記するconfig_schema.title
などは表現されません。
config_schema.title
などはMOD制作者が設定の内容や注を残すために使用する項目であり、必須の項目ではありません。
ただ保守も考えて最低限定義しておいた方が安全です。
{
"create_baby_probability": {
"double": 10,
"single": 85,
"triple": 5
}
}
設定の読み込み
任意のタイミングで以下のように設定ファイルを読み込みます。
# ユーザ定義の設定がない場合に使用する設定
var create_baby_probability = {
"single" = 85,
"double" = 10,
"triple" = 5
}
# Called when the node enters the scene tree for the first time.
func _init() -> void:
_load_config()
func _load_config() -> void:
# ユーザ定義の設定をロード
# C:\Users\%username%\AppData\Roaming\TinyPasture\mod_configs\rin_jugatla-config_sample\custom.json
const MOD_ID = "rin_jugatla-config_sample"
const USER_CONFIG_NAME = "custom"
# ユーザ定義のコンフィグが存在するかチェック
var has_config = ModLoaderConfig.has_config(MOD_ID, USER_CONFIG_NAME)
if has_config:
# 設定ファイルを読み込み
var custom = ModLoaderConfig.get_config(MOD_ID, USER_CONFIG_NAME)
const PROPERTY_NAME = "create_baby_probability"
var probability = custom.data.get(PROPERTY_NAME)
var required_fields: = ["single", "double", "triple"]
var is_valid = probability.has_all(required_fields)
if is_valid:
create_baby_probability = probability
Discussion