Plugin-Erstellung/Unity/AssetBundles Erstellung

Aus Rising World Wiki


Unity AssetBundles Erstellung für Rising World PlugIns.

In diesem Tutorial wird beschrieben, wie Unity AssetBundles für Rising World erstellt werden. AssetBundles sind Archivdateien, die Assets gruppieren können, wie zum Beispiel Modelle, Texturen, Shader, Partikeleffekte und Unity Prefabs. Modelle und Texturen können mit der API auch direkt von der Festplatte geladen werden. Unity wird nur benötigt, wenn AssetBundles mit Unity erstellt werden sollen, die deutlich mehr Freiheit und Kontrolle bieten.

Was sind AssetBundles

Ein AssetBundle ist eine Archivdatei, die mehrere Assets enthalten kann. AssetBundles können Prefabs mit fast allen Unity-Komponenten enthalten, zum Beispiel:

  • Benutzerdefinierte Modelle
  • Benutzerdefinierte Materialien und Shader
  • Partikeleffekte
  • Physikkomponenten
  • Lichter

Skripte werden nicht unterstützt, da das Spiel IL2CPP verwendet, das keine neuen Assemblies zur Laufzeit laden kann.


Wichtige Hinweise

  • **Unity-Version**: Es ist zwingend erforderlich, die gleiche Unity-Version wie das Spiel zu verwenden.
 Aktuell verwendet Rising World Unity 6000.0.60 (siehe Changelog bei Updates).
  • **HDRP**: Rising World verwendet die High Definition Render Pipeline (HDRP). Alle Materialien und Shader müssen HDRP-kompatibel sein.
  • **Plattform-Abhängigkeit**: Shader sind plattformabhängig und müssen für Windows, Mac und Linux kompiliert werden.
 Rising World unterstützt "Multi-Platform AssetBundles", die Daten für alle unterstützten Plattformen in einer einzigen Datei enthalten.


Unity

Unity installieren

Voraussetzung für die Erstellung von AssetBundles ist die Installation der gleichen Unity-Version wie das Spiel. Zum Zeitpunkt der letzten Aktualisierung dieses Artikels handelt es sich dabei um Unity 6000.0.60.

  1. Unity Hub herunterladen und installieren.
  2. Im Unity Hub die gleiche Unity 6000.0.60-Version wie das Spiel installieren.
  3. Sicherstellen, dass "Linux Build Support (Mono)" und "Mac Build Support (Mono)" installiert sind, um AssetBundles für diese Plattformen erstellen zu können.

Unity Projekt erstellen

  1. Im Unity Hub oben rechts auf den blauen "New project" Button klicken.
  2. Als Template "High Definition 3D" (HDRP) auswählen.
  3. Auf der rechten Seite (runter Scrollen) einen Projektnamen vergeben (zum Beispiel "Rising World Plugin") und optional einen Projektpfad angeben.
  4. Auf "Create project" klicken. Das Projekt wird anschließend automatisch geladen.
  5. Beim erstmaligen Öffnen kann der HDRP-Wizard angezeigt werden. "Show on start" unten deaktivieren und den Wizard schließen.
  ! Wichtig HDRP Projekt !

PluginSDK importieren

  1. Im oberen Menü auf "Assets" > "Import Package" > "Custom Package..." klicken.
  2. Die Datei "PluginSDK.unitypackage" im Spielverzeichnis unter "Data/SDK/PluginSDK.unitypackage" auswählen und importieren.
  3. Sicherstellen, dass alle Einträge ausgewählt sind, und auf "Import" klicken.
  4. Den Dialog "Fix Layers", mit dem die aktuellen Layer auf die Spiel-Layer abgestimmt werden können. Auf "Fix now" klicken.

AssetBundles erstellen

