Schnelle Designiteration in Breachers mit AssetPostprocessor und Blender

Triangle Factory ist ein schnell wachsendes belgisches Gaming-Unternehmen, das Unity verwendet, um hochwertige Multiplayer VR -Titel wie Hyper Dash und ihr neuestes Spiel zu erstellen. Einbrecher. Triangle Factory nutzt Tools wie Cinemachine, Unity Profiler, Game Server Hosting, Matchmaker, Voice Chat (Vivox)und Friends, um ein immersives Erlebnis für Spieler zu schaffen.
In diesem Blog führen uns Jel Sadones, leitender Leveldesigner/Tech Art, und leitender Entwickler Pieter Vantorre durch ihre Blender-to-Unity-Pipeline und zeigen uns, wie sie ihren VR Taktik FPS -Titel Breachers zum Leben erweckt haben.
Unity ist seit über einem Jahrzehnt unsere bevorzugte Engine und Entwicklungsumgebung und wir haben im Laufe der Jahre viele Workflows für die Umgebungsmodellierung und das Design durchlaufen. Dazu gehört die Verwendung von In-Engine-Modellierungstools wie ProBuilder (das wir immer noch für Rapid Prototyping verwenden und lieben) und das Zusammenstellen von Szenen aus Prefabs, die in anderen Modellierungspaketen erstellt wurden. Für unsere aktuellen Projekte haben wir uns jedoch für einen Workflow entschieden, bei dem wir unsere Level in Blender modellieren und organisieren und uns auf den AssetPostprocessor von Unity verlassen, um sie in unser Unity Projekt zu integrieren.
In diesem Artikel erzählen wir Ihnen, wie wir zu diesem Arbeitsablauf gekommen sind und wie er die schnelle Designiteration unterstützt, die wir für unsere Spiele benötigen.
Im Jahr 2021 haben wir unseren ersten großen VR Titel veröffentlicht, Hyper Dash, einen rasanten 5v5-Arena-Shooter. Als wir 2019 mit der Entwicklung des Spiels begannen, hatten wir einen grundlegenden Blender-zu-Unity-Workflow, der vielen wahrscheinlich bekannt vorkommt: Wir haben einfach die Geometrie in Blender modelliert, unsere Assets als FBX-Dateien exportiert und sie manuell in Unity integriert. Die manuelle Integration umfasste mehrere Schritte:
- Einrichten dynamischer Objekte in der Szene wie Waffen-Pickups, Spawn-Türen, Eroberungspunkte
- Platzieren von Collidern, um Spieler daran zu hindern, in bestimmten Bereichen zu gehen oder sich zu teleportieren
- Einrichten unsichtbarer Anleitungen, damit sich Bots richtig verhalten
- Etc.

Dieser Prozess kann bei kleineren Projekten gut funktionieren, wird aber schnell umständlich, wenn ein Projekt größer wird und sich weiterentwickelt. Als wir mit der Planung der Entwicklung unseres nächsten Titels begannen, wussten wir, dass wir einen drastisch verbesserten Arbeitsablauf brauchen würden.
Breachers ist ein kompetitiver Shooter mit komplexem Level-Layout, subtilerer Spielmechanik, mehr technischen Systemen und einem höheren Maß an grafischer Perfektion, der auf die neueste Generation eigenständiger VR Hardware abzielt. Es geht in puncto Komplexität um einige Schritte weiter als Hyper Dash, und die Auswirkungen davon auf unseren Arbeitsablauf haben wir schnell gespürt.

In der Prototyping-Phase haben wir uns für dynamische Objekte, wie zum Beispiel Fensterbarrikaden, noch stark auf Prefabs verlassen. Dabei handelt es sich um Objekte, die wir in Fensterrahmen platzieren, um die Sichtlinie zwischen Innen- und Außenbereich zu blockieren und so zu verhindern, dass die Teams sich während der Aufwärmphase des Spiels gegenseitig sehen.
Beim Testen unseres Prototyps haben wir ständig die Fenster verschoben, um das Gameplay zu verbessern. Das bedeutete, dass wir die Geometrie in Blender ändern, sie erneut nach Unity exportieren und dann die Barrikadenobjekte manuell verschieben mussten, um sie unseren Änderungen anzupassen. Ich habe viele Stunden damit verbracht, in der Szenenansicht von Unity herumzufliegen und solche Dinge manuell zu überprüfen und zu beheben. Dennoch gab es mehr als einen Spieletest, bei dem uns erst während des Spiels auffiel, dass etwas übersehen worden war.


