■Unity開発メモ用のWiki◎現在扱っていること・Unity全般・MMDからUnityへの変換してインポート・MMDの仕様把握・BlenderでMMDモデルのカスタム

目次


0.導入(初めてプラグインを作るときの環境構築)

BepInExの初期設定とプラグイン テンプレートのインストール

参考:開発環境のセットアップ:https://docs.bepinex.dev/articles/dev_guide/plugin...
.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

.NETフレームワークのバージョンを調べる方法

参考:新しいプラグイン プロジェクトの作成: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?
コイカツサンシャイン
  • 4.6?
  • netstandard2.0 ?
  • Unity 2019.4.9(LTS) →LTS行けるか?
コイカツサンシャインでDLLを作った方が良いかも

新しいプラグイン プロジェクトの作成

コマンドラインプロンプトでフォルダを作成する場所にカレントディレクトリを行い、次のように実行します。
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パッケージマネージャの設定ファイル

1.デバッグ用のDLLの作成(環境構築が済んでいる場合)


プロジェクトの作成(コマンドラインでテンプレートを簡単に作る)

公式ドキュメントを参考にmBepInExの初期設定とプラグイン テンプレートのインストールを済ませる
公式ドキュメント:開発環境のセットアップ: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が開かれるので、ソリューションを名前をつけて保存する


プロジェクトのビルドイベントを設定(DLLの出力先を直接BepinEXフォルダに指定する)

参考:【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...
プロジェクトのビルドイベントを以下のように設定する(汎用例)
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で手動読み込みが必要?
BepInExのscriptsにDLLを置くことで、F6キーでDLLをリロードできる

依存関係にあるDLLの参照設定

・コマンドラインからテンプレートを作成した場合「NuGet」によって必要なDLLの参照は自動で行ってくれる?
・KKAPIはよく使うので参照追加しておく
・フォントを操作するなら「TextMeshProUGUI」も追加
・ButtonなどのUIを操作する場合「UnityEngine.UI.dll」を追加する
・ゲーム本体の「Assembly-CSharp.dll」と「Assembly-CSharp-firstpass.dll」を追加する


2.プラグイン作成のテンプレート(仮)

・VisualStudioのフォルダ名、ソリューション名、一番最初に読み込みCSファイル名は一緒にする?

1.初期処理関連のテンプレート

  • サンプル

2.HOOK用のテンプレート

・ハーモニー用のフックの「Hooks.cs」を作成する

サンプル

KKAPIで現在のシーンを取得する

UnityEngine.Debug.Log("現在のシーン::" + GetLoadSceneName());
タイトル画面→Title
フリーH設定画面→FreeH
Hシーン→H
VRのHシーン→VRHScene


よく使うフックメモ

参考資料

becomeTrap(ふたなりMOD)を例にKKAPIとプラグインの作り方に関するチュートリアル
代表的な使用例と解説: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;
			}
		}
    }
}

HSceneProc(キャラ情報とかの取得)にフックする場合


        [HarmonyPostfix, HarmonyPatch(typeof(HSceneProc), "Start")]
        internal static void HScene_PostStart(MonoBehaviour __instance)
        {
            hSceneProc = __instance;
            hSceneProcTraverse = Traverse.Create(__instance);

            hSceneStarted = true;
            inHScene = false;
        }

「Update(キャラの操作関連?)」メソッドにフックする場合?

        [HarmonyPostfix, HarmonyPatch(typeof(HSceneProc), "Update")]
        internal static void HScene_PostUpdate()
        {
        }

各シーンへのフック

フリーH準備画面の場合

        [HarmonyPrefix]
        [HarmonyPatch(typeof(FreeHScene), "NormalSetup")]


Hシーンの最初にフックする場合

Hシーンのなるべく最後の方に読み込まれるメソッドにフックする
※KKとKKSではちょっと違う?

KKSの場合
        //これは、読み込みフェーズでできるだけ遅く読み込まれるメソッドにフックする必要があります
        //メソッド "MapChangeObject" をフックする理由: "H シーンの読み込みの最後に何かが発生し、フックするのに十分な場所" 
        [HarmonyPostfix]
        [HarmonyPatch(typeof(HSceneProc), "MapChangeObject")]
        public static void HSceneLoadPostfix(ref HSceneProc __instance)
        {
        }

タイトルロゴシーンにフックする場合(VRは結構違うのでこれは使えない)

例)タイトルロゴのスキップ
        //タイトルスキップ
        //「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;
        }

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu

【メニュー編集】

スカイリム関連

スカイリム関連


Menu

【メニュー編集】

スクリプト関連

フリーエリア

管理人/副管理人のみ編集できます