- Mixin は、Minecraft のコンパイルされたクラスをロード時にパッチする Java ライブラリです。
- モッドは、コードを注入する場所を記述しますが、ファイルの見た目は記述しません。そのため、パッチはゲームのアップデートに耐えます。
- Fabric は Mixin を基盤としており、クラスのロード時に各モッドの Mixin を適用します。
- Mixin をご自身でインストールすることはありません。ローダーがそれをバンドルしています.
Mixinは、ゲームのロード中にModがMinecraftのコンパイルされたクラスを編集することなくパッチを適用できるようにするJavaライブラリです。Modは「このゲームメソッドのこのポイントにこのコードを追加する」という小さなクラスを記述し、Mixinはそれらを実行時にバイトコードに織り込みます。Fabricは、そのコアとなるModdingメカニズムとしてMixinを利用しています.
どこ Opal 合う
Mixin の仕組み
Mixin は、クラスがコンパイルされた後、JVM が実行する前に編集します。ある Mod は、実際のゲームクラスを対象とする Mixin クラスを同梱します。そのクラスに付与されたアノテーションは、注入されるコードが配置される場所を示します。メソッドの開始、終了、特定のメソッド呼び出し、または返り値です。Minecraft が対象クラスをロードすると、Mixin はそのバイトコードを書き換え、Mod のコードを挿入します。
これは重要です。なぜなら、Minecraft は拡張を前提として設計されていないからです。ゲームのほとんどの動作には、公式のプラグインポイントがありません。Mixin は、コンパイルされたゲーム自体を拡張面として扱うことで、Mod が侵入するための手段を提供します。
なぜ Mod はゲームを直接編集する代わりにこれを使用するのか
理由は 2 つです。互換性とアップデートです。
ゲームのソースコードを直接編集すると、完全に修正されたコピーを同梱することになり、誰もその上で構築できず、ゲームのアップデートと同時に機能しなくなります。Mixin のパッチは小さく、外科的であるため、多くの Mod がフルフォークを同梱することなく、同じゲームをパッチ化できます。
また、パッチはファイルの内容ではなく、注入場所を記述するため、あるバージョンのゲームに対して書かれた Mixin は、対象メソッドが依然として存在している限り、ゲームのアップデート後でも適用されることがよくあります。
Fabric との関連性
Fabric は Mixin を基盤として構築されています。ローダーは各 Mod の Mixin 設定を読み込み、次に Mixin にリストされた Mixin クラスを渡して、クラスロード中に適用されます。典型的な Fabric Mod は、主に独自のクラスと、変更が必要なゲームメソッドのほんの数か所をフックする少数の Mixin で構成されます。
共通の注入ポイント
| アノテーション | 動作 |
|---|---|
@Inject | ターゲットメソッド内の選択された箇所でコードを実行 |
@Redirect | ターゲット内の特定のメソッド呼び出しを置き換え |
@ModifyArg | ターゲット内の呼び出しに渡される引数を変更 |
@ModifyVariable | メソッド内でローカル変数を書き換え |
@Overwrite | メソッド全体を置き換え (最終手段; 壊れやすい) |
@Inject は、最も侵襲性が低く、ゲームアップデートに最も耐えられる可能性が高いため、デフォルトのツールです。@Overwrite は、同じメソッドに触れている他の Mod と競合するため避けるべきです。
FAQ
いいえ。MixinはMODが構築されるためのライブラリです。それ自体をインストールする必要はありません。Fabricのようなローダーが、あなたのMODが提供するMixinをバンドルして適用します。
いいえ。パッチはクラスがロードされる際にメモリ上で適用されます。ディスク上のファイルは変更されません。そのため、Modをクリーンに削除することで、その変更も削除されます。
両方のMODが互換性のない方法で同じメソッドをパッチする場合、特に@Overwriteを使用している場合、互いを打ち消したり、壊したりすることがあります。 適切に記述されたMixinは、互いに干渉しないように狭い注入ポイントを使用します。
いいえ。Mixinは汎用的なJavaバイトコードフレームワークですが、MinecraftのMOD作成で最も多く使用されており、Fabricに採用されたことで、そちらでは標準的なものとなりました。