本記事はUnity Advent Calendar 2023 シリーズ2 21日目の記事です。
UnityでNuGet Galleryに公開されている.NET向けパッケージ(以下NuGetパッケージ)を使う場合、nuget
コマンドでは管理できないためパッケージ(依存パッケージもすべて)を自分でダウンロードしてDLLを取り出し、Unityプロジェクト下に配置する必要があります。
その手間を省くためのソリューションとして代表的なものに、Unity NuGetとNuGetForUnityがあります。
Unity NuGetのほうが取り扱いは楽な反面、利用できるパッケージに制限があるなど、目的によってはNuGetForUnityのほうが便利なケースもあります。 双方の違いも含めて紹介します。
Unity NuGet
Unity NuGetは、Unityで利用可能なNuGetパッケージをUPMパッケージとしてラップした状態で提供してくれる、UPMパッケージレジストリです。
レジストリは公開しているものをそのまま利用することも、自分の環境やDockerコンテナ上に立ち上げることもできます(コードはオープンソース)。
Unity 2019.1以降で利用できます。
公開レジストリの利用方法
Package Managerウィンドウを使用する場合
Unityエディター上のPackage Managerウィンドウを使用する場合、次の手順でNuGetパッケージをインストールできます。
- UnityエディターのメニューからEdit > Project SettingsでProject Settingsウィンドウを開き、Package Managerタブを選択
- Scoped Registriesの下にある+ボタンをクリックし、Name・URL・Scope(s)を入力してSave
- Window > Package ManagerでPackage Managerウィンドウを開き、左上にあるレジストリ選択ドロップダウンでMy Registriesを選択
- 目的のNuGetパッケージを探して、Installボタンをクリック
Scoped Registriesの設定内容は次のとおりです。
- Name:
Unity NuGet
(任意) - URL:
https://unitynuget-registry.azurewebsites.net
- Scope(s):
org.nuget
(Package Manager上の表示を絞り込みたければ細かく指定)
これで、NuGetパッケージの依存関係解決も行われ、必要なDLLがPackages下にUPMパッケージとしてインストールされます。
なお、Unity 2022.2未満の場合、次の操作でAssembly Version Validationを無効化する必要があります(2022.2以降はデフォルトが無効)。
- Project Settings > Player > Other Settings > Configurationを開き、Assembly Version Validationチェックボックスをoff
openupmコマンドを使用する場合
openupmコマンドでも次のようにレジストリを指定してインストールできます。
openupm add --registry https://unitynuget-registry.azurewebsites.net パッケージのID
こちらもAssembly Version Validationの設定は必要です。
利用できるパッケージ
Unity NuGetで利用できるパッケージは登録制です。 registry.json ファイルに書かれているパッケージのみ利用できます。
.NET Standard 2.0と2.1のDLLが含まれるパッケージの場合、DLLのmetaファイルにConstraintsを設定してくれるので気にすることなく利用できるはずです。
Roslynアナライザも利用できますが、アナライザをビルドしたときのMicrosoft.CodeAnalysis.CSharpのバージョンに依存するため、インストールするバージョンを指定する必要がある場合もあります。 詳しくは次の記事を参照してください。
パッケージの追加方法
利用したいパッケージがregistry.jsonにない場合、追加するPull Requestを送ります。 ただし追加できるパッケージは.NETStandard2.0をサポートしている必要があります。 また依存パッケージがある場合は依存関係すべてを追加する必要があります。
なお、Unityエディター上でしか動作しないパッケージにはdefineConstraints: ["UNITY_EDITOR"]
を、Roslynアナライザの場合は"analyzer": true
を追加することを忘れないでください。
次のコマンドでテストを実行すると、依存関係も含めたバリデーションが行われます。
dotnet test src -c Release
ローカル環境でレジストリを起動する
Pull Requestを送る前に、手元でレジストリを起動して確認することもできます。 次のコマンドで起動できます。
cd examples/docker docker-compose up
ポート5000でアクセスできます。つまりレジストリURLはhttp://localhost:5000
です。
またパッケージIDのprefixがorg.nuget
でなく、デフォルトではorg.custom
になります(docker-compose.ymlで変更できます)。
NuGetForUnity
NuGetForUnityは、Unityプロジェクトにインストールして使用するオープンソースのエディター拡張です。 Unityエディター上で直接NuGet GalleryにあるNuGetパッケージをインストールできます。
一時期メンテナンスが止まっていましたが、2023年のはじめごろ再開されました。
NuGetForUnityのインストールと設定
まずNuGetForUnity自体をUPMパッケージとしてインストールします。
Package Managerウィンドウを使用する場合
Scoped Registriesにhttps://package.openupm.com
を追加してopenupmからインストールできます。
細かい手順は割愛します。
openupmコマンドを使用する場合
次のコマンドでインストールできます。
openupm add com.github-glitchenzo.nugetforunity
バージョン管理システムのトラッキング除外設定
NuGetForUnityは、ダウロードして展開したNuGetパッケージの中身を/Assets/Packages/下に置きます。 リポジトリにDLLを入れたくない場合、これを.gitignoreなどでバージョン管理システムのトラッキングから除外しておきます。
ただし、プロジェクトにインストールしているNuGetパッケージの情報は/Assets/packages.configに保存されます。
ケースインセンシティブなOSで/Assets/Packages*
と書いてしまうとこちらも除外されますので注意してください。
推奨する.gitignoreの記述は次の記事を参考にしてください。
NuGetパッケージのインストール
UnityエディターのメニューからNuGet > Manage NuGet PackagesでNuGet For Unityウィンドウが開きます。 インストールしたいパッケージを検索してInstallで依存関係含めインストールされます。
NuGetForUnityも、Roslynアナライザーに対応しています*1。 Unityプロジェクトで動作する条件についてはUnity NuGetと同様です。
パッケージのリストア
/Assets/Packages/下をバージョン管理していない場合でも、Unityエディターを起動したときに自動的にリストアしてくれます。 ただし、リストア前の時点でコンパイルエラーがあると実行されません。
継続的インテグレーション(CI)などではUnity起動前にリストアをCLIで実行するNuGetForUnity.Cliが利用できます。 dotnetサブコマンドとしてインストールして実行できます*2。
まとめ
メジャーなパッケージを簡単に使うならUnity NuGetがおすすめです。
Unity NuGetで提供されていないもの、DLLの設定を変えたい、また自作のパッケージをテストするといった用途であれば、NuGetForUnityをおすすめします。
宣伝
年末のコミックマーケット103(C103)にサークル「いか小屋」で出ます。 2日目(日曜日)東U44b、東2の真ん中あたりです。
新刊は『GitHub CopilotとのペアプロTDDでつくるローグライクRPG』。 人間がテストコードを書き、GitHub Copilotがプロダクトコード生成という分担でのペアプログラミング✕テスト駆動開発(TDD)でローグライクRPGをつくろう!という本です。
C103新刊『GitHub CopilotとのペアプロTDDでつくるローグライクRPG』
— Koji Hasegawa@C103日曜 東U44b (@nowsprinting) 2023年12月18日
まだ執筆中ですが間に合いそう
表紙は、きみかさん(@kimika127)によるユニティちゃんです! pic.twitter.com/0qggvIZGOM
既刊の在庫も持っていきます。