はじめに
今回は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
のインストールを試したみたところちゃんとできました。
また手動でやると設定がめんどくさいプラットフォーム依存のライブラリも設定されているようです。
