Unity ist eine Plattform, die es schon lange gibt und die sich ständig weiterentwickelt. Wenn Sie jedoch mit mehreren Projekten gleichzeitig arbeiten, können Sie immer noch Schwierigkeiten haben, gemeinsame Quellen (.cs), Bibliotheken (.dll) und andere Assets (Bilder, Sounds, Modelle, Fertighäuser) zu verwenden. In diesem Artikel werden wir über unsere Erfahrungen mit einer nativen Lösung für ein solches Problem für Unity sprechen.
Methoden zur Verteilung gemeinsamer Ressourcen
Es gibt mehr als eine Möglichkeit, gemeinsam genutzte Ressourcen für verschiedene Projekte zu verwenden, aber jeder Ansatz hat seine Vor- und Nachteile.
1. Vervielfältigung - "Hände" duplizieren Ressourcen zwischen Projekten.Vorteile:
- Geeignet für alle Arten von Ressourcen.
- Keine Abhängigkeitsprobleme.
- Kein Problem mit Asset-GUIDs.
Nachteile:
- Gigantische Repositories.
- Keine Versionierung möglich.
- Die Schwierigkeit, Änderungen an gemeinsam genutzten Ressourcen zu verfolgen.
- Schwierigkeiten beim Aktualisieren freigegebener Ressourcen.
2. Git-Submodule - Verteilung gemeinsam genutzter Ressourcen über externe Submodule.Vorteile:
- Sie können mit Quellcodes arbeiten.
- Vermögenswerte können verteilt werden.
- Keine Abhängigkeitsprobleme.
Nachteile:
- Git-Kenntnisse erforderlich.
- Git ist nicht sehr freundlich mit Binärdateien - Sie müssen LFS verbinden.
- Zugriffskontrolle für Repositorys.
- Schwierigkeiten beim Up- und Downgrade.
- Kollisionen von GUIDs sind möglich und es gibt kein eindeutiges Verhalten von Unity, um sie zu lösen.
3. NuGet - Verteilung von gemeinsam genutzten Bibliotheken über NuGet-Pakete.Vorteile:
- Bequeme Arbeit mit Projekten, die nicht von Unity abhängig sind.
- Bequeme Versionierung und Auflösung von Abhängigkeiten.
Nachteile:
- Unity kann nicht sofort mit NuGet-Paketen arbeiten (auf GitHub finden Sie NuGet Package Manager für Unity, mit dem dies behoben wird, aber es gibt einige Nuancen).
- Schwierigkeiten bei der Verteilung anderer Arten von Vermögenswerten.
4. Unity Package Manager - Verteilung gemeinsam genutzter Ressourcen über eine native Lösung für Unity.Vorteile:
- Native Schnittstelle für die Arbeit mit Paketen.
- Schutz vor dem Überschreiben von .meta-Dateien in Paketen bei GUID-Konflikten.
- Möglichkeit der Versionierung.
- Die Fähigkeit, alle Arten von Ressourcen für Unity zu verteilen.
Nachteile:
- GUID-Konflikte können weiterhin auftreten.
- Es ist keine Dokumentation zu implementieren.
Das letztere Verfahren hat mehr Vor- als Nachteile. Aufgrund der fehlenden Dokumentation ist es derzeit jedoch nicht sehr beliebt, weshalb wir uns ausführlich damit befassen werden.
Unity Package Manager
Unity Package Manager (im Folgenden: UPM) ist ein Paketverwaltungstool. Es wurde in Unity 2018.1 hinzugefügt und nur für Pakete verwendet, die von Unity Technologies entwickelt wurden. Ab Version 2018.3 konnten jedoch benutzerdefinierte Pakete hinzugefügt werden.
Unity Package Manager-SchnittstellePakete fallen nicht in die Projektquellen (Assets-Verzeichnis). Sie befinden sich in einem separaten Verzeichnis
%projectFolder%/Library/PackageCache
und wirken sich in keiner Weise auf das Projekt aus. Ihre einzige Erwähnung in den Quellen erfolgt in der Datei
packages/manifest.json
.
Pakete im ProjektdateisystemPaketquellen
UPM kann mehrere Paketquellen verwenden:
1. Das Dateisystem.Vorteile:
- Geschwindigkeit der Implementierung.
- Keine Tools von Drittanbietern erforderlich.
Nachteile:
- Die Komplexität der Versionierung.
- Die Dateifreigabe ist für alle erforderlich, die mit dem Projekt arbeiten.
2. Git-Repository.Vorteile:
- Es wird nur ein Git-Repository benötigt.
Nachteile:
- Sie können nicht über das UPM-Fenster zwischen Versionen wechseln.
- Es funktioniert nicht mit allen Git-Repositorys.
3. npm Repository.Vorteile:
- Unterstützt die UPM-Funktionalität vollständig und wird zum Verteilen offizieller Unity-Pakete verwendet.
Nachteile:
- Derzeit werden alle Zeichenfolgenversionen von Paketen mit Ausnahme von "-preview" ignoriert.
Nachfolgend sehen wir uns die Implementierung von UPM + npm an. Dieses Bundle ist praktisch, da Sie mit jeder Art von Ressourcen arbeiten und Paketversionen verwalten können und außerdem die native UPM-Schnittstelle vollständig unterstützen.
Sie können
Verdaccio als npm-Repository verwenden. Es gibt eine detaillierte
Dokumentation dafür, und es sind nur ein paar Befehle erforderlich, um es zu starten.
Umgebungseinstellung
Zuerst müssen Sie
node.js installieren
.Paketerstellung
Um ein Paket zu erstellen, müssen Sie die Datei
package.json
, die es beschreibt, in dem Verzeichnis mit dem Inhalt dieses Pakets
package.json
. Sie müssen Folgendes tun:
- Gehen Sie zu dem Projektverzeichnis, in dem wir ein Paket erstellen möchten.
- Führen Sie den Befehl
npm init
und geben Sie im Dialogfeld die erforderlichen Werte ein. com.plarium.somepackage
Sie als Namen den Namen im Format der Reverse-Domain an, z. B. com.plarium.somepackage
. - Um den Paketnamen bequem anzuzeigen, fügen Sie die Eigenschaft
package.json
zu package.json
und package.json
sie aus. - Da npm js-orientiert ist, enthält die Datei Eigenschaften, die wir nicht benötigen, und
scripts
, die Unity nicht verwendet. Es ist besser, sie zu entfernen, um die Paketbeschreibung nicht zu überladen. Die Datei sollte ungefähr so aussehen:
{ "name": "com.plarium.somepackage", "displayName": "Some Package", "version": "1.0.0", "description": "Some Package Description", "keywords": [ "Unity", "UPM" ], "author": "AUTHOR", "license": "UNLICENSED" }
- Öffnen Sie Unity und generieren Sie eine .meta-Datei für package.json (Unity sieht keine Assets ohne .meta-Dateien, Pakete für Unity werden nur zum Lesen geöffnet).
Paketversand
Um ein Paket zu senden, müssen Sie den folgenden Befehl ausführen:
npm publish --registry * *
.
Installieren und Aktualisieren von Paketen über Unity Package Manager
Um einem Unity-Projekt ein Paket hinzuzufügen, benötigen Sie:
- Fügen Sie der Datei
manifest.json
Paketquelleninformationen hinzu. scopedRegistries
Eigenschaft scopedRegistries
und geben Sie die Bereiche und die Quelladresse an, nach denen nach bestimmten Bereichen gesucht werden soll.
"scopedRegistries": [ { "name": "Main", "url": " ", "scopes": [ "com.plarium" ] } ]
- Gehen Sie zu Unity und öffnen Sie das Paketmanager-Fenster (die Arbeit mit benutzerdefinierten Paketen unterscheidet sich nicht von der Arbeit mit integrierten Paketen).
- Wählen Sie Alle Pakete.
- Suchen Sie das gewünschte Paket und fügen Sie es hinzu.
Arbeiten Sie mit Quellen und debuggen Sie
Damit die Quellen eine Verbindung zum Projekt herstellen können, müssen Sie eine
Assembly-Definition für das Paket erstellen.
Die Verwendung von Paketen schränkt die Debugging-Funktionen nicht ein. Wenn Sie jedoch mit Paketen in Unity arbeiten, können Sie nicht zur IDE wechseln, indem Sie auf einen Fehler in der Konsole klicken, wenn der Fehler im Paket aufgetreten ist. Dies liegt an der Tatsache, dass Unity Skripte nicht als separate Dateien ansieht, da sie bei Verwendung der Assembly-Definition in einer Bibliothek gesammelt und mit dem Projekt verbunden werden. Wenn Sie mit Quellcodes aus einem Projekt arbeiten, können Sie per Klick zur IDE wechseln.
Das Skript im Projekt mit dem verbundenen Paket:
Skript aus dem Paket mit einem funktionierenden Haltepunkt:
Dringende Patch-Korrekturen
Dem Projekt hinzugefügte Unity-Pakete sind schreibgeschützt, können jedoch im Paket-Cache bearbeitet werden. Dazu müssen Sie:
- Wechseln Sie zu dem Paket im Paket-Cache.
- Nehmen Sie die erforderlichen Änderungen vor.
- Aktualisieren Sie die Version in der Datei
package.json
. - Senden
npm publish --registry * *
. - Aktualisieren Sie die Paketversion über die UPM-Schnittstelle auf die korrigierte.
Paketimportkonflikte
Beim Importieren von Paketen können die folgenden GUID-Konflikte auftreten:
- Paket - Paket. Wenn beim Importieren eines Pakets festgestellt wird, dass bereits hinzugefügte Pakete Assets mit derselben GUID enthalten, werden Assets mit übereinstimmenden GUIDs aus dem importierten Paket nicht zum Projekt hinzugefügt.
- Ein Paket ist ein Projekt. Wenn sich beim Importieren eines Pakets herausstellt, dass das Projekt Assets mit übereinstimmenden GUIDs enthält, werden die Assets aus dem Paket nicht zum Projekt hinzugefügt. Von ihnen abhängige Assets werden jedoch Assets aus dem Projekt verwenden.
Übertragen von Assets aus einem Projekt in ein Paket
Wenn Sie Assets von einem Projekt in ein Paket mit geöffneter Unity übertragen, bleibt die Funktionalität erhalten, und Verknüpfungen in abhängigen Assets verwenden Assets aus dem Paket.
Wichtig : Wenn Sie ein Asset aus einem Projekt in ein Paket kopieren, tritt der Konflikt "Paket - Projekt" auf, wie im obigen Abschnitt beschrieben.
Mögliche Konfliktlösungen
- Neuzuweisung von GUIDs nach ihren eigenen Algorithmen beim Importieren aller Assets, um Kollisionen zu vermeiden.
- Hinzufügen aller Assets zu einem Projekt mit anschließender Aufteilung in Pakete.
- Erstellung einer Datenbank mit GUIDs aller Assets und Validierung beim Senden von Paketen.
Fazit
UPM ist eine neue Lösung für die Verteilung gemeinsam genutzter Ressourcen an Unity, die eine sinnvolle Alternative zu vorhandenen Methoden darstellen kann. Die im Artikel beschriebenen Empfehlungen ergaben sich aus realen Fällen. Wir hoffen, Sie finden sie nützlich.