=====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;
}
}
}
}