はじめに
今回はNuGet importer for UnityというNuGetのパッケージをUnityへ導入できるようにするエディタ拡張を紹介したいと思います。
一応UnityでNuGetといえばNuGetForUnityが有名だと思いますが、バージョンの指定がうまくできなかったりエラーが解消できなかったりと(私としては)上手くいかないことが多く、最近はあまり利用していませんでした。
github.com
対してNuGet importer for UnityはNuGetForUnityに影響を受け一から作成した後発のパッケージで、ドキュメントの説明にもかなり自信を感じます。
NuGet importer for Unity は高速で使いやすく、非常に強力に NuGet のパッケージを Unity へ導入できるようにするエディタ拡張です。 また、ネイティブプラグインに対しても完全に対応しております。 (GlitchEnzo/NuGetForUnity に影響を受けましたが一から作ってます。)
NuGet-importer-for-Unity/README_jp.md at main · kumaS-nu/NuGet-importer-for-Unity · GitHub
今回は導入の仕方から、利用方法を書きたいと思います。
動作環境
Unity2020以降であれば動きます。Unity2019でも動作しますが、仕様上の問題より推奨しません。
動作確認環境
macOS Monterey
Unity2021.3.0f1
NuGet Importer v2.2.1
導入方法
NuGet importer for Unityの作者は日本人の方らしく、日本語ドキュメントもあります。
使い方 | NuGet importer for Unity documentation
正直こちらを見ていただいた方が正確ですが、私の方でもPackage Managerとmanifest.jsonでのやり方を記載しておきます。
またOpen UPMにも対応しているそうで、慣れている方はそちらでも良いかもしれません。
【Unity】OpenUPMを利用してアセットをインストールする方法 - はなちるのマイノート
Package Managerを使った方法
メニューバーのWindow/PackageManagerよりPackageManagerを開き、Add package from git URL...を選択、https://github.com/kumaS-nu/NuGet-importer-for-Unity.git?path=NuGetImporterForUnity/Packages/NuGet Importerと打ち込みます。

manifest.jsonを使った方法
作成したUnityプロジェクトのPackages/manifest.jsonの中に以下を追加します。
"org.kumas.nuget-importer": "https://github.com/kumaS-nu/NuGet-importer-for-Unity.git?path=NuGetImporterForUnity/Packages/NuGet Importer",

Gitを利用する場合
ドキュメントに記載されていますが、Git管理する場合は.gitignoreに以下を追記します。
# NuGet importer /[Aa]ssets/[Pp]ackages.meta /[Aa]ssets/[Pp]ackages/ /[Nn]u[Gg]et/ /[Pp]ackages/*/ !/[Pp]ackages/your embedded package to share with git/
Unityでの利用方法
NuGet Importerを利用するにはメニューバーのNuGet Importerの中にあるものを利用します。

| 名前 | 意味 |
|---|---|
| Manage packages | パッケージを管理するメインウィンドウを表示する。 |
| Repair packages | インストールされていないパッケージを修復する。 |
| Delete cache | キャッシュを削除する。(ただし、アセンブリがロードされるたびにキャッシュは消える。) |
| NuGet importer settings | NuGet importer に関する設定をするウィンドウを表示する。 |
| Check update | 更新があるか確認する。 |
| Go to project page | NuGet importer for Unity の Web ページを開く。 |
使い方 | NuGet importer for Unity documentation
一つずつ紹介していきます。
Manage packages

NuGet Importer Windowではパッケージのインストール・アンインストール・バージョン変更・修復を行うことができます。
NuGet-importer-for-Unity/NuGetImporterWindow.cs at main · kumaS-nu/NuGet-importer-for-Unity · GitHub
使い方の詳細は以下を参照
使い方 | NuGet importer for Unity documentation
お試しでK4os.Compression.LZ4.StreamsというLZ4での圧縮・展開をしてくれるパッケージを検索し、Installを押してみます。
【Unity, C#】K4os.Compression.LZ4を使ってLZ4の圧縮・展開をしてみる - はなちるのマイノート
こちらは依存先のパッケージ含めてちゃんとインストールすることができました。

またインストールしたパッケージがAssets以下ではなく、Packages以下に入るのも好感触ですね。

NuGet importer settings

| 名前 | 意味 |
|---|---|
| install method | インストール先を指定する。(UPMを推奨。) |
| Method to select a version | 依存関係のバージョン決定方法を指定する。(Suitを推奨。) |
| Auto package placement check | 起動時にパッケージがインストールされているか確認するか。パッケージのディレクトリが存在すればインストール済みと判断。インストールされていないパッケージを見つけた場合、自動的に修復する。(オンを推奨。) |
| search cache count | 検索結果のキャッシュする最大数。(0以下はキャッシュしない。) |
| catalog cache count | カタログのキャッシュする最大数。(0以下はキャッシュしない。) |
| icon cache count | アイコンのキャッシュする最大数。(0以下はキャッシュしない。) |
補足(追記にて解決済, 2022/9/14)
お試しでSharpOpenJTalkというOpenJTalkという音声合成ライブラリのC#ラッパーをインストールしてみました。
(ネイティブプラグインあり,プラットフォーム依存のライブラリありと割とインポート難易度の高そう)
GitHub - yamachu/SharpOpenJTalk
するとインストール途中でエラーが出てくるみたいです。
一応ちゃんと途中でエラーが出てきたら、インストールする前に戻してくれます。

