若き研究者の日常

技術寄りの事かポエムを書く。

Unityで手動でC#用のパッケージ更新/ダウングレードを行う(例:ベータ版のパッケージをインストールしたい時やダウングレードしたい時)

Unityで手動でパッケージ更新を行う方法について書きます. この動画を参考にしてます.

www.youtube.com

基本はUnityでC#スクリプト用のPackageを管理するときはNuGetForUnityを使えばいいのですが,こいつ,Stable版の最新バージョンしかDLしたりupdateしてくれません(2023年2月現在).beta版にしかない機能を使いたいのに...という時に手動でパッケージ更新する方法を記します.

NuGetforUnityで対象のパッケージのバージョンを確認.updateタブの欄を見てもベータ版の情報は出てこない(自動的にStableなバージョンの最新版しか管理しないっぽい)

まずはNuGet Galleryを訪ねます.

NuGetのWebページ

希望のアプデ先パッケージをDLします.

左のバージョンクリックでバージョン切り替え,右のDownload Packageでパッケージダウンロード

次に,DLしたファイルに着目.
.nupkg拡張子をzip拡張子に変えます.

.nupkg(上)を.zip(下)のようにに変える

zipファイルを展開します.するとまあ不思議,dllとxmlが入っているではありませんか(当たり前)

zipファイルを展開すると,lib/netstandard2.0の中にdllとxmlが入っている.WebからパッケージをDLした場合余計なファイルもあるけど,まああっても動くのでOK(?)

よって,このディレクトリをPackage以下に配置すればOK.

パッケージ直下に置く(metaファイルはUnityエディタをそのあといじってると勝手に生成される)

確認してみる.

うん,5.3.0-beta.1にアップデートされている

その後,おそらく依存関係のエラーが発生してるので,それをよしなに解決していく.

<2024.03.13追記> パッケージの衝突の解決法について.

Assembly 'Assets/Packages/Azure.Core.1.38.0/lib/netstandard2.0/Azure.Core.dll' will not be loaded due to errors:
Reference has errors 'System.Text.Json'.

とか,

Assembly 'Assets/Packages/System.Text.Json.8.0.2/lib/net462/System.Text.Json.dll' will not be loaded due to errors:
Unable to resolve reference 'System.Runtime.CompilerServices.Unsafe'. Is the assembly missing or incompatible with the current platform?
Reference validation can be disabled in the Plugin Inspector.

とかの依存関係のエラーが出た時.例えば以下のような画像のエラーが出たとき.

他のパッケージとの競合が起こった場合はNuGetForUnityのパッケージをアプデしたりして解決する

例えば図で言うとTextAnalyticsとの依存関係で問題が起こっている.Azure.AI.TextAnalyticsのパッケージをNuGetで見ると...

下の方にDependenciesが書かれている.あんまりこの辺りNuGetは自動で依存関係を解決してくれはせず,脳死で各パッケージの最新版をアップデート/インストールしてしまうっぽい.というか,2019年とかむっちゃ古いまま更新がされてないパッケージがあるのが原因.おいおい(例えばSystem.Runtimeとかはオリンピック並みの更新頻度).

よって,さっきの図でNuGetのDependenciesを自分で見ながら,NuGet Galleryから適切なバージョンのパッケージを自分でインストールする必要がある.やり方は上に書いてあるような,.nupkgを落としてきて,.zipに変える→解凍,それをAssets/Packagesとか適切なところに配置する.