🐡

Godot Mod Loaderの設定ファイルの使い方

に公開

はじめに

この記事はGodot Modding 入門に関連してMODの設定を書出し、リリース後にユーザが設定を変更できる仕組みづくりをまとめたものです。

成果物

この解説を通して解説する内容に関連する成果物を先に示します。

  • 設定読み込み機能を利用した例

Tiny Pasture 双子三つ子MODを作成しました。
動物を交配した際に固定で1匹新しい動物が産まれる仕組みについて、確率で2匹や3匹産まれる仕組みを追加するというものです。

交配した際に何匹生まれるのかの確率をユーザが変更できる仕組みを導入しています。

  • Godot Mod Loaderに実装されている設定周りの機能をテストした例

Tiny Pasture 双子三つ子MODでは利用しなかったMod Loaderに用意されている機能を利用した例を実装しています。

GodotMod-config_sample

設定機能の使い方

MOD基本情報の構成

MODの基本情報である名前や説明はmanifest.jsonに書き込みます。
MODの設定はextra.godot.config_schemaに定義します。

manifest.json
{
    "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名や依存関係など様々な情報が書き込まれますが、今回は設定に関連する項目のみを抜き出して表記します。
データ型や他の定義例については公式サイトを参照してください。

manifest.json
{
    "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を紹介します。

manifest.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制作者が設定の内容や注を残すために使用する項目であり、必須の項目ではありません。
ただ保守も考えて最低限定義しておいた方が安全です。

default.json
{
    "create_baby_probability": {
        "double": 10,
        "single": 85,
        "triple": 5
    }
}

設定の読み込み

任意のタイミングで以下のように設定ファイルを読み込みます。

manager.gd
# ユーザ定義の設定がない場合に使用する設定
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

参考資料

GitHubで編集を提案

Discussion