=====BepInExプラグインにしたい場合===== **[注意]COM3D2.5のVersion3.41.0以降はこのやり方は通用しないみたいです。** 作り的にはSybarisプラグインとほぼ同じ、参照先、基底クラス、クラスに付けるべき属性を変えるぐらいでBepInExプラグインになる。\\ ネット上の資料がBepInExの方が多いのでBepInExプラグインの方が作りやすい。パッチはもうHarmonyが使えるの比較にならない。\\ ====参照先==== UnityInjectorだったものが、BepInExに変わる。\\ パッチを当てる場合はmono.cecilより0Harmonyを使う方が楽。\\ ====基底クラス==== UnityInjector.PluginBaseがBepInEx.BaseUnityPluginになる。\\ どちらもUnityEngine.MonoBehaviourを継承しているので、AwakeとかUpdateで実装するのは同じ。\\ ====属性==== UnityInjector.Attributes.PluginNameAttribute,UnityInjector.Attributes.PluginVersionAttributeだったものが、BepInEx.BepInPluginに変わる。\\ 名前とバージョン以外にGuidを設定する必要がある。\\ ====参考==== XmlSerializerを使ったときに出るあのうざいメッセージを表示しなくするプラグイン。\\ using BepInEx; using HarmonyLib; using System.Collections.Generic; using System.Reflection.Emit; using System.Xml.Serialization; namespace DisableXmlSerializerExceptionMessage { /// /// プラグイン本体 /// [BepInPlugin(PluginGuid, PluginName, PluginVersion)] public class Plugin : BaseUnityPlugin { /// /// プラグイン名 /// public const string PluginName = "Disable XmlSerializer Exception Message Plug-In"; /// /// プラグインGuid /// public const string PluginGuid = "jp.fumble.DisableXmlSerializerExceptionMessage"; /// /// プラグインカンパニー /// public const string CompanyName = "Fumble Warez"; /// /// プラグインコピーライト /// public const string Copyright = "Copyright © Fumble Warez 2025"; /// /// プラグインバージョン /// public const string PluginVersion = "1.0.1.0"; /// /// HarmonyLib(HarmonyX)のインスタンス /// /// /// Harmonyがあれば「もう何も恐くない」。 /// private static Harmony harmony; /// /// コンストラクタ /// static Plugin() { // パッチする if (Plugin.harmony == null) Plugin.harmony = new Harmony(PluginGuid); Plugin.harmony.PatchAll(typeof(Patch_XmlSerializer_RunSerializerGeneration)); } /// /// プラグイン起動 /// private void Awake() { // 何もしない、パッチしてしまえばアンロードされても「もう何も恐くない」。 } } /// /// XmlSerializer.RunSerializerGenerationパッチ /// [HarmonyPatch(typeof(XmlSerializer), "RunSerializerGeneration", typeof(System.Object))] public static class Patch_XmlSerializer_RunSerializerGeneration { /// /// とらんすぱいら /// /// 変更前のIL /// 変更後のIL [HarmonyTranspiler] static IEnumerable Transpiler(IEnumerable instructions) { // 見つかっただけ書き換える、なかったら何もしない。 // 想定は1箇所、まかり間違って2回目走ってもすべて書き換え済みなのでやはり「もう何も恐くない」。 // 書き換え元IL // call Void WriteLine(System.Object) // 書き換え先IL // pop foreach (var instruction in instructions) { if (instruction.opcode == OpCodes.Call && instruction.operand != null && instruction.operand.ToString() == "Void WriteLine(System.Object)") yield return new CodeInstruction(OpCodes.Pop); else yield return instruction; } } } }