Aus dem Kurs: Game-Engineering mit Unity und C#

Organisation von 3D-Elementen

Diesen Mechanismus der Verallgemeinerung, 2 also dass wir generell Game Objects in der Szene haben und diese dann durch 3 entsprechende Komponenten konkretisieren, die findet sich auch im Code wieder. 4 Denn auch im Code können wir jetzt auf diese 5 Objekte zugreifen und da entsprechende Eigenschaften abrufen. 6 Das möchte ich dir jetzt mal zeigen. 7 Geh dazu auf den Project-Tab, auf den Assets-Ordner, und erzeuge mit Rechtsklick 8 »Create CSharp Script« ein neues Skript. Und das kannst du mal nennen 9 »Hello Game Object«. 10 Wichtig, wieder ohne Leerzeichen, 11 denn daraus entsteht ja hier unser Klassennamen. 12 Per Doppelklick dann wieder in Visual Studio öffnen. 13 Und dann können wir hier einfach mal einen 14 Test-Code einfügen, zum Beispiel in die Startmethode 15 können wir mal ausgeben »Debug.Log«, 16 und dann sagen wir »this.gameObject«. 17 Also wenn du »this.game«schon tippst, dann siehst du schon, 18 die Autovervollständigung kommt hier schon und schlägt dir schon »gameObject« vor. 19 Also dieses Objekt haben wir hier, 20 »gameObject.name« und hinten noch einen Strichpunkt. 21 Das »this« könnten wir hier weglassen, ich habe 22 es hier mal der Deutlichkeit halber noch mal reingeschrieben. 23 Also das »gameObject« hier, das ist ein 24 Feld von unserer Komponente und das kommt aus dem Mono Behavior. 25 Und das »this« können wir wie gesagt auch rausnehmen und dann kannst du hinten ».name« 26 schreiben, um eine Eigenschaft jetzt mal irgendwie dieses Game Objects darzustellen. 27 Name ist der Name, der im Inspektor 28 angezeigt wird und Game Object ist einfach der Verweis auf diesen Anker im 3D-Raum. 29 Wechseln wir zurück zu Unity. 30 Und dann haben wir unseren Würfel, wählen wir den aus und hängen an den Würfel das 31 Skript dran, in dem wir das "Hello Game Object" da drauf ziehen. 32 Ich ziehe dieses Skript auf den Cube zum Beispiel. 33 Man kann es auch hier in die Liste ziehen 34 und dann kommt hier unten "Hello Game Object". 35 Dann führen wir das aus mit Klick auf den Play-Button. 36 Und schauen mal in die Konsole und hier ist unser erster Text "Cube", 37 also das ist der Name unseres Würfels, den wir hier ausgegeben haben. 38 Und dann kommt noch das "Hallo Unity", das ist 39 noch hier von unserem anderen Skript, von dem "Hello Unity"-Skript. 40 Beenden wir den Play-Modus wieder mit 41 Klick auf das Play-Symbol und schauen noch mal zurück zu Visual Studio. 42 Ein typischer Fehler an der Stelle ist, 43 dass hier das »GameObject« großgeschrieben wird. 44 Das Ganze ist auch ein gültiger Begriff, ein gültiges Schlüsselwort, 45 deswegen wird das hier auch blau gezeichnet. 46 Also »GameObject«, 47 wenn wir drauf zeigen, dann zeigt uns Unity auch schon an, was es ist. 48 Die "Base Class for All Entities in Unity Scenes", also das heißt, die Klasse heißt 49 auch »GameObject«, aber eben mit großem G geschrieben. 50 Das heißt, das funktioniert so nicht, sondern kleingeschrieben 51 müssen wir das Feld von unserem Mono Behavior verwenden. 52 Deswegen also auch noch mal der Unterschied mit dem »this«, »this.gameObject«, 53 das ist quasi das Feld und das andere »GameObject« die Klasse. 54 Die könnten wir zum Beispiel brauchen, wenn wir ein neues Objekt erzeugen. 55 Schreib dazu mal »new GameObject« mit großem G. 56 Strichpunkt, alles speichern, und dann wechsel mal zurück zu Unity. 57 Dann führen wir das Ganze wieder mit Klick auf den Play-Button aus. 58 Und jetzt passiert folgendes: Unser Cube gibt nach wie vor seinen Namen "Cube" aus, 59 Name ist hier oben das hier, oder das, was in der Hierarchie erscheint, 60 und gleichzeitig ist hier ein "New Game Object" entstanden. 61 Und das ist das, was wir mit unserem Code erzeugt haben. 62 Wenn wir hier mal in den Szenen-Tab noch 63 mal reingehen, dann siehst du auch hier ist das neue Game Object, 64 da hängt aber noch nicht viel dran, 65 eigentlich nämlich gar nichts. 66 Wenn du das auswählst, dann siehst du, das ist quasi das minimale Game Object. 67 Das hat keine Komponenten, außer die 68 Transformkomponente, die wir immer brauchen, 69 und ansonsten ist es leer. 70 Das ist das Game Object, das wir hier per Code erzeugt haben. 71 Dieses Symbol hier, was hier erscheint mit der Diskette und diesem größer/kleiner-Zeichen, 72 das kann je nach Unity-Version hier erscheinen. 73 Das ist ein Element vom Visual Scripting. 74 Wenn du das loswerden willst, 75 dann kannst du folgendes machen: Geh auf Window, Package Manager. 76 Warte, bis das aktualisiert ist. 77 Geh dann hier auf den Eintrag 78 Visual Scripting. Wichtig, ausgewählt hier oben muss sein "In Project". 79 Hier gibt es mehrere Sachen, "In Project", das brauchen wir. 80 Und wenn hier Visual Scripting erscheint, dann wähle das aus und klick hier auf 81 "Remove", dann wird diese Komponente hier entfernt. 82 Ich weiß nicht, warum Unity das jetzt 83 standardmäßig in manchen Vorlagen rein nimmt. 84 Normalerweise ist das eigentlich ein 85 System, das man nur hinzufügen sollte, wenn man es auch braucht, finde ich. 86 Aber gut, es ist manchmal drinnen. 87 Dann muss man es halt rauslöschen. 88 Jetzt spielen wir das Ganze noch mal ab. 89 Und in der Scene-Ansicht ist jetzt hier unser "New Game Object" und 90 dieses Symbol hier erscheint auch nicht mehr, brauchen wir auch nicht. 91 Die Grundlagen, um Elemente in die Unity Game Engine einzuhängen, 92 sind Game Objects. Game Objects, haben wir vorher schon ausprobiert 93 hier, sind Elemente, die wir in die Szene hier einbauen. 94 Das sind quasi universelle Anker im 3D-Raum. 95 Das heißt, in erster Linie ist ein Game 96 Object einfach mal ein Punkt im Raum, an dem dann irgendetwas dranhängt. 97 Eine Unity Szene ist somit eine Sammlung 98 von Game Objects, die jeweils gewisse Eigenschaften haben. 99 Zum Beispiel die Raumeigenschaften, dass ist hier der Transformbereich. 100 Also wo befindet sich das Element im Raum? 101 Wie groß ist es und in welche Richtung ist es gedreht? 102 Und dann haben wir noch weitere Elemente, zum Beispiel Verarbeitungshinweise, 103 das ist ja so was wie der Name, 104 also wie soll das Objekt heißen oder ist es aktiv? 105 Das ist hier dieses kleine Häkchen. 106 Wenn das ausgeschaltet ist, ist das Objekt 107 quasi inaktiv, also wird nicht dargestellt in der Szene. 108 Und dann gibt es noch die Komponenten. 109 Das haben wir schon im ersten Teil gesehen. 110 Wir haben hier eine eigene Komponente 111 geschrieben und hier an das Objekt drangehängt. 112 Und das ist sozusagen die Grundlage von Unity. 113 Also alle Objekte, die hier in der Szene 114 erscheinen, müssen als Game Object organisiert werden. 115 Und ein Game Object hat immer so einen kleinen Bereich allgemeine Eigenschaften, 116 den Transformbereich, den können wir auch nicht löschen, 117 und dann eine offene Liste von Skripten 118 oder Komponenten, die dann ein gewisses Verhalten realisieren. 119 Wir können uns das Ganze auch noch mal an einem anderen Beispiel anschauen. 120 Wenn du hier zum Beispiel mal einen Würfel in die Szene einfügst. 121 Das kannst du machen, indem du in der Hierarchie mit der rechten Maustaste 122 klickst und dann zum Beispiel "3D Objekt" "Cube" auswählst, 123 dann wird hier ein Würfel erzeugt. Und 124 dieser Würfel ist jetzt kein elementarer Grundtyp, sondern das ist ein Game Object 125 mit entsprechenden Modifikatoren drauf, kann man sagen, mit entsprechenden 126 Komponenten, die dieses Game Object wie einen Würfel erscheinen lassen. 127 Wenn du hier mal in die Liste schaust, 128 dann haben wir hier wieder die Eigenschaften, wie alle Game Objekts. 129 Also wir haben hier oben den "Cube"-Name zum 130 Beispiel, hier diese Grundeigenschaften, dann das Transform. 131 Das gibt an, wo das Objekt hier im Raum 132 zum Beispiel gerade steht, wie es rotiert wird. 133 Wenn wir das drehen, hier zum Beispiel mal 134 einen Wert ändern, dann dreht sich das Ganze hier und so weiter. 135 Und jetzt kommen dann die Eigenschaften, 136 die dieses Objekt, dieses Game Object hier konkret zu einem Würfel machen. 137 Wir haben hier in erster Linie mal einen Cube, das ist der Mesh-Filter. 138 Das ist quasi der Generator, der diese 139 Punkte und Flächen im Raum hier generiert, die dann einen Würfel beschreiben. 140 Als zweites haben wir dann hier den Mesh-Renderer. 141 Der sorgt dafür, dass dieser Würfel auch 142 tatsächlich in der 3D-Szene dargestellt wird, also gezeichnet wird. 143 Und unten haben wir noch den Box Collider, 144 der ist dann wichtig für die Code-Auswertung, 145 sodass wir hier abfragen können, 146 zum Beispiel überschneiden sich Objekte 147 oder trifft ein Objekt auf ein anderes Objekt? 148 Das wird dann mit dem Collider berechnet. 149 In Unity sind die Elemente der Szene 150 hierarchisch organisiert, das heißt in dem Hiroki-Tab hier, 151 da können die Elemente auch untergeordnet werden. 152 Jetzt ist es noch so: Wir haben hier eine lineare Liste, 153 also alle Elemente liegen auf der gleichen Ebene. 154 Du kannst aber auch Elemente anderen unterordnen. 155 Wähle dazu hier mit der rechten Maustaste 156 "Create Empty", um hier mal ein Testobjekt zu erzeugen 157 und dann nimmst du den Würfel, den Cube, und ziehst den mal auf das Game Object. 158 Und jetzt liegt der Würfel unterhalb des Game Objects. 159 Was bedeutet das? 160 Das bedeutet, unser Würfel, der hat genau ein Elternobjekt und unser Game Object, 161 das hat momentan ein Kind, könnte aber mehrere enthalten. 162 Wir können hier also noch ein weiteres hinzufügen, Rechtsklick 163 "3D Object" und zum Beispiel hier mal die "Sphere", eine Kugel, hinzufügen, 164 dann haben wir hier noch eine Kugel. 165 Dieses Hiroki-Fenster, das zeigt und 166 bearbeitet eben diese Hierarchie, die hierarchische Anordnung. 167 Und was jetzt bei dieser hierarchischen 168 Anordnung das Besondere ist, ist die Vererbung der Eigenschaften. 169 Wenn du jetzt mal auf das Game Object klickst 170 und das bewegst, dann siehst du der Würfel 171 und die Kugel hier, die bewegen sich auch mit. 172 Die Kugel, die sieht jetzt so aus, als würde 173 sie hier liegen und wäre das Element, was hier verschoben wird. 174 Das liegt daran, dass die Kugel hier direkt auf dem Game Object liegt, 175 auf der gleichen Position. Wir können das mal verschieben, in dem du hier 176 auf dieses grüne Viereck klickst und dann ziehst. 177 So, und jetzt haben wir hier das Game Object, das liegt also hier im Raum. 178 Es ist unsichtbar, weil es eben ein 179 minimales Objekt ist, das nur diese Raumeigenschaften hat und noch keine 180 Komponenten, die eine Darstellung erzeugen würden. 181 Du kannst aber trotzdem dieses Element 182 verschieben und jetzt siehst du die Kinder, die verschieben sich jetzt quasi 183 mit, weil deren Position immer relativ zu dem Elternobjekt ist. 184 Genauso geht das dann auch mit der Rotation. 185 Wenn du hier oben auf das Rotationswerkzeug 186 wechselst, dann kannst du hier zum Beispiel drehen 187 und die Kinder, die drehen sich quasi um dieses Ursprungsobjekt hier herum. 188 Dieses Prinzip ist relativ einfach, aber 189 es ist essenziell wichtig, um komplexe Objektmechaniken zu realisieren. 190 Also zum Beispiel kennt man das bei der Animation, wenn man einen Ricking hat. 191 Das heißt, man baut ein mechanisches Skelett, das dann ein Modell steuert, dann 192 ist es wichtig, dass man diese hierarchische Abhängigkeit hat. 193 Bedeutet zum Beispiel, wenn ich einen Baum habe, ein Modell von einem Baum, und da 194 sind die Äste dran und da dran sind wiederum die Blätter. 195 Und all diese Elemente, Äste, Blätter und 196 so weiter, sind hier hierarchisch organisiert als einzelne Objekte, 197 dann muss es natürlich auch so sein, 198 wenn ich den Baum verschiebe, also den Stamm, dann sollen sich ja alle anderen 199 Elemente mit verschieben, und zwar relativ zu diesem Stamm. 200 Die Grundposition, der Grundaufbau, von dem 201 Baum soll erhalten bleiben, aber der Baum als Ganzes soll verschoben werden. 202 Und das geht zum Beispiel über diese hierarchischen Beziehungen.

Inhalt