Offensichtlich gab uns dieser Arbeitsablauf nicht die Möglichkeit, unsere Kartenentwürfe während der Spieletests schnell zu wiederholen, sowohl intern als auch als Teil unserer offenen Alpha, in der wir vorhatten, eine Karte kostenlos zur Verfügung zu stellen, um Feedback von der Community zu bekommen. Wir freuten uns auf all das Feedback, aber überhaupt nicht auf den manuellen Aufwand, der erforderlich ist, um es auf unsere Karten anzuwenden.
Ein weiterer potenzieller Nachteil eines vorgefertigten Design-Workflows ist die Leistung. Für unsere Spiele zielen wir hauptsächlich auf mobile, eigenständige VR Headsets ab. Wir möchten die visuelle Darstellung auf die Spitze treiben, also müssen wir das letzte Quäntchen Leistung aus unserem Workflow herausholen.
Das Zusammenstellen von Ebenen aus Prefabs kann weniger effizient sein als das Erstellen eines wasserdichten Netzes in einem Modellierungsprogramm. Wenn Sie zwei modulare Wandteile zusammenstecken, befindet sich zwischen ihnen immer eine nicht zusammengeführte Geometrie-Schleife. Mit Prefabs kann es außerdem leicht passieren, dass Sie in Ihrer Szene viel Geometrie platzieren, die nicht sichtbar ist (weil sie sich auf der Unterseite eines Objekts befindet oder an einer Wand platziert ist), aber dennoch wertvollen Lightmap-Platz einnimmt. Über ein ganzes Level hinweg können sich diese kleinen Ineffizienzen zu Leistungseinbußen und einer Beeinträchtigung der Grafik summieren.

Das letzte Problem mit Prefabs, das wir erwähnen möchten, ist, dass es leicht passieren kann, dass Dinge kaputt gehen, wenn man scheinbar harmlose Änderungen am Quellmodell in Blender vornimmt, wie etwa das Umbenennen eines Objekts. Im Zuge der Weiterentwicklung eines Spiels oder Levels möchten Sie Ihre Assets häufig neu organisieren und ihnen bessere oder einheitlichere Namen geben. Aber das Umbenennen eines Objekts in Blender und dessen erneutes Exportieren kann leicht (und ohne Vorwarnung) die in Unity am Objekt vorgenommenen Überschreibungen und Ergänzungen beschädigen, was zu Regressionen führt.
In diesem vereinfachten Beispiel haben wir ein vorgefertigtes Lüftungsgitter und möchten, dass Rauch austritt. Nachdem unser Künstler das Mesh in Unity importiert hatte, hat er das Rauchpartikelsystem als untergeordnetes Objekt hinzugefügt und dem Prefab eine Oberflächentypkomponente hinzugefügt, um es als Metallobjekt zu kennzeichnen.
Hier sehen Sie, was passiert, wenn wir unser Mesh in Blender umbenennen:
Beim erneuten Importieren des Meshs mit dem aktualisierten Namen kann Unity das alte Mesh nicht mehr anhand des Namens finden und entfernt daher das Objekt aus dem Modell-Prefab. Untergeordnete Elemente dieses entfernten Objekts werden in die Stammebene des Prefabs verschoben und vorhandene Skripte werden entfernt, was wiederum zu manuellen Bereinigungsarbeiten führt, die wir lieber vermeiden möchten.
Als die Prototypphase für Breachers abgeschlossen war und wir uns darauf vorbereiteten, Anfang 2022 in den Vollproduktionsmodus zu wechseln, setzten sich unsere Kunst- und Entwicklungsteams zusammen und untersuchten, was wir tun könnten, um diese Probleme zu beheben. Wir haben klare Ziele für unsere ideale Asset-Pipeline definiert, die die für Breacherserforderliche schnelle und flexible Iteration unterstützen würde:
- Die gesamte Erstellung und Änderung der Levelgeometrie sollte in Blender erfolgen.
- WYSIWYG: Was ein Designer in Blender erstellt, sollte dem Ergebnis in Unity so genau wie möglich entsprechen.
- Wenn etwas in Blender aktualisiert wird, sollte der Import der Änderungen in Unity automatisch erfolgen und keinen manuellen Aufwand erfordern.