Nach dem Import des PluginSDK steht im Projekt unter "Assets" der neue Ordner "AssetBundles" zur Verfügung. Für jedes gewünschte AssetBundle kann ein eigener Unterordner angelegt werden (jeder Unterordner ergibt beim Build ein separates AssetBundle). Das PluginSDK enthält bereits einen Ordner "ExampleBundle" mit einem Beispiel-VFX-Effekt.

  1. Unterordner im Ordner "AssetBundles" für die eigenen AssetBundles anlegen.
  2. Die gewünschten Assets (Modelle, Texturen, Prefabs usw.) in die jeweiligen Unterordner einfügen.
  3. Im oberen Menü auf "PluginSDK" > "Build Asset Bundles" klicken.
  4. Die AssetBundles werden anschließend im Ordner "Build" im Projektverzeichnis erzeugt.

Was sind Render-Pipelines und HDRP?

Eine Render-Pipeline (Rendering Pipeline) legt fest, wie Grafiken in Unity gerendert werden. Unity bietet verschiedene Render-Pipelines an:

  • Built-in Render Pipeline – die traditionelle Pipeline.
  • Universal Render Pipeline (URP) – optimiert für Mobilgeräte und leistungsschwächere Hardware.
  • High Definition Render Pipeline (HDRP) – ausgelegt auf High-End-Grafiken mit fortschrittlichen Beleuchtungseffekten.

Rising World verwendet HDRP, daher müssen alle Materialien und Shader HDRP-kompatibel sein. Der mitgelieferte "HDRP/Lit"-Shader sowie mit dem Shader Graph erstellte Shader werden unterstützt.

GPU Resident Drawer

Der GPU Resident Drawer ist eine Rendering-Funktion in Unity HDRP, die das Rendern vieler Objekte effizienter macht. Diese Funktion wurde nachträglich zu Rising World hinzugefügt. Detaillierte Informationen zu Funktionsweise und Konfiguration enthält die Unity-Dokumentation "Use the GPU Resident Drawer".

Einstellungen im Unity Editor

Edit-ProjectSetting-Graphics-BatchRenderGroup Variants.png Edit-ProjectSetting-Quality-HDRP-GPU Resident Drawer.png


Shader und Materialien

Was sind Shader?

Shader sind kleine Programme, die bestimmen, wie Oberflächen gerendert werden, und werden auf der Grafikkarte (GPU) ausgeführt. Sie steuern Lichter, Schatten, Farben und weitere visuelle Effekte. In Unity werden Shader in mehrere Kategorien unterteilt; jede Kategorie wird für unterschiedliche Zwecke eingesetzt.
Eine Übersicht enthält das Unity Manual: Shader Einführung.

Shader Graph

Shader Graph ist ein visuelles, knotenbasiertes Werkzeug in Unity, das die Erstellung von Shadern ohne Code ermöglicht, indem Nutzer Knoten in einem Diagramm verbinden, um das Erscheinungsbild von Objekten zu steuern.
Siehe auch:

Shader und Materialien Zusammenarbeit

In Unity werden Shader nahezu immer zusammen mit Materialien verwendet. Der Shader bildet das eigentliche Rechenprogramm (die Formel), das Material enthält die konkreten Einstellungen (zum Beispiel Farbe, Rauheit oder Metallanteil). Ein Material wird anschließend einem 3D-Objekt zugewiesen, damit dieses korrekt dargestellt wird.

Was sind Texturen?

Texturen sind 2D-Bilddateien, die auf 3D-Modelle aufgetragen werden, um ihnen Farbe, Muster und Oberflächendetails zu verleihen. Unterstützte Bild-Dateiformate für Texturen: jpg, jpeg, png, gif, tga, tiff, bmp. Die Plugin-API Dokumentation empfiehlt ausdrücklich, Kantenlängen zu verwenden, die eine Zweierpotenz sind (256, 512, 1024, 2048) oder zumindest ein Vielfaches von 4 darstellen, andernfalls ist die DXT-Komprimierung nicht möglich. Siehe auch JavaDoc: Class TextureAsset.

UV-Mapping

