はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】NuGet importer for Unityを使って簡単にNuGetパッケージをUnityに導入する(NuGetForUnityの後継者になりうるか)

はじめに

今回はNuGet importer for UnityというNuGetのパッケージをUnityへ導入できるようにするエディタ拡張を紹介したいと思います。

github.com


一応UnityでNuGetといえばNuGetForUnityが有名だと思いますが、バージョンの指定がうまくできなかったりエラーが解消できなかったりと(私としては)上手くいかないことが多く、最近はあまり利用していませんでした。
github.com

対してNuGet importer for UnityNuGetForUnityに影響を受け一から作成した後発のパッケージで、ドキュメントの説明にもかなり自信を感じます。

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でも動作しますが、仕様上の問題より推奨しません。

English | NuGet importer for Unity documentation

動作確認環境

macOS Monterey
Unity2021.3.0f1
NuGet Importer v2.2.1

導入方法

NuGet importer for Unityの作者は日本人の方らしく、日本語ドキュメントもあります。
使い方 | NuGet importer for Unity documentation

正直こちらを見ていただいた方が正確ですが、私の方でもPackage Managermanifest.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と打ち込みます。

Add package from git URL...

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",
manifest.jsonに追加で記述する

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の中にあるものを利用します。

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

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以下に入るのも好感触ですね。

Packagesの中に格納される

Repair packages

github.com

package.configをみて、インストールされていないパッケージをインストールする?

Delete cache

github.com

カタログと検索結果(と多分アイコン)のキャッシュを削除します。

NuGet importer settings

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以下はキャッシュしない。)

Check update

github.com

NuGet Importerの最新バージョンを調べてくれます。

Check update

Go to project page

github.com

以下のサイトに飛びます。
https://github.com/kumaS-nu/NuGet-importer-for-Unity

補足

お試しでSharpOpenJTalkというOpenJTalkという音声合成ライブラリのC#ラッパーをインストールしてみました。
(ネイティブプラグインあり,プラットフォーム依存のライブラリありと割とインポート難易度の高そう)
GitHub - yamachu/SharpOpenJTalk

するとインストール途中でエラーが出てくるみたいです。
一応ちゃんと途中でエラーが出てきたら、インストールする前に戻してくれます。

エラー

もしかしたらプラットフォーム依存のネイティブプラグインあたりが対応できていなかったりするのでしょうか。(一応ネイティブプラグインに対応していると記載ある)
【Unity】SharpOpenJTalk.Langを用いてテキストから音素ラベルを抽出してみる - はなちるのマイノート


ざっと流し読みではありますが、NuGetNativeImportSetting.csというネイティブプラグインに対応したクラスがありました。
github.com

ここが悪さしているんかなとOnPreprocessAssetメソッドの中をコメントアウトしてみたりもしましたが違うようですね。

というかエラーのログ出力がないので、どこかで握りつぶしてEditorUtility.DisplayDialogで表示しているのだと思います。


というわけで内部実装をぱっと調べてみた感じ、PackageManager.csOperatePackage.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 

github.com

// managedPath = プロジェクトのルート/Packages/SharpOpenJTalk/lib
Directory.GetDirectories(managedPath)

確かに確認してみると中身は空っぽですね。

NuGet Galleryで調べてみるとnetstandard1.3しか入ってないので、それが原因っぽいです。

SharpOpenJTalk

よくよく調べてみると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_8STANDARD2_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;
    }
}

原因わかちゃったZE☆