Unity-Paketmanager

Unity ist eine Plattform, die es schon seit geraumer Zeit gibt und die sich ständig weiterentwickelt. Wenn Sie jedoch gleichzeitig mit mehreren Projekten darin arbeiten, kann es dennoch zu Schwierigkeiten bei der Verwendung gemeinsamer Quellen (.cs), Bibliotheken (.dll) und anderer Assets (Bilder, Sounds, Modelle, Fertigteile) kommen. In diesem Artikel werden wir über unsere Erfahrungen mit einer nativen Lösung für ein solches Problem für Unity sprechen.

Unity-Paketmanager

Methoden zur Verteilung gemeinsam genutzter Ressourcen

Es gibt mehr als eine Möglichkeit, gemeinsame Ressourcen für verschiedene Projekte zu nutzen, aber jeder Ansatz hat seine Vor- und Nachteile.

1. Duplizierung – wir duplizieren Ressourcen zwischen Projekten „von Hand“.

Profis:

  • Geeignet für alle Arten von Ressourcen.
  • Keine Abhängigkeitsprobleme.
  • Es gibt keine Probleme mit Asset-GUIDs.

Nachteile:

  • Riesige Repositories.
  • Eine Versionierung ist nicht möglich.
  • Schwierigkeiten beim Verfolgen von Änderungen an freigegebenen Ressourcen.
  • Schwierigkeiten beim Aktualisieren freigegebener Ressourcen.

2. Git-Submodule — Verteilung gemeinsam genutzter Ressourcen über externe Submodule.

Profis:

  • Sie können mit den Quellen arbeiten.
  • Sie können Vermögenswerte verteilen.
  • Keine Abhängigkeitsprobleme.

Nachteile:

  • Git-Erfahrung erforderlich.
  • Git ist nicht sehr freundlich zu Binärdateien – Sie müssen LFS verbinden.
  • Zugriffskontrolle für Repositorys.
  • Schwierigkeiten beim Upgraden und Downgrade von Versionen.
  • GUID-Kollisionen sind möglich und es gibt kein klares Verhalten seitens Unity, um diese zu beheben.

3. NuGet – Verteilung gemeinsam genutzter Bibliotheken über NuGet-Pakete.

Profis:

  • Bequemes Arbeiten mit Projekten, die nicht auf Unity angewiesen sind.
  • Bequeme Versionierung und Abhängigkeitsauflösung.

