土屋つかさの技術ブログは今か無しか

土屋つかさが主にプログラミングについて語るブログです。

#unity Unity6+VisualStudio2022でNuGetパッケージをインストールする入門

 この記事はUnityアドベントカレンダー8日目の記事です。

qiita.com

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をダウンロードします。

github.com

 執筆時点では"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それぞれについて、ネット上で多くの記事が上がっています。今回の記事の執筆でも参考にさせていただきました。ステップアップとして以下の記事を紹介します。

qiita.com

www.nowsprinting.com

zenn.dev

宣伝「Unityシェーダープログラミングの教科書シリーズ」

 土屋は同人誌「Unityシェーダープログラミングの教科書」シリーズを書いています。現在以下の5冊が出ています。

 これらの同人誌は、現在BOOTHの下記ストアにてPDF版を有料頒布しています。

s-games.booth.pm

 Unityのシェーダープログラミング関連について、世界で最も詳細な本だと自負しています。リンク先にサンプルページがあるので、是非御覧になってください。

*1:これがNuGetの機能なのかVisualStudioの機能なのかは知らない

*2:ちなみに、2個目以降に並んでいる"Sprache.XXXX"は、オリジナルのSpracheをフォークした物や追加機能などです。

*3:多分。未確認。

*4:指摘頂き修正しました(コメント欄も参照)。ありがとうございます。

*5:Package Managerからもインストール出来るらしいけど今回は置く

*6:面倒で調べてない

*7:核酸システムの分析と設計の為のソフトウェア。Nuはnucleic acidの頭文字と思われる