Damit eine 2D-Textur auf einer 3D-Oberfläche erscheinen kann, muss die Oberfläche zuerst in eine flache 2D-Repräsentation "aufgewickelt" werden. Dieser Vorgang heißt UV-Mapping und wird im 3D-Modelling-Tool (Blender, 3ds Max, Maya usw.) durchgeführt. Dabei werden UV-Koordinaten erzeugt, die beschreiben, welcher Punkt der Textur auf welchem Punkt des 3D-Modells erscheint. Im Shader werden diese UV-Koordinaten genutzt, um die korrekten Pixel aus der Textur zu lesen.

Albedo-Textur (Base Color)

Die Albedo-Textur (auch Base Map oder Base Color Map genannt) liefert die reine Farbinformation eines Materials ohne Schatten, Lichter oder Reflexionen. In HDRP heißt das entsprechende Eingabefeld Base Map und kombiniert die Albedo-Farbe mit einer optionalen Transparenz über den Alpha-Kanal. Die Albedo sollte niemals fertig beleuchtete Schatten oder Glanzlichter enthalten, da diese von der Engine zur Laufzeit ergänzt werden.

Normal Map

Eine Normal Map ist eine besondere Textur, in der pro Pixel ein 3D-Richtungsvektor in den RGB-Kanälen gespeichert ist. Sie lässt eine Oberfläche so wirken, als hätte sie feine geometrische Details (Beulen, Kratzer, Nieten), ohne die tatsächliche Geometrie zu erhöhen. Eine Normal Map kann damit Polygonbudget sparen, kostet aber zusätzlichen Texturspeicher und einen weiteren Sampler-Aufruf pro Pixel.

Weitere gängige Texturtypen

Neben Albedo und Normal Map existieren in HDRP noch:

  • Mask Map – ein kanalgepacktes RGBA-Bild, in dem R = Metallic, G = Ambient Occlusion, B = Detail Mask und A = Smoothness gespeichert wird. Alle vier Werte werden mit einer einzigen Textur übermittelt.
  • Detail Map – kanalgepackte Textur mit Detail-Albedo, Detail-Normal und Detail-Smoothness, um nahe Ansichten mit Mikrodetails anzureichern.
  • Height Map – Graustufenbild, das im Shader zur Pixelverdrängung oder zum Parallax-Mapping genutzt wird.
  • Emissive Map – bestimmt, welche Bereiche des Materials selbst leuchten (zum Beispiel glühende Lava, Monitorbildschirme).

Was sind Materialien?

Ein Material ist ein Asset, das einem 3D-Objekt zugewiesen wird und dessen visuelles Erscheinungsbild bestimmt. Es referenziert einen Shader und enthält die konkreten Werte für dessen Eigenschaften. Ein und derselbe Shader kann mit unterschiedlichen Materialien völlig unterschiedlich aussehen, indem Farben, Texturen und numerische Parameter variiert werden.

HDRP-Material per API erzeugen

Innerhalb der Rising-World-Plugin-API kann ein Material direkt aus dem Plugin-Code erzeugt und einem Objekt zugewiesen werden, ohne auf eine in Unity vorgefertigte Datei angewiesen zu sein. Dies ist besonders hilfreich, wenn ein Materialwert zur Laufzeit dynamisch angepasst werden soll oder wenn im AssetBundle mitgelieferte Standard-Materialien Probleme verursachen (siehe Bekannte Probleme).

import net.risingworld.api.assets.MaterialAsset;
import net.risingworld.api.worldelements.Model;

//Neues Material per Code erzeugen
MaterialAsset test = MaterialAsset.create("test");

//Einem 3D-Modell zuweisen (Root = leerer Pfad)
object.setMaterial("", test);

Die Methode MaterialAsset.create() ist unter JavaDoc: Class MaterialAsset zu finden und ein Hinweis dazu im Forum.

Was sind Partikeleffekte?

Partikeleffekte (Particle Systems) dienen zur Erzeugung visueller Effekte wie Feuer, Rauch, Funken etc. ... Sie bestehen aus vielen kleinen Partikeln, die sich nach definierten Regeln bewegen und verändern.

