Wie Sie Ihre Unity-Spiel-Assets mit Code prozedural anpassen

In diesem Tutorial zeige ich Ihnen die Grundlagen der prozeduralen Anpassung von Objekten zu Ihrem Vorteil in Unity. Im Grunde läuft es darauf hinaus Zufälligkeit innerhalb bestimmter Regeln verwenden. Wenn Sie eine Art von prozeduralem System verwenden (sogar ein einfaches), können Sie Ihrem Spiel eine Vielzahl von Variationen und Details hinzufügen, ohne dass Sie alles manuell erstellen müssen.

Wir beginnen mit der Erstellung eines einfachen Baums manuell und verwenden dann prozedurale Anpassungstechniken, um die Erstellung einer Reihe ähnlicher, jedoch deutlich unterschiedlicher Bäume zu automatisieren. Dann werden wir diese Bäume in einem einfachen Spiel platzieren, um zu zeigen, wie sie in "Aktion" aussehen..

So sehen unsere prozedural generierten Bäume aus:


Klicken Sie auf die Schaltfläche, um einen neuen Satz Bäume zu erstellen.

Konfiguration

Wie in meinem vorherigen Lernprogramm müssen Sie Unity installieren und über grundlegende Kenntnisse verfügen. (Siehe Wie man Unity lernt, um einen guten Einstieg zu finden.)

Erstellen Sie ein neues Projekt für dieses Lernprogramm, und aktivieren Sie das Kontrollkästchen Zeichensteuerungen; Wir könnten sie später brauchen.

Ich habe einige Bäume vorbereitet, die wir verwenden werden 3D-Dateien Ordner des Quelldownloads. Die gesamten Projektdateien, falls Sie diese verwenden möchten, finden Sie auch im Quelldownload, sind jedoch für dieses Lernprogramm nicht erforderlich.

Bereit? Lass uns gehen!


Einen Baum erstellen

Lassen Sie uns zuerst einen einfachen Baum erstellen, da wir, um prozedurale Berührungen hinzufügen zu können, eine grundlegende Vorlage benötigen, von der aus wir beginnen können.

Legen Sie die oben erwähnten 3D-Dateien in den Asset-Ordner. Denken Sie daran, die Skalierung im Importer auf zu setzen 1 eher, als 0,001, so dass die Größen aneinanderreihen.

Erstellen Sie nun einen Würfel und benennen Sie ihn Baum. Gehe zum Netzfilter Komponente und tauschen Sie das Würfelnetz gegen das aus tree_01 Mesh. Es sollte angezeigt werden, wenn sich die 3D-Dateien in Ihrem Asset-Ordner befinden.

Der Baum wird möglicherweise noch nicht vollständig angezeigt. Dies ist darauf zurückzuführen, dass das 3D-Modell für den Baum zwei Materialien (Rinde und Blätter) unterstützt, aber derzeit noch auf eins eingestellt ist. Um dies zu beheben, öffnen Sie die Materialien Array in der Mesh-Renderer Komponente des Würfels und setzen Sie die Größe zu 2. Es sollte so aussehen:

Jetzt brauchen wir Materialien für die Rinde und Blätter. Erstellen Sie zwei neue Materialien und geben Sie ihnen eine grundlegende braune und grüne Farbe. Weisen Sie diese beiden Materialien dem zu Materialien Slot in der Mesh-Renderer des Baums, und es sollte mit den angezeigten Materialien wie folgt angezeigt werden:

Um diesen grundlegenden Baum zu beenden, fügen Sie einen Kapselcollider hinzu, indem Sie auf klicken Komponente> Physik> Capsule Collider. Dies ist so, dass wir uns nicht durch den Baum bewegen, wenn wir ihn später testen. Unity fragt, ob Sie den aktuellen Box-Collider im Baum ersetzen möchten, den Sie bestätigen müssen. Sobald der neue Collider hinzugefügt wurde, ändern Sie die Werte so, dass die Form der Kapsel den Stamm des Baums ungefähr überlappt:

Diese Werte funktionieren:

Ziehen Sie nun das Baumobjekt in den Projektordner, um es in ein Prefab zu verwandeln. Unser grundlegender Baum ist fertig!


Die Bäume zufällig drehen

Erstellen Sie ein neues Skript namens Baum.js und fügen Sie es dem Baum-Fertighaus hinzu. Fügen Sie nun die folgenden Zeilen zum hinzu Start() Funktion:

transform.localEulerAngles.y = Random.Range (0, 360);

Der Baum wird jetzt beim Erstellen auf der y-Achse um einen zufälligen Betrag gedreht. Das bedeutet, wenn Sie eine Baumreihe platzieren, wie folgt:

