最終更新: kenken2020 2023年12月07日(木) 15:44:18履歴
目次
参考:開発環境のセットアップ:https://docs.bepinex.dev/articles/dev_guide/plugin...
.NET SDK (バージョン 6 以降) をインストールする(2022/12現在)
.NET SDK をインストールしたら、コマンド ライン プロンプトを開いて実行し、動作することを確認します。
BepInEx のインストールと構成 構成ファイルと追加のライブラリを生成するために、少なくとも 1 回は BepInEx でゲームを実行します。
デバッグを容易にするために、BepInEx コンソールを有効にすると便利です。
BepInEx/configフォルダに移動して を開きBepInEx.cfgます。
次の構成セクション/値を見つけて、次のように編集します。
テンプレートをインストールするには、次のコマンドを実行します。
Github:https://github.com/BepInEx/BepInEx.Templates/blob/...
インストールが成功すると、すべての .NET プロジェクト テンプレートのリストが表示されます。その中には、次の BepInEx テンプレートがあります。
.NET SDK (バージョン 6 以降) をインストールする(2022/12現在)
.NET SDK をインストールしたら、コマンド ライン プロンプトを開いて実行し、動作することを確認します。
dotnet --list-sdks
BepInEx のインストールと構成 構成ファイルと追加のライブラリを生成するために、少なくとも 1 回は BepInEx でゲームを実行します。
デバッグを容易にするために、BepInEx コンソールを有効にすると便利です。
BepInEx/configフォルダに移動して を開きBepInEx.cfgます。
次の構成セクション/値を見つけて、次のように編集します。
[Logging.Console] ## Enables showing a console for log output. # Setting type: Boolean # Default value: false Enabled = true
テンプレートをインストールするには、次のコマンドを実行します。
dotnet new -i BepInEx.Templates --nuget-source https://nuget.bepinex.dev/v3/index.json
Github:https://github.com/BepInEx/BepInEx.Templates/blob/...
インストールが成功すると、すべての .NET プロジェクト テンプレートのリストが表示されます。その中には、次の BepInEx テンプレートがあります。
Templates Short Name Language Tags -------------------------------------------- -------------------- ---------- -------------------------------------- BepInEx 5 Plugin Template bepinex5plugin [C#] BepInEx/BepInEx 5/Plugin BepInEx 6 .NET Launcher Plugin Template bep6plugin_netfx [C#] BepInEx/BepInEx 6/Plugin/.NET Launcher BepInEx 6 Il2Cpp Plugin Template bep6plugin_il2cpp [C#] BepInEx/BepInEx 6/Plugin/Il2Cpp BepInEx 6 Unity Mono Plugin Template bep6plugin_unitymono [C#] BepInEx/BepInEx 6/Plugin/Unity Mono
参考:新しいプラグイン プロジェクトの作成:https://docs.bepinex.dev/articles/dev_guide/plugin...
<ゲーム名>_Data/Managed フォルダに netstandard.dll がある場合、TFM は netstandard2.0 です。
ゲームの mscorlib.dll ファイルのバージョン(ファイルを右クリック -> プロパティ -> 詳細)が 4.0.0.0 以降であれば、TFM は net46 となります。
それ以外の場合、または上記の方法で確認できない場合、TFMはnet35です。
コイカツ(ノーマル)は.NEt2?
コイカツサンシャイン
<ゲーム名>_Data/Managed フォルダに netstandard.dll がある場合、TFM は netstandard2.0 です。
ゲームの mscorlib.dll ファイルのバージョン(ファイルを右クリック -> プロパティ -> 詳細)が 4.0.0.0 以降であれば、TFM は net46 となります。
それ以外の場合、または上記の方法で確認できない場合、TFMはnet35です。
コイカツ(ノーマル)は.NEt2?
コイカツサンシャイン
- 4.6?
- netstandard2.0 ?
- Unity 2019.4.9(LTS) →
LTS行けるか?
コマンドラインプロンプトでフォルダを作成する場所にカレントディレクトリを行い、次のように実行します。
コイカツサンシャインの場合
すると、MyFirstPlugin という名前の新しいフォルダが作成され、3つのファイルが含まれます。
dotnet new bepinex5plugin -n <MyFirstPlugin・プラグインの名前> -T <TFM> -U <Unity>
- <TFM>は、手順1で決定したTFMです。
- <Unity> は手順2で決定したUnityのバージョンです。
コイカツサンシャインの場合
dotnet new bepinex5plugin -n KKSPluginTest01 -T netstandard2.0 -U 2019.4.9
すると、MyFirstPlugin という名前の新しいフォルダが作成され、3つのファイルが含まれます。
- Plugin.cs。Plugin.cs:メインのプラグインファイル。必要に応じて、さらにC#ソースファイル(.cs)を追加することができます。
- MyFirstPlugin.csproj。プラグインプロジェクトの設定
- NuGet.Config。NuGetパッケージマネージャの設定ファイル
公式ドキュメントを参考にmBepInExの初期設定とプラグイン テンプレートのインストールを済ませる
公式ドキュメント:開発環境のセットアップ:https://docs.bepinex.dev/articles/dev_guide/plugin...
************************************************
************************************************
以下のコマンドでデバッグ用のDLLのプロジェクトを作成する
************************************************
・作成されたフォルダの中にある拡張子が「***.csproj」のファイルが開く
・VisualStudioが開かれるので、ソリューションを名前をつけて保存する
公式ドキュメント:開発環境のセットアップ:https://docs.bepinex.dev/articles/dev_guide/plugin...
************************************************
************************************************
以下のコマンドでデバッグ用のDLLのプロジェクトを作成する
cd c:\unity\ dotnet new bepinex5plugin -n これから作るプラグインの名前 -T netstandard2.0 -U 2019.4.9************************************************
************************************************
・作成されたフォルダの中にある拡張子が「***.csproj」のファイルが開く
・VisualStudioが開かれるので、ソリューションを名前をつけて保存する
参考:【Visual Studio】ビルド後に成果物を特定のフォルダにコピーする方法:https://baba-s.hatenablog.com/entry/2020/05/06/002...
参考:Visual Studioのマクロ($(SolutionDir)とか$(Configuration)とか)に関するメモ:https://minus9d.hatenablog.com/entry/2014/02/16/23...
プロジェクトのビルドイベントを以下のように設定する(汎用例)
************************************************
************************************************
・コイカツの場合
コイカツサンシャインのインストールフォルダ→BepInExフォルダ→scriptsフォルダの中に「KKS_DEBUG .DLL」という名前のDLLを出力する場合
************************************************
参考:Visual Studioのマクロ($(SolutionDir)とか$(Configuration)とか)に関するメモ:https://minus9d.hatenablog.com/entry/2014/02/16/23...
プロジェクトのビルドイベントを以下のように設定する(汎用例)
set OUTPUT_DIRECTORY="【コピー先のフォルダのパス】" if not exist %OUTPUT_DIRECTORY% mkdir %OUTPUT_DIRECTORY% copy "$(TargetDir)【プラグインのDLL名】.dll" %OUTPUT_DIRECTORY%
************************************************
************************************************
・コイカツの場合
コイカツサンシャインのインストールフォルダ→BepInExフォルダ→scriptsフォルダの中に「KKS_DEBUG .DLL」という名前のDLLを出力する場合
set OUTPUT_DIRECTORY="C:\illusion\KoikatsuSunshine\BepInEx\scripts" if not exist %OUTPUT_DIRECTORY% mkdir %OUTPUT_DIRECTORY% copy "$(TargetDir)プラグインのプロジェクトのフォルダ名.dll" %OUTPUT_DIRECTORY%************************************************
************************************************
- GitHub:https://github.com/BepInEx/BepInEx.Debug
- 「ScriptEngine.dll」をプラグインフォルダに入れているか?
- スクリプトは最初から読み込まれない?F6で手動読み込みが必要?
UnityEngine.Debug.Log("現在のシーン::" + GetLoadSceneName());
タイトル画面→Title
フリーH設定画面→FreeH
Hシーン→H
VRのHシーン→VRHScene
タイトル画面→Title
フリーH設定画面→FreeH
Hシーン→H
VRのHシーン→VRHScene
becomeTrap(ふたなりMOD)を例にKKAPIとプラグインの作り方に関するチュートリアル
代表的な使用例と解説:https://github.com/IllusionMods/IllusionModdingAPI...
代表的な使用例と解説:https://github.com/IllusionMods/IllusionModdingAPI...
using HarmonyLib; namespace KKS_FreeH_Add_ShortcutKey { public partial class FreeH_Add_ShortcutKey { private static class Hooks { [HarmonyPrefix] [HarmonyPatch(typeof(HSprite), nameof(HSprite.MainSpriteChange))] public static bool MainSpriteChangePrefix(HSprite __instance, HSceneProc.AnimationListInfo _info) { UnityEngine.Debug.Log("モーション変更が行われた"); return false; } } } }
[HarmonyPostfix, HarmonyPatch(typeof(HSceneProc), "Start")] internal static void HScene_PostStart(MonoBehaviour __instance) { hSceneProc = __instance; hSceneProcTraverse = Traverse.Create(__instance); hSceneStarted = true; inHScene = false; }
[HarmonyPostfix, HarmonyPatch(typeof(HSceneProc), "Update")] internal static void HScene_PostUpdate() { }
Hシーンのなるべく最後の方に読み込まれるメソッドにフックする
※KKとKKSではちょっと違う?
KKSの場合
※KKとKKSではちょっと違う?
KKSの場合
//これは、読み込みフェーズでできるだけ遅く読み込まれるメソッドにフックする必要があります //メソッド "MapChangeObject" をフックする理由: "H シーンの読み込みの最後に何かが発生し、フックするのに十分な場所" [HarmonyPostfix] [HarmonyPatch(typeof(HSceneProc), "MapChangeObject")] public static void HSceneLoadPostfix(ref HSceneProc __instance) { }
例)タイトルロゴのスキップ
//タイトルスキップ //「HarmonyPrefix」→メソッド前に実行する //クラスシーン「LogoScene」のメソッド「Start」で実行する [HarmonyPrefix] [HarmonyPatch(typeof(LogoScene), "Start")] //コルーチンの返り値をリフレクションで参照し書き換えている? private static bool DisableLogo(ref IEnumerator __result) { //コルーチン「LoadTitle」を作成 IEnumerator LoadTitle() { KKS_DEBUG.Log.LogInfo("コルーチン:作成:LoadTitle"); //ゲーム本体:ロード予約 Scene.LoadReserve(new Scene.Data { levelName = "Title", isFade = false, fadeType = FadeCanvas.Fade.None }, false); //ゲーム本体:ロード予約? //Scene.LoadReserve(Scene.Data シーンデータ, bool isLoadingImageDraw ロードイメージを描画するか?); //シーンデータの定義? //new Scene.Data //{ // levelName = シーンの名前, // isFade = フェードの設定, // fadeType = フェードの種類 //} //コルーチンを終了 yield break; } //コルーチンを元のメソッドの返り値に上書き? __result = LoadTitle(); //「return false 」で元のメソッドを実行しない? return false; }
コメントをかく