HDRP-Kompatibilität

Alle in Rising World verwendeten Materialien und Shader müssen HDRP-kompatibel sein.

  • Für Standard-Materialien wird der "HDRP/Lit"-Shader verwendet.
  • Für benutzerdefinierte Shader wird der Shader Graph verwendet; damit erstellte Shader sind automatisch HDRP-kompatibel.
  • Shader der Built-in Render Pipeline werden nicht unterstützt.

AssetBundles mit Plugin laden

Nach der Erstellung können die AssetBundles über die Plugin-API geladen werden. Siehe dazu den Wiki-Artikel AssetBundle Klasse.

Bekannte Probleme mit AssetBundles

Unsichtbare AssetBundles

Wenn ein AssetBundle im Unity-Editor korrekt angezeigt wird, im Spiel jedoch unsichtbar bleibt, kann der GPU Resident Drawer die Ursache sein. Der mit dem AssetBundle ausgelieferte Shader ist in diesem Fall möglicherweise nicht mit DOTS Instancing kompatibel.

Der GPU Resident Drawer ist eine Rendering-Funktion in Unity HDRP, die das Rendern vieler Objekte effizienter macht.

Lösung 1: DisallowGPUDrivenRendering Komponente

Eine "DisallowGPUDrivenRendering"-Komponente wird dem Prefab hinzugefügt. Das Objekt wird dadurch aus dem GPU Resident Drawer ausgeschlossen, weiterhin jedoch von der GPU gerendert. Sofern nicht Hunderte oder Tausende Instanzen des Prefabs gleichzeitig erzeugt werden, ist in der Regel kein Leistungsunterschied spürbar.

Die Komponente kann auf zwei Wegen hinzugefügt werden:

  • Im Unity-Editor vor dem Erstellen des Bundles.
  • Nachträglich über die Plugin-API mit prefab.addComponent(null, "DisallowGPUDrivenRendering");.

Lösung 2: GPU Resident Drawer im HDRP Asset aktivieren

Diese Variante behebt das Problem ohne Code-Anpassungen:

  1. "Project Settings" > "Graphics" öffnen.
  2. Im Abschnitt "Shader Stripping" die Einstellung "BatchRendererGroup Variants" auf "Keep All" setzen.
  3. Das aktive HDRP-Asset öffnen.
  4. Im Abschnitt "Rendering" die Einstellung "GPU Resident Drawer" auf "Instanced Drawing" setzen.
  5. Sicherstellen, dass in den Grafikoptionen des Projekts "High Definition (HDRP)" ausgewählt ist.

Edit-ProjectSetting-Quality-HDRP-GPU Resident Drawer.png

Weitere Informationen enthält die Unity-Dokumentation "Use the GPU Resident Drawer".

Große Dateien

AssetBundles sollten möglichst kompakt gehalten werden. Je kleiner die Bundles ausfallen, desto weniger Speicher belegen sie auf dem Rising World Server und desto schneller können sie beim Laden des Plugins an die Clients übertragen werden. Bei sehr großen Bundles empfiehlt sich eine Aufteilung in mehrere, thematisch getrennte AssetBundles.
Es ist aufgefallen das es für Server, enorm wichtig ist mit kleinen Daten zu arbeiten.
Also sollten große AssetBundles vermieden werden.


C# Skripte

Skripte werden in AssetBundles nicht als ausführbarer Code unterstützt, da Rising World IL2CPP verwendet und IL2CPP zur Laufzeit keine neuen Assemblies nachladen kann. AssetBundles können zwar MonoScript-Referenzen auf Script-Klassen enthalten, der zugehörige Programmcode muss jedoch bereits in das Spiel beziehungsweise in die DLL einkompiliert sein.

Siehe auch

Forum

Unity Dokumentation

API Dokumentation

Kategorien

Unity
Unity(5 S)
Keine Unterkategorien
Tutorial Kategorie
Tutorial(3 S)
Keine Unterkategorien