やらなイカ?

たぶん、iOS/Androidアプリの開発・テスト関係。

Unity NuGetとNuGetForUnity

本記事は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コンテナ上に立ち上げることもできます(コードはオープンソース)。

github.com

Unity 2019.1以降で利用できます。

公開レジストリの利用方法

Package Managerウィンドウを使用する場合

Unityエディター上のPackage Managerウィンドウを使用する場合、次の手順でNuGetパッケージをインストールできます。

  1. UnityエディターのメニューからEdit > Project SettingsでProject Settingsウィンドウを開き、Package Managerタブを選択
  2. Scoped Registriesの下にある+ボタンをクリックし、NameURLScope(s)を入力してSave
  3. Window > Package ManagerでPackage Managerウィンドウを開き、左上にあるレジストリ選択ドロップダウンでMy Registriesを選択
  4. 目的の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以降はデフォルトが無効)。

  1. 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のバージョンに依存するため、インストールするバージョンを指定する必要がある場合もあります。 詳しくは次の記事を参照してください。

www.nowsprinting.com

パッケージの追加方法

利用したいパッケージが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年のはじめごろ再開されました。

github.com

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の記述は次の記事を参考にしてください。

www.nowsprinting.com

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

www.nuget.org

まとめ

メジャーなパッケージを簡単に使うならUnity NuGetがおすすめです。

Unity NuGetで提供されていないもの、DLLの設定を変えたい、また自作のパッケージをテストするといった用途であれば、NuGetForUnityをおすすめします。

宣伝

年末のコミックマーケット103(C103)にサークル「いか小屋」で出ます。 2日目(日曜日)東U44b、東2の真ん中あたりです。

新刊は『GitHub CopilotとのペアプロTDDでつくるローグライクRPG』。 人間がテストコードを書き、GitHub Copilotがプロダクトコード生成という分担でのペアプログラミングテスト駆動開発(TDD)でローグライクRPGをつくろう!という本です。

既刊の在庫も持っていきます。

www.nowsprinting.com

www.nowsprinting.com

*1:私がやりました

*2:最近追加されたものでまだちゃんと検証していないのですが紹介だけしておきます