Bibliotheks-Code in mehreren Unity-Projekten nutzen

Sobald Du an mehreren Spiele-Projekten arbeitest, wirst Du feststellen, dass sich einige Code-Bausteine in allen Projekten ähneln. Meistens geht es dabei um spiel-unabhängig Hilfsmittel zur Erfüllung allgemeiner Aufgaben. In diesem Artikel nenne ich diese Scripte Bibliotheks-Code. Nun kann man die Dateien einfach in alle Projekte kopieren und so lokale Duplikate anfertigen, was sich vor allem dann anbietet, wenn ein Projekt abgeschlossen ist, zumal dabei lokale Kopien sogar nützlich sind. Sie stellen sicher, dass das Projekt in seinem zuletzt als lauffähig sichergestellten Zustand verbleibt. Werden jedoch mehrere Projekte quasi gleichzeitig weiterentwickelt, so ist es lästig, die veränderten, gemeinsam genutzten Dateien stets manuell zu synchronisieren. Da Unity nur Dateien in seinem lokalen Asset-Ordner einbindet und verlinkte Dateien nicht direkt unterstützt, bietet es sich an, diesen Vorgang zu automatisieren.

Verhindere Konflikte durch Kapseln von Bibliotheks-Code in einer DLL

Ich empfehle Dir, Deinen Bibliotheks-Code, der nur unabhängige Helferfunktionen beinhaltet und in mehreren Projekten zum Einsatz kommt, in eine separate DLL zu compilieren und diese dann in die Projekte zu kopieren. Dazu wird ein eigenständiges VisualStudio- oder MonoDevelop-Projekt angelegt, das den gesamten Bibliothekscode in eine DLL compiliert.

Das bringt u. a. folgende Vorteile:

  • Der Code wurde beim Compilieren bereits geprüft. Du kannst daher ein Stück weit sicher sein, dass der Code grundsätzlich fehlerfrei ist (Logik- und Laufzeitfehler natürlich ausgenommen).
  • Es ist nur eine Datei zu verwalten, Du musst nicht mehrere Dateien, womöglich über mehrere Ordner verteilt, im Projekt verwalten. Werden Dateien gelöscht oder verschoben, so übertragen sich die Änderungen innerhalb der DLL automatisch. Das manuelle Löschen veralteter Dateien entfällt zum Beispiel.
  • Versehentlichem Verändern wird vorgebeugt, weil Du den Code innerhalb der DLL nicht direkt bearbeiten kannst. Bei einzelnen Dateien besteht ein größeres Risiko, dass Du Bibliothekscode bei der Programmierung veränderst und vergisst, diese Änderungen in die anderen Projekte zu spiegeln. Schlimmstenfalls entstehen dabei konkurrierende Versionen, beim Kopieren gehen Änderungen verloren oder Du musst mühsam verschiedene Änderungen zusammenführen.

Ein Nachteil ist, dass Du ein zweites Projekt separat pflegen und die DLL-Datei in die Projekte kopieren musst. Fürs Kopieren beschreibe ich im nächsten Abschnitt unten eine Automatisierungsmöglichkeit.

Anmerkung zur Alternative per Versionierung: Man könnte den gemeinsamen Code natürlich auch in einem Version-Management-System (z.B. CVS, SVN, GIT, …) ablegen und dieses in das Projekt importieren. Dabei importiert man allerdings möglicherweise auch unerwünschte Dateien, die als Unity-Assets interpretiert werden und verzichtet auf die oben genannten Vorteile.

Dateiaktualisierung auf Knopfdruck

Gehen wir also davon aus, dass Du jetzt ein oder mehrere Spiel-Projekt(e) hast, sowie eine Bibliotheks-Code-DLL  tools.dll, die in einem separaten Ordner liegt (z.B. als Ausgabe in einem eigenen VisualStudio-Projekt oder als Download eines entfernen cvs/svn/git/…-Repositories).  Du arbeitest jetzt in einem Unity-Projekt, das diese Datei nutzt und wann immer sie sich durch eine Aktualisierung ändert, soll die DLL im Untiy-Projekt möglichst auf die neue Fassung aktualisiert werden. Dazu kannst Du den FilePatcher des GameDev-Profi-Toolkits wie folgt einsetzen:

Toolkit installieren

  • Lade die GDP-Editor-DLL gemäß dieser Anleitung herunter und kopiere sie in Dein Projekt.

Lokales Editor-Profil anlegen

  • Führe den Menüpunkt Assets » Create » GameDev-Profi » Editor-Profile aus, um ein Profil-Asset anzulegen.
    Profil-Assets sind im Unity-Projekt gespeicherte Einstellungen, die nur für einen bestimmten Rechner oder Anwender gelten. Hier steht mehr dazu.
  • Wähle die neu erstellte Datei und klicke im Inspector auf den Schalter Activate, um die Datei als aktives Profil einzustellen.
    Screenshot der Profil-Aktivierung

Kopiervorgang definieren

  • Kopiere die zu aktualisierende Datei zunächst einmal manuell in Dein Projekt, in dem Du sie aus dem Datei-Explorer/Finder in den Assets-Ordner ziehst.
  • Wähle die DLL in Unity aus und führe dann den Menübefehl Assets » GameDev-Profi » Add to FilePatcher in active Editor Profile aus.
    Bestätige die Rückfrage einfach mit Yes.
  • Wähle das aktive Editor-Profil aus. Du kannst das ganz einfach mit dem Menübefehl GameDev-Profi » Select active Editor Profile machen.
  • Im Inspector siehst Du jetzt, dass der Abschnitt File Patcher einen neuen Eintrag mit dem Projekt-Pfad der DLL enthält. Ergänze in diesem Eintrag im Feld with file den vollen Dateipfad zur Datei-Quelle, also der immer aktuellsten Version. Das ist z.B. das Ausgabe-Ergebnis im DLL-Projekt oder die Datei im Repository.
  • Aktiviere die Checkbox vor dem Wort Replace file, um den Eintrag aktiv zu schalten.
    Import von Bibliotheks-Code per FilePatcher-Konfiguration im Editor-Profil

Kopiervorgang ausführen

  • Immer wenn Du nun eine neue Fassung der DLL kompilierst oder herunterlädst, kannst Du diese in Dein Projekt importieren, in dem Du den Menübefehl GameDev-Profi » Patch Files ausführst.

Kurz zusammengefasst

Der FilePatcher im GDP-Toolkit kopiert/ersetzt Dateien im Projekt mit Dateien aus dem Dateisystem. Welche Dateien wohin kopiert werden, ist in einem Editor Profile Asset hinterlegt.

Bildnachweise:

Dr. René Bühling

Hi, mein Name ist René und ich möchte Dir dabei helfen, deinen Traum vom eigenen Computerspiel Wirklichkeit werden zu lassen. Mein erstes kommerziell veröffentlichtes Spiel habe ich Mitte der 1990er Jahre als Hobby-Projekt mit einem Basic-Dialekt unter Windows entwickelt. Seither verfolge ich das Thema Spieleentwicklung in Hobby, Studium und Beruf. Ich habe über 20 Jahre Erfahrung in allen Phasen des Entwicklungsprozesses, die ich gerne mit dir teilen möchte.