Unity Package Manager

Einleitung

Seit 2017.2 arbeitet Unity daran, alle zusätzlichen Features mit dem hierfür neu entwickelten Unity Package Manager, oder kurz upm, auszuliefern. Nun gibt bereits den Asset Store, wo bisher fast alle Pakete zur Verfügung stehen. Also wofür wird der neue Package Manager benötigt?

Es gibt mehrere Gründe. Das größte Problem des Asset Stores ist meiner Meinung nach, dass Pakete in den Projekt-Ordner „installiert“ werden, indem sie einfach entpackt werden. Dadurch ist es sehr schwer Updates zu machen, da bei jeder Umbenennung oder Verschiebung von Dateien der gesamte Ordner erstmal manuell gelöscht werden muss, da die neuen Dateien nur nochmal entpackt werden.

Die Pakete im Asset Store sind eher selten in einer einheitlichen Struktur und so verteilen sich die Pakete wild im Projekt Ordner und man verliert schnell den Überblick, was zu welchem Paket gehört.

Ein weiterer Grund ist die Versionierung von Paketen. Zurzeit ist es nur möglich, eine ältere Version eines Paketes im Asset Store zu bekommen, wenn man diese beim Ersteller anfragt, oder wenn sie zusätzlich noch extern von anderen Quellen zu erhalten sind.

Zuletzt gibt es auch keine richtigen Abhängigkeiten im Asset Store. Pakete müssen entweder manuell in der richtigen Version hinzugefügt werden oder liegen im Paket mit dabei und verursachen so andere Probleme.

Kurz gesagt: der Asset Store hat sehr viele Probleme und es muss ein richtiger Package Manager her, der Nuget, NPM oder anderen ähnelt.

Aktueller Stand

Ab 2018.1 gibt es die erste Version, der Package Manager UI, dieser bildet die Grundfunktionen des UPMs ab. Verschiedene Unity-Features, wie Analytics, Ads, TextMeshPro und mehr, können bereits über diesen Weg installiert werden. Die Pakete werden in der neuen $UnityProject/Packages/manifest.json festgehalten. Unity verhält sich so, als wären die Pakete im Projekt vorhanden und man kann sie nutzen, ohne die Dateien im Projekt abzulegen mit Ausnahme von TextMeshPro, welches beim installieren verschiedene Shader und Fonts ins Projekt legt.

Mit 2018.2 geht das Ganze noch einen Schritt weiter. Neben Erweiterungen werden nun auch die eingebauten Engine Features als Pakete angegeben, welche dann auch in der manifest.json zu finden sind. Beispielsweise kann man die eingebaute JsonUtility von Unity deaktivieren, wenn man stattdessen Json.NET benutzt.

Ein weiteres neues Feature ist der neue Package Browser. Im Projekt-Fenster werden jetzt auch die eingebundenen Quelldateien separat unter Packages dargestellt. Für eigene lokale Pakete wird automatisch ein .csproj generiert, so dass man diese direkt aus Unity heraus editieren kann. Die eigenen Pakete bringen aber noch verschiedene Probleme mit sich, die ich später noch aufzähle.

Manifest.json

Die Pakete werden in der manifest.json mit Namen und Version als Key-Value Pairs hinterlegt. Vor 2018.2 wurde noch mit dem „exclude“ Keyword gearbeitet, um Standard-Pakete zu entfernen. Inzwischen werden aber einfach alle Pakete aufgelistet und gelten als exkludiert, wenn sie nicht vorhanden sind. Lokale Pakete können über einen relativen Pfad wie „file:../../Paket“ eingebunden werden. Beispielsweise schlägt Unity zurzeit vor, Pakete von der neuen ScriptableRenderPipeline über git submodules einzubinden, um die „nightly“ Version zu bekommen. Die verschiedenen Preview-Releases kann man bereits über den upm installieren.

Falls eine Komponente eines Pakets als Test-Assembly in der .asmdef markiert ist, dann wird diese nur im Projekt verfügbar sein, wenn man das Paket zusätzlich noch in die „testables“ aufnimmt. Dadurch werden auch alle Unit-Tests des Pakets mit im Test-Runner aufgelistet.

 

Paket Quellen

Neben den offiziellen und lokalen Paketen gibt es zu diesem Zeitpunkt noch keine Möglichkeit, eigene Pakete zu veröffentlichen. Wie bereits erwähnt, will Unity aber mit dem Unity Package Manager den Asset Store in Zukunft komplett ablösen. Bis die Prozesse jedoch sauber und stabil funktionieren, wird es nur die offiziellen Pakete geben.

Paket Informationen

Ein weiterer Teil des Unity Package Manager sind Online-Dokumentationen von Paketen. Zu vielen Paketen gibt es bereits Changelogs, Lizenzinformationen, auto-generierte Scripting APIs und kleine Anleitungen. Mir ist noch nicht klar, inwiefern dieses im Zusammenhang mit den bereits vorhandenen Anleitungen und Scripting References stehen. Vielleicht werden diese parallel laufen und einfach spezieller auf die Pakete eingehen oder vielleicht wird in Zukunft alles auf Paket bezogenen Dokumentation umgezogen. Dieser Teil ist auf jeden Fall noch sehr experimentell, da einige Pakete auf nicht vorhandene Dokus verlinken und es keine Möglichkeit gibt, alle Pakete nach Information zu durchsuchen, beziehungsweise es noch nicht mal eine Liste mit allen Paketen auch gibt.

Die Anleitung des Package Manager UI beschreibt auch noch detaillierter die vorgeschriebene Paket Struktur. Der wichtigste Teil ist wohl die package.json die, wie auch bei anderen Package Manager, die grundlegenden Informationen des Pakets wie Version, Beschreibung, Tags und vieles mehr enthält. Ohne diese wird das Paket auch nicht als solches erkannt. Hier fehlen aber auch noch verschiedene Informationen, wie die lokalen Pakete oder testables.

Probleme

Der Unity Package Manager ist noch nicht sehr stabil. Wenn man von Hand an der Manifest.json arbeitet, kommt es häufiger mal zu Fehlermeldungen und dann verschwindet das UI des Package Managers, wofür man dann Unity teilweise neustarten muss.

Mit dem Upgrade von 2018.1 auf 2018.2 funktionierte mit meinem lokalen Paket erstmal gar nichts mehr. Unity wollte keine richtige Solution- und Projekt-Dateien generieren. Dies sind die verschiedenen Fehlermeldungen:

Die Lösung war dann schlussendlich die 3.8.0.3 Preview-Version der Visual Studio Unity Tools zu installieren. Diese sind hier zu finden.

Quellen

https://github.com/genericdeAG/Unity-Packager-Manager-Demo

https://docs.unity3d.com/Packages/com.unity.package-manager-ui@1.9/manual/index.html

https://blogs.unity3d.com/2018/05/04/project-management-is-evolving-unity-package-manager-overview/

https://forum.unity.com/threads/local-package-outside-of-project-folder.540170/