Wie oben erwähnt, bestand unser Hauptziel darin, eine genaue Visualisierung des Spiels in Blender zu erhalten – die nicht nur widerspiegelt, wie das Endergebnis in Unity aussehen wird, sondern auch, wie die Spielmechanik aufgebaut ist. Das Gameplay in Breachers hängt nicht nur vom Layout eines Levels ab, sondern auch von dynamischen Objekten (wie zerbrechlichen Wänden) und unsichtbaren Elementen (wie Lautstärke und Kollisionsobjekten). Wir möchten, dass all diese Informationen bereits in der Entwurfsphase sichtbar sind und präzise in Unity übertragen werden.
![Abbildung 5: Breachers-Bild bereitgestellt von Triangle Factory [Teil unseres Skyscraper-Levels in Blender (nur statische Level-Geometrie und Requisiten)]](/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffuvbjjlp%2Fproduction%2F3d1ec8eaf99391b246965c8a7ac1fafd1b6f121c-3810x2058.png&w=3840&q=75)



Benutzerdefinierte Eigenschaften sind für unseren Arbeitsablauf von entscheidender Bedeutung und wir weisen diese Objekten in Blender zu. Diese werden dann im FBX-Format in Unity übertragen, sodass wir sie lesen und benutzerdefinierte Logik ausführen können, wenn unsere Assets in Unity importiert werden.

Dies gibt uns ein hohes Maß an Flexibilität und Stabilität. Diese Eigenschaften bleiben in der gesamten Pipeline mit den Objekten verbunden, sodass wir die Dinge in unseren Ebenen beliebig neu organisieren und umbenennen können, ohne befürchten zu müssen, dass etwas kaputtgeht oder nicht mehr synchron ist.
Unity verfügt über eine leistungsstarke Klasse namens AssetPostprocessor, die Änderungen an Assets während des Imports ermöglicht. Dies verwenden wir beim Importieren, um diese benutzerdefinierten Eigenschaften zu analysieren und entsprechend zu reagieren.
Vorgefertigte Links
Wir haben eine benutzerdefinierte Eigenschaft namens PrefabLink, die Unity mitteilt, dass das aus Blender importierte Objekt durch ein bereits im Unity -Projekt vorhandenes Prefab ersetzt werden soll, während die Transformation des importierten Modells erhalten bleibt. Dadurch können wir diese dynamischen Objekte in Blender platzieren und gleichzeitig die Vorteile von Prefabs beibehalten, sobald sie in Unity importiert werden. Die Fensterbarrikaden in der Blender Szene oben sind ein gutes Beispiel dafür.

Oberflächentypen
Die Oberflächendefinition ist bei Breachersäußerst wichtig. Das Gehen auf einer Metalltreppe klingt anders als das Gehen auf einem Betonboden. Die Durchdringung von Holz durch eine Kugel unterscheidet sich stark von der durch Stahl. Und jeder Oberflächentyp hat seine eigenen Aufpralleffekte. Es wäre extrem zeitaufwändig, jedes Requisit in Unity durchzugehen und es mit dem richtigen Oberflächentyp zu kennzeichnen. Deshalb gehen wir dies auch in der Entwurfsphase in Blender an, indem wir benutzerdefinierte Eigenschaften für unsere Geometrie-Collider festlegen.
Statische Flags
Eine weitere wichtige Einstellung zur Optimierung sind die statischen Flags von Unity. Die korrekte Einstellung dieser Werte kann erhebliche Auswirkungen auf Dinge wie Sichtbarkeitsauslese, Light Baking und Batching haben. Mithilfe benutzerdefinierter Eigenschaften in Blender können wir diese in jedem Teil des Levels festlegen, einschließlich wiederverwendbarer Requisiten, und diese Informationen auf alle unsere Level in Unity übertragen.
Collider
Abschließend möchten wir Ihnen mitteilen, wie wir Collider einrichten. Unity verfügt über ein einfaches, aber effektives System, das Detaillierungsvarianten für Modelle automatisch erkennt, wenn Sie einem Modell-Asset-Namen das Postfix _LOD0, _LOD1 usw. hinzufügen. Wir haben uns davon inspirieren lassen und ein ähnliches System für Collider entwickelt: Indem wir einfach eine Geometrie mit _BoxCollider oder _NoCollision im Namen verwenden, ersetzen wir die Meshes von Blender durch Collider in Unity.