… Dann drehen sich alle beim Start des Spiels in ihre eigene Richtung. Setze ein paar Bäume in dein Level und probiere es aus!


Größe anpassen

Auf ähnliche Weise können wir die Größe eines Objekts ändern. Fügen Sie dem folgenden Code hinzu Baum.js Skript:

transform.localScale = transform.localScale * Random.Range (0.5, 1.5);

Dadurch wird der Baum entweder verkleinert oder vergrößert. Wenn Sie mit einer Skala von 1 beginnen (dies sollte der Fall sein, wenn alles richtig eingestellt ist), wird die neue Skala zwischen 0,5 (halb so groß) und 1,5 (50% größer) liegen. Jetzt sollten Ihre Bäume noch vielfältiger aussehen:


Verwenden verschiedener 3D-Modelle

Möglicherweise haben Sie bemerkt, dass sich in den Dateien, die ich Ihnen zuvor gegeben habe, drei Bäume befinden. Das liegt daran, dass wir das 3D-Modell nun zufällig durch ein anderes ersetzen und noch mehr Bäume aus der Vorlage erstellen.

Fügen Sie dazu den folgenden Code hinzu Baum.js Skript:

var treeMeshes: Mesh []; function Start () gameObject.GetComponent (MeshFilter) .mesh = treeMeshes [Random.Range (0, treeMeshes.Length)]; 

Bevor Sie jedoch die Szene starten, weisen Sie diesem Array die drei Maschen zu, die wir haben:

Wenn Sie Ihre Szene abspielen, werden Sie feststellen, dass Sie jetzt drei verschiedene Baumnetze erhalten, die zufällig zugewiesen werden.

Sie können dies alles in der folgenden Demo testen. Wenn Sie die Taste drücken, werden alle Bäume durch neue und eindeutige Bäume ersetzt.


Farbe ändern

Dies könnte ein bisschen knifflig sein. Zusätzlich zu allen vorherigen Funktionen geben wir jedem Baum einen einzigartigen Grün- und Braunton.

Zuerst müssen wir wissen, wie man auf die Farben zugreift. Auf das Material eines Objekts kann normalerweise über zugegriffen werden Renderer.Material.Farbe. In unserem Fall haben wir jedoch zwei Farben, was bedeutet, dass wir auf sie zugreifen müssen renderer.materials [0] .color und renderer.materials [1] .color. Überprüfen Sie den Mesh-Renderer des Baums, um zu sehen, welches Material (Blätter oder Rinde) sich in Slot 0 und welches in Slot 1 befindet.

Das Erstellen einer zufälligen Farbe funktioniert ähnlich wie bei den vorherigen Schritten. Wenn Sie diese Zeilen hinzufügen:

renderer.materials [0] .color = Farbe (Random.Range (0, 1.1), Random.Range (0, 1.1), Random.Range (0, 1.1)); renderer.materials [1] .color = Farbe (Random.Range (0, 1.1), Random.Range (0, 1.1), Random.Range (0, 1.1));

… Dann wird sowohl dem Rindenmaterial als auch dem Blattmaterial eine völlig neue Farbe zugewiesen. Lass es uns überprüfen:

Okay, das ist nicht das, was wir wirklich wollen. Dies sind zufällige Farben aus dem gesamten verfügbaren Spektrum! Für künstliche Gegenstände wie Autos könnte dies ausreichen. Aber wir haben Bäume, also brauchen wir Grün- und Brauntöne.

Ersetzen Sie den soeben hinzugefügten Farbcode:

renderer.materials [0] .color = Farbe (Random.Range (0.8, 1.1), Random.Range (0.4, 0.6), Random.Range (0, 0.2)); renderer.materials [1] .color = Farbe (Random.Range (0, 0.4), Random.Range (0.6, 1.1), Random.Range (0, 0.4));

Und probiere es aus:

Viel besser. (Wenn die Blätter plötzlich braun sind und der Stamm grün ist, tauschen Sie das aus 1 und 0 im Renderer-Materialien [0].)

Der Code erzeugt am Anfang der Programmfarbe eine neue Farbe. Die drei zufälligen Werte gehen von aus 0 (Minimum) bis 1 (Maximum), die dann den Rot-, Grün- und Blauwerten in der Farbe entsprechen. Indem Sie den Bereich der Zufälligkeit einschränken, wie zum Beispiel Zufallsbereich (0,3, 0,6), Die Werte sind auf einen bestimmten Bereich begrenzt. Auf diese Weise können wir eine Reihe neuer Farben erstellen, die immer noch "grün" sind oder welche Farbe wir auch angeben möchten.