もしかしたらプラットフォーム依存のネイティブプラグインあたりが対応できていなかったりするのでしょうか。(一応ネイティブプラグインに対応していると記載ある)
【Unity】SharpOpenJTalk.Langを用いてテキストから音素ラベルを抽出してみる - はなちるのマイノート
ざっと流し読みではありますが、NuGetNativeImportSetting.csというネイティブプラグインに対応したクラスがありました。
github.com
ここが悪さしているんかなとOnPreprocessAssetメソッドの中をコメントアウトしてみたりもしましたが違うようですね。
というかエラーのログ出力がないので、どこかで握りつぶしてEditorUtility.DisplayDialogで表示しているのだと思います。
というわけで内部実装をぱっと調べてみた感じ、PackageManager.csのOperatePackage.Operateでエラーが起きているようですね。
github.com
Index was outside the bounds of the array. kumaS.NuGetImporter.Editor.PackageControllerBase.ExtractPackageAsync (kumaS.NuGetImporter.Editor.DataClasses.Package package) [0x00587] in /Users/hanachiru/UnityProjects/NuGet Importer for Unity/Library/PackageCache/org.kumas.nuget-importer@e3206ead6f/Editor/PackageControllerBase.cs:307 at kumaS.NuGetImporter.Editor.PackageControllerAsUPM.InstallPackageAsync (kumaS.NuGetImporter.Editor.DataClasses.Package package, System.Collections.Generic.IEnumerable`1[T] loadedAsmName) [0x00086] in /Users/hanachiru/UnityProjects/NuGet Importer for Unity/Library/PackageCache/org.kumas.nuget-importer@e3206ead6f/Editor/PackageControllerAsUPM.cs:32 at kumaS.NuGetImporter.Editor.PackageManager.InstallSelectPackages (System.Collections.Generic.IEnumerable`1[T] packages, System.Collections.Generic.IEnumerable`1[T] loadAssembliesFullName) [0x00074] in /Users/hanachiru/UnityProjects/NuGet Importer for Unity/Library/PackageCache/org.kumas.nuget-importer@e3206ead6f/Editor/PackageManager.cs:1283 at kumaS.NuGetImporter.Editor.PackageManager+OperatePackage.Operate () [0x00677] in /Users/hanachiru/UnityProjects/NuGet Importer for Unity/Library/PackageCache/org.kumas.nuget-importer@e3206ead6f/Editor/PackageManager.cs:898
// managedPath = プロジェクトのルート/Packages/SharpOpenJTalk/lib
Directory.GetDirectories(managedPath)
確かに確認してみると中身は空っぽですね。
NuGet Galleryで調べてみるとnetstandard1.3しか入ってないので、それが原因っぽいです。

よくよく調べてみるとFrameworkName.csというのがあって、対応しているフレームワークが記述されています。
github.com
// 対応しているフレームワーク net48 = { ".NETFramework4.8", "net48" }, net472 = { ".NETFramework4.7.2", "net472" }, net471 = { ".NETFramework4.7.1", "net471" }, net47 = { ".NETFramework4.7", "net47" }, net462 = { ".NETFramework4.6.2", "net462" }, net461 = { ".NETFramework4.6.1", "net461" }, net46 = { ".NETFramework4.6", "net46" }, net452 = { ".NETFramework4.5.2", "net452" }, net451 = { ".NETFramework4.5.1", "net451" }, net45 = { ".NETFramework4.5", "net45" }, net403 = { ".NETFramework4.0.3", "net403" }, net40 = { ".NETFramework4.0", "net40" }, standard21 = { ".NETStandard2.1", "netstandard2.1" }, standard20 = { ".NETStandard2.0", "netstandard2.0" }
ちなみにUNITY_2021_2_1_OR_NEWERかどうかで、NET4_8とSTANDARD2_1が追加されるみたいです。
Unity 2021.2.0b6より.net standard2.1に対応したのは割と有名ですが、.net4.8もそうみたい?
Unity Future .NET Development Status - Unity Forum
/// <summary> /// <para>List of framework names to target</para> /// <para>対象とするフレームワーク名のリスト</para> /// </summary> /// <exception cref="System.NotSupportedException"> /// <para>Thrown when the environment is not .Net4.x equivalent.</para> /// <para>.Net4.x equivalent以外の環境のときスローされる。</para> /// </exception> public static List<string> TARGET { get { var ret = new List<string>(); switch (PlayerSettings.GetApiCompatibilityLevel(EditorUserBuildSettings.selectedBuildTargetGroup)) { case ApiCompatibilityLevel.NET_4_6: ret = NET4_6; ret.AddRange(STANDARD2_0); break; case ApiCompatibilityLevel.NET_Standard_2_0: ret = STANDARD2_0; ret.AddRange(NET4_6); break; #if UNITY_2021_2_1_OR_NEWER case ApiCompatibilityLevel.NET_Unity_4_8: ret = NET4_8; ret.AddRange(STANDARD2_1); break; case ApiCompatibilityLevel.NET_Standard: ret = STANDARD2_1; ret.AddRange(NET4_8); break; #endif default: throw new NotSupportedException("Now this is only suppoort .Net4.x equivalent"); } return ret; } }
追記(2022/09/14)
作者さんにコメントいただき、v3.0.0から.Net Standard 1.xにも対応したとのことです。

SharpOpenJTalkのインストールを試したみたところちゃんとできました。
また手動でやると設定がめんどくさいプラットフォーム依存のライブラリも設定されているようです。

