Skip to content

Overrides ja

Tom_XV edited this page Sep 23, 2026 · 4 revisions

English | 日本語

実験的な機能です。 フレームワーク 1.4.0 で入ったもので、この先のバージョンで変わったり、無くなったりするかもしれません。

Overrides(DragNWash.ModFramework.Overrides、バージョン 1.5.0)は、コードのない Mod を動かすためのライブラリです。こういう Mod の中身は、ゲームの中で変えたい値を並べたフォルダーだけで、それでドラゴンを重くしたり、ライトを暖かい色にしたり、スポンジをゆっくりにしたりできます。コンパイルも要らないし、動くコードもありません。ライブラリがファイルを読んで、オブジェクトが出てきたら値を書き込んでくれます。いちばん簡単な作り方は、Inspector で値を変えて Export as overrides を押すやり方です。

オブジェクトが出てきたらすぐ、ではなく 何かが起きたとき に変えたいなら、Graphs を使ってください。フォルダーは同じで、overrides/ の隣に graphs/ を置きます。変えられるものも同じ 3 つ(objects.member.set、objects.material.set、objects.active.set)ですが、いつ変えるかをグラフで決められます。

設計と調査の経緯は プルリクエスト #48 にあります。

遊ぶ人向け

データの Mod を入れる

overrides の Mod は、1 つのフォルダーです。ゲームの BepInEx/plugins フォルダーに入れて、次のような形にします。

BepInEx/plugins/Heavier Dragon/
  mod.json
  overrides/main.json

フレームワークと Overrides ライブラリが要ります。Developer tools は要りません。値は誰の環境でも当たります。ゲームを起動すると、その Mod がほかの Mod と同じように、名前と作者、説明つきで Mods 画面(Options → Mods)に並びます。ゲームのスクリプトの private な値を変える Mod なら、説明にそう出ます。(一覧に出すには同じリリースの中核が要ります。古い中核でも値は当たりますが、Mods 画面には出てきません。)

オフにする

  • 1 つの Mod だけ止めるなら、Mods 画面でオフにします。ほかの Mod と同じで、効くのは次にゲームを起動したときからです(mod.json の名前が mod.json.disabled に変わって、ライブラリが読まなくなります)。戻したいときは、同じ画面でオンにします。
  • overrides の Mod をまとめて止めるなら、Mods → Drag'n Wash ModFramework: Overrides → Settings → [General] Enabled です(初期設定はオン)。
  • 消したいときは、その Mod のフォルダーを削除します。

Mod をオフにすると、値はゲームの元のものに戻ります。

Mod を作る人向け

フォルダー