Nachteile:

  • Unity kann nicht sofort mit NuGet-Paketen funktionieren (auf GitHub finden Sie NuGet Package Manager für Unity, der dieses Problem behebt, 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.

Profis:

  • Native Schnittstelle zum Arbeiten mit Paketen.
  • Schutz vor dem Überschreiben von .meta-Dateien in Paketen aufgrund von GUID-Konflikten.
  • Möglichkeit der Versionierung.
  • Möglichkeit, alle Arten von Ressourcen für Unity zu verteilen.

Nachteile:

  • GUID-Konflikte können weiterhin auftreten.
  • Es gibt keine Dokumentation zur Implementierung.

Letztere Methode hat mehr Vorteile als Nachteile. Aufgrund der fehlenden Dokumentation erfreut es sich derzeit jedoch keiner großen Beliebtheit, weshalb wir näher darauf eingehen.

Unity-Paketmanager

Unity Package Manager (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 ist es jedoch möglich, benutzerdefinierte Pakete hinzuzufügen.

Unity-Paketmanager
Unity-Paketmanager-Schnittstelle

Die Pakete landen nicht in den Projektquellen (Assets-Verzeichnis). Sie befinden sich in einem separaten Verzeichnis %projectFolder%/Library/PackageCache und haben keinen Einfluss auf das Projekt, ihre einzige Erwähnung im Quellcode findet sich in der Datei packages/manifest.json.

Unity-Paketmanager
Pakete im Projektdateisystem

Paketquellen

UPM kann mehrere Paketquellen verwenden:

1. Dateisystem.

Profis:

  • Geschwindigkeit der Umsetzung.
  • Erfordert keine Tools von Drittanbietern.

Nachteile:

  • Schwierigkeiten bei der Versionierung.
  • Für alle, die mit dem Projekt arbeiten, ist ein gemeinsamer Zugriff auf das Dateisystem erforderlich.

2. Git-Repository.

Profis:

  • Sie benötigen lediglich ein Git-Repository.

Nachteile:

  • Sie können nicht über das UPM-Fenster zwischen Versionen wechseln.
  • Funktioniert nicht mit allen Git-Repositorys.

3. NPM-Repository.

Profis:

  • Unterstützt die UPM-Funktionalität vollständig und wird zur Verteilung offizieller Unity-Pakete verwendet.

Nachteile:

  • Ignoriert derzeit alle String-Versionen von Paketen außer „-preview“.

Im Folgenden betrachten wir die UPM + npm-Implementierung. Dieses Paket ist praktisch, da es Ihnen die Arbeit mit jeder Art von Ressource und die Verwaltung von Paketversionen ermöglicht und außerdem die native UPM-Schnittstelle vollständig unterstützt.

Sie können es als NPM-Repository verwenden Verdaccio. Es gibt eine detaillierte Dokumentation, und es sind nur ein paar Befehle erforderlich, um es auszuführen.

Umgebung einrichten

Zuerst müssen Sie installieren node.js.

Ein Paket erstellen

Um ein Paket zu erstellen, müssen Sie die Datei platzieren package.json, der es beschreibt, in das Verzeichnis mit dem Inhalt dieses Pakets. Sie müssen Folgendes tun:

Gehen Sie in das Projektverzeichnis, aus dem wir ein Paket erstellen möchten.

Führen Sie den Befehl npm init aus und geben Sie im Dialog die erforderlichen Werte ein. Geben Sie als Name den Namen im umgekehrten Domänenformat an, zum Beispiel com.plarium.somepackage.
Um den Paketnamen bequem anzuzeigen, fügen Sie die displayName-Eigenschaft zu package.json hinzu und füllen Sie sie aus.

Da npm js-orientiert ist, enthält die Datei die Haupt- und Skripteigenschaften, die wir nicht benötigen und die Unity nicht verwendet. Es ist besser, sie zu entfernen, um die Paketbeschreibung nicht zu überladen. Die Datei sollte etwa so aussehen:

  1. Gehen Sie in das Projektverzeichnis, aus dem wir ein Paket erstellen möchten.
  2. Führen Sie den Befehl npm init aus und geben Sie im Dialog die erforderlichen Werte ein. Geben Sie als Name den Namen im umgekehrten Domänenformat an, zum Beispiel com.plarium.somepackage.
  3. Um den Paketnamen bequem anzuzeigen, fügen Sie die displayName-Eigenschaft zu package.json hinzu und füllen Sie sie aus.
  4. Da npm js-orientiert ist, enthält die Datei die Haupt- und Skripteigenschaften, die wir nicht benötigen und die Unity nicht verwendet. Es ist besser, sie zu entfernen, um die Paketbeschreibung nicht zu überladen. Die Datei sollte etwa so aussehen:
    {
     "name": "com.plarium.somepackage",
     "displayName": "Some Package",
     "version": "1.0.0",
     "description": "Some Package Description",
     "keywords": [
       "Unity",
       "UPM"
     ],
     "author": "AUTHOR",
     "license": "UNLICENSED"
    }

  5. Ö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 schreibgeschützt geöffnet).

Ein Paket versenden

Um das Paket zu senden, müssen Sie den folgenden Befehl ausführen: npm publish --registry *адрес до хранилища пакетов*.

Installieren und Aktualisieren von Paketen über den Unity Package Manager

Um ein Paket zu einem Unity-Projekt hinzuzufügen, benötigen Sie:

  1. Zur Datei hinzufügen manifest.json Informationen über die Quelle der Pakete. Dazu müssen Sie die Eigenschaft hinzufügen scopedRegistries und geben Sie die Bereiche und die Quelladresse an, unter der nach bestimmten Bereichen gesucht wird.
    
    "scopedRegistries": [
       {
         "name": "Main",
         "url": "адрес до хранилища пакетов",
         "scopes": [
           "com.plarium"
         ]
       }
     ]
    
  2. Gehen Sie zu Unity und öffnen Sie das Paket-Manager-Fenster (die Arbeit mit benutzerdefinierten Paketen unterscheidet sich nicht von der Arbeit mit integrierten Paketen).
  3. Wählen Sie „Alle Pakete“ aus.
  4. Suchen Sie das benötigte Paket und fügen Sie es hinzu.

Unity-Paketmanager

Arbeiten mit Quellen und Debuggen

Damit die Quellen mit dem Projekt verbunden werden können, müssen Sie sie erstellen Assembly-Definition für das Paket.

Durch die Verwendung von Paketen werden Ihre Debugging-Optionen nicht eingeschränkt. Wenn Sie jedoch mit Paketen in Unity arbeiten, können Sie nicht durch Klicken auf einen Fehler in der Konsole zur IDE wechseln, wenn der Fehler im Paket aufgetreten ist. Dies liegt daran, dass Unity Skripte nicht als separate Dateien betrachtet, da sie bei Verwendung der Assembly-Definition in einer Bibliothek gesammelt und in das Projekt eingebunden werden. Wenn Sie mit Quellen aus einem Projekt arbeiten, können Sie auf die IDE klicken.

Skript in einem Projekt mit verbundenem Paket:

Unity-Paketmanager
Skript aus dem Paket mit funktionierendem Haltepunkt:

Unity-Paketmanager

Dringende Korrekturen an Paketen

Einem Projekt hinzugefügte Unity-Pakete sind schreibgeschützt, können aber im Paket-Cache bearbeitet werden. Dazu benötigen Sie:

  1. Gehen Sie zum Paket im Paket-Cache.

    Unity-Paketmanager

  2. Nehmen Sie die notwendigen Änderungen vor.
  3. Version in der Datei aktualisieren package.json.
  4. Paket verschicken npm publish --registry *адрес до хранилища пакетов*.
  5. Aktualisieren Sie die Paketversion über die UPM-Schnittstelle auf die korrigierte Version.

Konflikte beim Paketimport

Beim Importieren von Paketen können folgende GUID-Konflikte auftreten:

  1. 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.
  2. Ein Paket ist ein Projekt. Wenn beim Importieren eines Pakets festgestellt wird, dass das Projekt Assets mit passenden GUIDs enthält, werden die Assets aus dem Paket nicht zum Projekt hinzugefügt. Allerdings werden von ihnen abhängige Assets beginnen, Assets aus dem Projekt zu nutzen.

Assets von einem Projekt in ein Paket übertragen

Wenn Sie ein Asset von einem Projekt in ein Paket übertragen, während Unity geöffnet ist, bleibt seine Funktionalität erhalten und Links in abhängigen Assets beginnen, das Asset aus dem Paket zu verwenden.

Es ist wichtig,: Beim Kopieren eines Assets aus einem Projekt in ein Paket tritt der im obigen Abschnitt beschriebene Konflikt „Paket – Projekt“ auf.

Mögliche Lösungen für Konflikte

  1. Neuzuweisung von GUIDs mithilfe unserer eigenen Algorithmen beim Importieren aller Assets, um Kollisionen zu vermeiden.
  2. Alle Assets zu einem Projekt hinzufügen und sie dann in Pakete aufteilen.
  3. Erstellen einer Datenbank mit den GUIDs aller Assets und Durchführen einer Validierung beim Senden von Paketen.

Fazit

UPM ist eine neue Lösung zur Verteilung gemeinsamer Ressourcen in Unity, die eine würdige Alternative zu bestehenden Methoden sein kann. Die im Artikel beschriebenen Empfehlungen basierten auf realen Fällen. Wir hoffen, dass Sie sie nützlich finden.

Source: habr.com

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz und VPS-VDS-Servern 🔥 Kaufen Sie zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server | ProHoster