Als konkretes Beispiel hier ein Ausschnitt unseres LevelSetupPostprocessors, der benutzerdefinierte Eigenschaften liest und jedem importierten Objekt die richtigen statischen Flags zuweist:
Damit das alles reibungslos funktioniert, mussten wir auch auf der Blender Seite einiges tun.
Benutzerdefinierte Eigenschaften sind in der Benutzeroberfläche von Blender etwas versteckt und erfordern, dass Künstler die benutzerdefinierten Eigenschaften jedes Mal manuell eingeben, was keine tolle Benutzererfahrung ist. Das Verlassen auf die manuelle Texteingabe wäre außerdem sehr fehleranfällig und würde viele der Vorteile zunichte machen, die eine Einrichtung in Blender von vornherein mit sich bringt. Durch die Umstellung von einem auf Prefabs basierenden Workflow auf Blender haben wir auch einige der Vorteile von Prefabs vermisst, wie etwa eine schöne Bibliothek mit Objekten, die man durchsuchen und aus denen man auswählen kann. Glücklicherweise ist Blender, wie Unity, sehr flexibel und leicht erweiterbar.
Die Antwort auf das Prefab-Organisationsproblem kam in Blender 3.2 mit Asset Libraries. Dieses System verhält sich ähnlich wie das Prefab-System in Unity: Sie können damit Assets in einer separaten Datei erstellen und diese dann in Ihre Blender Szene importieren, während Änderungen in der Asset-Datei automatisch in der Blender Szene widergespiegelt werden. Darüber hinaus wird sichergestellt, dass alle benutzerdefinierten Eigenschaften oder Collider auf jede Instanz dieses Assets in Blender korrekt angewendet werden.


Für Blender haben wir ein internes Add-on geschrieben, um die Einrichtung der benutzerdefinierten Eigenschaften in einer übersichtlicheren Benutzeroberfläche zu erleichtern. Dies vereinfacht das Festlegen benutzerdefinierter Eigenschaften, indem Sie einfach die relevanten Blender Objekte auswählen und auf eine Schaltfläche klicken, anstatt jede Eigenschaft manuell einzugeben.
Das Bundle Exporter-Add-on ist ein Open-Source-Add-on, das wir verwenden, um alle unsere FBX-Dateien mit einem Klick zu exportieren. Wir haben es so geändert, dass es auch mit benutzerdefinierten Eigenschaften funktioniert, und die Benutzeroberfläche aktualisiert, um schnellere Exporte für unsere spezifischen Anforderungen zu ermöglichen.

Die Einrichtung unseres Level-Design-Workflows für Breachers war anfangs sehr zeitaufwändig, aber wir glauben, dass es die richtige Wahl für das Projekt war. Außerdem hat es irgendwie Spaß gemacht!
Während wir das Spiel von den ersten Blockierungen über die Alphatests bis hin zu den Monaten vor der endgültigen Veröffentlichung entwickelt haben, verlief die Iteration unserer Level schnell und schmerzlos. Wir konnten den Mehraufwand und die Routinearbeiten für unsere Designer und Künstler eliminieren und ihnen gleichzeitig Aufgaben übertragen, für die sie früher einen Entwickler benötigt hätten.
Wir waren von der reibungslosen Integration von Unity und Blender beeindruckt und sind überzeugt, dass diese Integration ausschlaggebend dafür war, Breachers zu einem Spiel zu machen, mit dem wir zufrieden sind und das wir stolz mit der Welt teilen möchten.
Danke fürs Lesen und viel Spaß beim Spiel!

Einbrecher der Triangle Factory ist ab sofort verfügbar. Weitere Blogs von Made with Unity Entwicklern finden Sie hier.