BepInEx/plugins/<Mod>/
  mod.json              名前、作者、説明、バージョン
  overrides/*.json      変える値

ライブラリは BepInEx/plugins の中から、mod.json と overrides フォルダーの両方があるフォルダーを探して、overrides/ にある *.json を全部、名前の順に読みます。

mod.json

{
  "name": "Heavier Dragon",
  "authors": ["Tom"],
  "description": "A heavier dragon.",
  "version": "1.0.0"
}
項目 意味
name Mods 画面に出る名前。ないときはフォルダー名
authors 名前のリスト(1 人なら "author" でも可)
description Mod の詳細に出る説明
version ないときは 1.0.0
website 任意のリンク
guid 任意。ないときは overrides.<フォルダー名>

overrides/*.json

{
  "format": 1,
  "overrides": [
    { "scene": "Wash", "path": "Dragon/Body", "component": "Rigidbody", "member": "mass", "value": "2.5" },
    { "scene": "Wash", "path": "Lights/Key", "component": "Light", "member": "color", "value": "#FFD9A8FF" },
    { "scene": "Wash", "path": "Dragon/Body", "material": "DragonSkin", "property": "_Smoothness", "value": "0.8" }
  ]
}

(上のシーン名とオブジェクト名は例です。)

1 行ごとに、どこの何をどの値にするかを書きます。

項目 意味
scene オブジェクトがあるシーン。ないときはどのシーンでも
path 一番上のオブジェクトからのパス。Inspector の表示と同じ書き方(Root/Child/Child)
component コンポーネントの型名(Light、Rigidbody、ゲームのスクリプト)
index 同じ型のコンポーネントが複数あるときに、どれか(0 が最初で、初期値)
member コンポーネントのフィールドかプロパティ
private private なフィールドやプロパティを変えるときは true
material マテリアルのプロパティのとき:マテリアルの名前( (Instance) を除く)
property マテリアルのプロパティのとき:シェーダーのプロパティ(_Smoothness、_Color)
value 値。いつもテキストで書きます

1 行には path と value に加えて、component と member か、material と property のどちらかの組が要ります。マテリアルのときの component はなくても構いません。書けば、そのマテリアルを表示している Renderer を指し、書かなければそのオブジェクトの Renderer を使います。マテリアルで変えられるのは色、ベクトル、数値、整数で、テクスチャは変えられません(絵の差し替えは Assets ライブラリの仕事です)。

ライブラリが読めるより新しい format のファイルや、2 MB を超えるファイルは読まずに飛ばして、理由をログに書きます。

値の書き方

型 書き方
数値 2.5(小数点はドット)
bool true / false(on/off、yes/no、1/0 も可)
string その文字列
enum 値の名前
Vector2、Vector3、Vector4、Vector2Int、Vector3Int カンマで区切った数値:1, 0.5, 2
Quaternion x, y, z, w、またはオイラー角 3 つ
Color #RRGGBB か #RRGGBBAA、または 0〜1 の数値 3 つか 4 つ
Color32 #RRGGBB か #RRGGBBAA、または 0〜255 の数値 3 つか 4 つ
Rect x, y, 幅, 高さ
Bounds 中心の x, y, z、続けて大きさの x, y, z

ほかのオブジェクトへの参照(テクスチャ、メッシュ、ほかのオブジェクト)や、リストの要素、メッシュの頂点、コンポーネントの追加や削除はできません。override が変えるのは値だけで、何かを消したり、メソッドを呼んだり、コードを読み込んだりはしません。

private なフィールド

ゲームのスクリプトは、速さや強さ、しきい値といった設定のほとんどを private なフィールドに持っていて、Inspector では Show private で見られます。これを変えたいときは、行に "private": true を足してください。そうすると Mods 画面に、その Mod がゲームのスクリプトの private な値を変える、と出ます。

いつ値が当たり、いつ戻るか

  • 値を書き込むのは、シーンが読み込まれた 1 フレーム後と、その 1 秒後です。2 回目は、シーンのスクリプトが最初の数フレームで作るものに当てるためです。
  • それとは別に 0.5 秒ごとに新しい一番上のオブジェクトを探して、パスがそれで始まる行を当てます。各レベルのドラゴンが作られるのはレベルが始まるとき、つまりシーンの読み込みよりずっとあとなので、DragonRyanA (Clone)/... の行は、そのドラゴンが出てくるたびに当たります。
  • 1 つのオブジェクトには 1 回だけ書き込みます。そのオブジェクトの新しいコピーには、また書き込みます。
  • 最初に書き込む前に、ゲームの値を覚えておきます。overrides reload はファイルを読み直す前に全部の値を元に戻しますし、オフにした Mod は次の起動から当たりません。
  • 対象のオブジェクトがなくてもエラーにはならず、シーンの中で何も見つからなかった行がログに出るだけです。ゲームのアップデートでオブジェクトの名前が変わっても、効かなくなるのはその 1 行だけで、ゲームは止まりません。書き込めない行(そのメンバーがない、値の型が違うなど)は、ログに Warning で出ます。
  • ゲームのスクリプトが同じ値をまた設定し直すこともあります(たとえばドラゴンの音量や、Animator が毎フレーム動かす骨)。Overrides はそれと取り合いはしないので、そういう値は override には向きません。

2 つの Mod が同じ値を変えるとき

あとから読み込まれた Mod が勝ちます。読み込むのはフォルダー名の順です。ログには両方の名前が出るので、「なんで自分の編集が効かないんだろう」と迷うことはありません。

Console

Tool window が入っていれば、Console で次のコマンドが使えます。

コマンド 内容
overrides overrides の Mod ごとに、ここまでに書き込んだ値の数と、ファイルの問題
overrides reload ゲームの値に戻し、ファイルを読み直して当て直す。ゲームを動かしたままファイルを直すときに

C# からは GameOverrides.Mods(同じ報告)と GameOverrides.Reload()、それに [BepInDependency] 用の GameOverrides.Guid が使えます。

Inspector から書き出す

Overrides ライブラリが入っていれば、Inspector の History の画面に Export as overrides が出ます。

  1. Inspector で値を変えます(Developer tools をオンにして F1)。
  2. History を開いて Export as overrides を押します。
  3. Name(フォルダー名。空なら「My changes」)、Author、Description を入れて Export を押します。
  4. Console で overrides reload と打つか、ゲームを再起動すると、Mod として動きます。

書き出されるのは BepInEx/plugins/<Name>/mod.json と overrides/main.json で、変えた場所ごとに 1 行、いまの値で書きます。ゲームの値に戻してある編集は入りません。同じ Mod にもう一度書き出すと、新しいファイル(inspector-<日付>-<時刻>.json)が増えて、mod.json はそのまま残ります。リストの要素、メッシュの頂点、Animator のパラメーターとクリップの差し替え、GameObject の行、マテリアルのシェーダーと描画順(render queue)は override にできないので、外したうえで理由をログに出します。

人に渡すときは、そのフォルダーをそのまま送れば大丈夫です。

コンテンツポリシー

override のファイルに入るのは、人が手で変えた値と、オブジェクトを見つけるのに要る名前(パス、コンポーネント名、メンバー名)だけです。なのでコンテンツポリシーに合っています。ポリシーでは、手で作ったものや変えたものは OK、ゲームのデータをそのまま写したものは NG です。書き出しも History が変更として残したものだけで、オブジェクトの値をまるごと書き出すことはしません。

Clone this wiki locally