-
-
Notifications
You must be signed in to change notification settings - Fork 2
Overrides ja
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 にあります。
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 をオフにすると、値はゲームの元のものに戻ります。
BepInEx/plugins/<Mod>/
mod.json 名前、作者、説明、バージョン
overrides/*.json 変える値
ライブラリは BepInEx/plugins の中から、mod.json と overrides フォルダーの両方があるフォルダーを探して、overrides/ にある *.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.<フォルダー名>
|
{
"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 なフィールドに持っていて、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 には向きません。
あとから読み込まれた Mod が勝ちます。読み込むのはフォルダー名の順です。ログには両方の名前が出るので、「なんで自分の編集が効かないんだろう」と迷うことはありません。
Tool window が入っていれば、Console で次のコマンドが使えます。
| コマンド | 内容 |
|---|---|
overrides |
overrides の Mod ごとに、ここまでに書き込んだ値の数と、ファイルの問題 |
overrides reload |
ゲームの値に戻し、ファイルを読み直して当て直す。ゲームを動かしたままファイルを直すときに |
C# からは GameOverrides.Mods(同じ報告)と GameOverrides.Reload()、それに [BepInDependency] 用の GameOverrides.Guid が使えます。
Overrides ライブラリが入っていれば、Inspector の History の画面に Export as overrides が出ます。
- Inspector で値を変えます(Developer tools をオンにして F1)。
- History を開いて Export as overrides を押します。
- Name(フォルダー名。空なら「My changes」)、Author、Description を入れて Export を押します。
- 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 が変更として残したものだけで、オブジェクトの値をまるごと書き出すことはしません。
Players
Mod authors
- Getting started
- Playing well with others (the guide)
- Going online
- Installer
- Mod reload
- Overrides (no code)
- Graphs (no code, makes things happen)
Tools (F1, developer tools)
- Inspector
- Console
- Code graph
- Bridge (AI clients, MCP)
API
日本語
- ホーム
- プレイヤー向け · ランチャー · FAQ · クラッシュレポート
- はじめての Mod · ほかの Mod と一緒に動かす · 外と通信する Mod · インストーラー · Mod の再読み込み · Overrides · Graphs
- Inspector · Console · コードのグラフ · Bridge
- 中核 API · 操作の登録簿 · Text · Dialogue · Tool window · Assets · Flags and saves · GameEvents · SettingMeta
Links
- Repository
- Releases
- Changelog
- Design records: DESIGN · ROADMAP · CONTENT_POLICY