Kippen des Baums (optional)

Dies ist nur eine kleine Änderung, aber trotzdem eine nette. Wir können dem Baum eine leichte Neigung zu einer Seite geben, wodurch das "sauber platzierte" Gefühl, das zuvor entstanden ist, beseitigt wird

transform.localEulerAngles.x = Random.Range (-10, 10);

Diesmal wird eine sehr kleine Drehung auf die x-Achse angewendet, wodurch der Baum in diese Richtung geneigt wird. Um sicherzustellen, dass zwischen den Wurzeln des Baums und dem Boden keine "Lücke" besteht, befindet sich der "Drehpunkt" (oder das Zentrum) der Baummaschen etwas oberhalb der Wurzeln, sodass genügend Wackelraum zur Verfügung steht.

Das gesamte Baumskript sollte so aussehen:

var treeMeshes: Mesh []; function Start () transform.localEulerAngles.y = Random.Range (0, 360); transform.localEulerAngles.x = Random.Range (-10, 10); transform.localScale = transform.localScale * Random.Range (0.5, 1.5); gameObject.GetComponent (MeshFilter) .mesh = treeMeshes [Random.Range (0, treeMeshes.Length)]; renderer.materials [0] .color = Farbe (Random.Range (0.8, 1.1), Random.Range (0.4, 0.6), Random.Range (0, 0.2)); renderer.materials [1] .color = Farbe (Random.Range (0, 0.4), Random.Range (0.6, 1.1), Random.Range (0, 0.4)); 

Sie können alles in dieser Demo ausprobieren:


Erstellen einer einfachen Prozedurebene

Mal sehen, wie sich diese in einem echten Spiel anfühlen.

Stellen Sie ein Flugzeug auf den Boden und vergrößern Sie es. Dies wird unser "Boden" für das Level sein. Erstellen Sie ein Bodenmaterial und weisen Sie es dem Boden zu. Stellen Sie den Skalierungsfaktor der Ebene auf 50,1,50, Wir haben also genug Platz.

Setzen Sie dann einen First-Person-Controller in die Szene ein. Es befindet sich in den Character Controllern, die zu Beginn des Lernprogramms importiert wurden. (Wenn Sie sie nicht haben, klicken Sie auf Assets> Import Package> Character Controller). Nachdem Sie die FPS-Controller platziert haben, entfernen Sie die Hauptkamera. Der Controller wird mit einem eigenen geliefert, so dass wir die Kamera in der Szene nicht mehr benötigen. Fügen Sie auch ein gerichtetes Licht hinzu.

Um Bäume automatisch zu erstellen, erstellen Sie eine neue JavaScript-Datei und benennen Sie sie treeGenerator.js. Fügen Sie den folgenden Code ein:

var treePrefab: GameObject; var numberOfTrees: int = 20; Funktion Start () für (var i: int = 0; i < numberOfTrees; i++) Instantiate(treePrefab, Vector3(transform.position.x + Random.Range(-40.0, 40.0), 0, transform.position.z + Random.Range(-40.0, 40.0)), transform.rotation); 

Lege das treeGenerator.js Skript auf dem Boden, ordnen Sie dem Baum das Fertighaus zu treePrefab variabler Slot und probieren Sie es aus:

Und fertig! Jetzt haben Sie ein einfaches Erkundungsspiel, das bei jedem Lauf ein einzigartiges Level schafft.

Weitere Verbesserungen

Das Spiel, das Sie haben, kann jetzt stark erweitert werden. Sie könnten weitere Pflanzen wie Palmen oder Büsche hinzufügen. Sie können andere Objekte hinzufügen, wie Steine ​​oder Äpfel. Oder Sie könnten eine Art Münze oder Pickups hinzufügen, die der Spieler überfahren könnte, um seine Punktzahl zu erhöhen.


Fazit

Prozedurale Berührungen sind eine einfache und effiziente Möglichkeit, Details automatisch zu erstellen. Anstatt zehn Objekte zu haben, könnten Sie haben unendlich viele.

Sie können die Elemente, mit denen wir gespielt haben, in Ihrem eigenen Spiel verwenden, oder Sie können sie auseinander nehmen und neu schreiben, um sie an Ihre eigenen Zwecke anzupassen. Ich habe zum Beispiel ein System entwickelt, das unterschiedliche Bambuslängen erzeugt:

Sie können Autos mit variablen Elementen herstellen oder Feinde automatisch in ein Level einordnen. Die Möglichkeiten sind endlos.