この記事はUnityアドベントカレンダー8日目の記事です。
NuGetの使い方を学ぼう
Visual Studioで開発している方は誰でもお世話になっているであろうNuGetなんですが、UnityでNuGetパッケージを使用する場合、通常とは異なる導入手順が必要です。
話が前後しますが、土屋は最近「Sprache」と言うC#実装のパーサコンビネータをUnityで使えないか検証していました。
SpracheはNuGetパッケージとして提供されているので、まず非Unity環境で動かして挙動を確認し、問題なければUnity環境に持って来ようとしました。
この時、Unity環境ではNuGetパッケージの導入手順がVisualStudio環境とは異なるという事を知らなかったため、作業中にプチハマリしてしまったのでした……。
土屋と同じ苦しみを他の人が繰り返さなくていいように、このハマリポイントを記事にしておきたいと思います。
そもそもNuGetとはどういう物なのか、なぜUnityでは手順が違うのかなどについても軽く説明するので、UnityユーザーのNuGet導入ガイドになればと思います。
なお、今回の記事はUnity6+Visual Studio2022環境を想定しています。
NuGetとは
※このパートは以前書いた記事のリライトです。
NuGet(「ニューゲット」と読むのが一般的らしい)は、マイクロソフトが開発・運用しているパッケージマネージャーと呼ばれるwebサービスです。クラウドで.NETライブラリのデータベースを管理し、VS経由で任意のパッケージを、他ライブラリとの依存関係を自動的に対応しながらインストールできます。 今回のSpracheのように、ユーザーもデータベースにパッケージを登録できます。
ライブラリは依存性の管理というのが大変でして、例えばAというライブラリがBCDというライブラリを内部で参照している場合、ABCDを全部インストールする必要があります、もちろんBCDも他のライブラリに依存している場合があります。
また、AはBのVer1.0には対応していますが、BのVer1.2は互換性が確認出来ていない場合とかが起こりえます。その為、適切なバージョンの依存ライブラリをインストールする必要があります。NuGetを使えば、このような依存性を自動的に対応してくれるわけです*1。
このように、NuGetは、様々な.NETライブラリを統一的なインストール方法、かつ、ライブラリ間のバージョン依存性も自動的に解決し、必要なライブラリをインストールしてくれるのです。。
Visual Studio 2022でNuGetパッケージをインストールする
ではさっそくNuGet経由でライブラリをインストールしてみましょう。先にUnityではなく、Visual StudioでNuGetパッケージをインストールする手順を説明します。ここでは先程も名前を挙げた「Sprache」を例にします。
Visual Studio 2022のプロジェクトを開いている状態で、「ツール>NuGetパッケージマネージャー>ソリューションのNuGetパッケージの管理」を選択します。
ウィンドウが開いたら「参照」タブを選択し、検索ボックスに「Sprache」と入力します。すると、下のペインにNuGetデータベースに登録されているパッケージの候補が表示されます*2。
一番上の「Sprache」を選択し、右ペインの「インストール」を選択します。
ポップアップウィンドウが2個表示されるので「適用」「同意する」をそれぞれ選択するとインストールが完了します。
タブの「インストール済み」を選択すると、Spracheがインストールされている事がわかります。
UnityプロジェクトでNuGetパッケージを利用する
ここからようやくUnityの話になります。
先程無事にNuGetパッケージをインストールできましたが、Unityプロジェクトで使用する場合にはこの手順は使えません。と言うのも、Unityではビルドに含めるアセンブリをUnity側で管理する必要があるためです。
何故かと言いますと、通常の方法でVisualStudio側でNuGetパッケージをインストールすると、その参照情報はcsprojファイルに書き込まれるのですが*3、Unityはビルド時にcsprojファイルを更新する事があり、それにより、管理外のアセンブリ(ここではNuGetパッケージの事)への参照情報が削除されてしまうのです。
そのため、UnityプロジェクトでNuGetパッケージを使用する場合、そのNuGetパッケージをUnity側で管理しなければいけません。
Unity標準ではNuGetの管理機能が用意されておらず、外部ツールでUnityの機能を拡張する必要があります。
NuGetを管理する為のツールは、以下の2種が提供されています。どちらを使う場合も、Unityプロジェクト毎にツールを追加する必要があります。
- NuGetForUnity:エディタ拡張
- Unity NuGet:Unityパッケージ
「Unity NuGet」は、NuGetパッケージをPackage Manager経由で導入・管理できるようになる優れものです。ただし、OpenUPMというレジストリUnityNuGetの人が公開している unitynuget-registry.azurewebsites.net*4 に登録されているパッケージしかインストールできないという制約があります(ざっくりとした説明)。「Unity NuGet」自身もPackage Managerからインストールします。
「NuGetForUnity」は上記の制約はありませんが、エディタ拡張の形式で提供されているツールで、.unitypackageファイルをダウンロードしてインポートする手間があります*5。また、インストールしたNuGetパッケージは(Package Managerではなく)NuGetForUnity内で管理されます。
SpracheがOpenUPMに登録されているか分からなかったので*6、今回はNuGetForUnityを使います。
NuGetForUnityのインストール
GitHubのNuGetForUnityのリリースページから、unitypackageをダウンロードします。
執筆時点では"NuGetForUnity.4.1.1.unitypackage"が最新のパッケージでした。
Unityプロジェクトを開いた状態でunitypackageファイルを実行するとインポートが始まります。
NuGetパッケージをインポート
NuGetForUnityのインポートが完了すると、メニューに"NuGet"が追加されます。
※Unityの再起動が必要な場合があります。(というか再起動必須かも?)
"Manage NuGet Packages"を選択するとNuGet For Unityのウィンドウが表示されます。
検索ボックスに"sprache"と入力しSerchボタンを検索すると、先程と同じ様な検索結果が表示されます。
一番上のチェックボックスをチェックして"Install"を選択すると、NuGetパッケージがインストールされます。以降は、このパッケージをスクリプトから参照出来ます。
おわりに
UnityでNuGetパッケージを導入する最小手順を解説しました。正直これまでNuGetについて苦手意識があったですが、全体像を理解することで、今後は怖がらずに使えそうです。
おまけ:"NuGet"について&名称の由来
※こちらは以前の記事のリライトになります。
NuGetが何故"NuGet"と名付けられたのか以前から疑問で、しかし調べる程には興味がなかったんですが、良い機会なので調べてみました。公式な記録が無いので以下は検索した結果からの推測です。
"NuGet"は、元々は"NuPack"と言う名称で開発されていました。この名前は"新しい(Nu=New)パッケージ(Package)マネージャー"という意味だったと思われます。
しかし、既に"NUPACK"というソフトウェア*7が存在したため、名前の混同を避ける為に"NuGet"に改名したそうです。ツールの機能を踏まえた上で、"●●Pack"から"●●Get"へ変更するは、まあ自然に思えます。
ちなみに、"Nougat(ヌガー)"というお菓子を「ヌーゲット」と読む駄洒落みたいのがあり、それと"NuGet"をかけているのではないかとも言われているようです。
参考リンク
NuGetForUnity/Unity NuGetそれぞれについて、ネット上で多くの記事が上がっています。今回の記事の執筆でも参考にさせていただきました。ステップアップとして以下の記事を紹介します。
宣伝「Unityシェーダープログラミングの教科書シリーズ」
土屋は同人誌「Unityシェーダープログラミングの教科書」シリーズを書いています。現在以下の5冊が出ています。
- Unityシェーダープログラミングの教科書 ShaderLab言語解説編
- Unityシェーダープログラミングの教科書2【反射モデル&テクスチャマップ編】
- Unityシェーダープログラミングの教科書3 ライティング&GI(大域照明)解説編
- Unityシェーダープログラミングの教科書4 SRP[1]UniversalRP/Litシェーダー解説編
- Unityシェーダープログラミングの教科書5 SRP[2]UniversalRP URP拡張カメラ/HDR/ポストプロセス編
これらの同人誌は、現在BOOTHの下記ストアにてPDF版を有料頒布しています。
Unityのシェーダープログラミング関連について、世界で最も詳細な本だと自負しています。リンク先にサンプルページがあるので、是非御覧になってください。