Transkripte
1. Willkommen zur Godot 3D Masterclass!: Das Erstellen eines Drei-D-Spiels
mag komplex klingen, aber mit der richtigen
Struktur wird es zu
einem Prozess, den Sie Schritt für Schritt
angehen können Willkommen zum Godot D
Game Development-Kurs. Ich bin Steve Carstensen,
und in diesem Kurs werden
wir gemeinsam
mit Godot ein komplettes
Drei-D-Spiel entwickeln gemeinsam
mit Godot ein komplettes
Drei-D-Spiel Sie werden lernen, wie man in der Engine
arbeitet,
verstehen, wie
Drei-D-Szenen funktionieren, und anhand eines realen Projekts nach und nach
ein spielbares Spiel
zum Leben erwecken anhand eines realen Projekts nach und nach
ein spielbares Spiel
zum Leben erwecken Ich werde damit beginnen, zu lernen,
wie man in der
Godot-Oberfläche navigiert und
mit grundlegenden drei D-Objekten arbeitet Von dort aus werden Sie sich Physik,
Spielersteuerung, Kamera, Beleuchtung, Sound, Benutzeroberfläche und KI befassen, all den Kernsystemen, die ein Drei-D-Spiel zum Laufen
bringen Jedes Kapitel baut
auf dem vorherigen auf. Du wirst Schritt für
Schritt Panzer,
Umgebungen, Gegner
und Spielsysteme erstellen und dabei nicht nur
lernen, was zu tun ist,
sondern auch, warum die Dinge
so funktionieren, wie sie in Gdo Dieser Kurs richtet sich an
Anfänger und
Fortgeschrittene benötigen keine Vorkenntnisse mit Godot oder der Entwicklung von
Three-D-Spielen Wir beginnen mit
den Grundlagen und bauen alles zusammen Am Ende des Kurses
verfügen Sie über ein vollständig spielbares
Drei-D-Spiel
und, was noch wichtiger ist, über
eine solide Grundlage, auf der Sie Erstellung
Ihrer eigenen Projekte beginnen
können Lass uns anfangen.
2. Installation von Godot: In dieser sehr kurzen Lektion werden
wir die GDOGame-Engine herunterladen und
installieren, die wir für den Rest
dieses Kurses
verwenden werden für den Rest
dieses Kurses
verwenden Öffnen Sie also Ihren
Browser und gehen Sie zu G DO engine.org Sie können es auch bei Steam herunterladen, und zum Zeitpunkt
der Aufzeichnung dieses Kurses ist
die neueste Version 43. Also klicken wir einfach
darauf und wir gehen
zur GDOEngine und du bekommst sie für dein entsprechendes
Betriebssystem Jetzt werden wir die Net-fähige Version nicht verwenden
, also besorgen Sie sich einfach die
Standard-Gudo-Engine Die netzfähigen Binärdateien ermöglichen es
Ihnen, C SAP zu verwenden, aber da wir in
diesem Kurs
GD-Skript verwenden werden, könnte
das die Sache
etwas verwirrend machen,
da es sich um zwei völlig
unterschiedliche Sprachen handelt diesem Kurs
GD-Skript verwenden werden, könnte
das die Sache
etwas verwirrend machen da es sich um zwei völlig
unterschiedliche Der
C-Sharp-Code und die Funktionsaufrufen
auf der API und all diese Dinge sind
sich jedoch sehr ähnlich Wenn Sie
also eine kleine
Herausforderung suchen und versuchen möchten,
GD-Skript in Ihrem Kopf
mental in C
Sharp umzuwandeln ,
GD-Skript in Ihrem Kopf
mental in C
Sharp , können
Sie das tun, aber
ich übernehme keine
Verantwortung für den Irrsinn , der
dadurch entsteht. Also, lass uns GDOFurt drei holen. Und Gadot benötigt
keinerlei Installation. Sie können es einfach herunterladen und die ausführbare Datei kopieren,
wo immer Sie möchten Sie können es also auf Ihren
Desktop oder was auch immer legen. Ich werde
es bei all meinen anderen Gadot-Installationen behalten und bin gleich wieder
bei Ihnen
3. Projektübersicht: Zone Battle: In den Lektionen
dieses Kurses lernst
du, wie du
dieses
Panzerkampfspiel im Retro-Stil nachbauen kannst, das dem klassischen
Battle Zone-Spiel
ähnelt, das von
Atari veröffentlicht wurde Wir beginnen mit den Grundlagen der
Erstellung eines Panzers,
einer Drei-D-Arena, Bewegung des Panzers durch Benutzereingaben
und der Erstellung eines
konfigurierbaren Spawn-Systems
mit KI-gestützten Feinden, und der Erstellung eines
konfigurierbaren Spawn-Systems mit KI-gestützten Okay, nachdem das geklärt ist, fangen wir an. Wenn du Gado zum ersten Mal startest, wirst
du den
Projektmanager sehen Und das gibt dir eine Liste
aller Projekte, die dir zur Verfügung stehen und an denen du
bereits gearbeitet hast Oder wenn Sie gerade mit
einer Neuinstallation
beginnen , haben
Sie nichts. Also werde ich
ein neues Projekt erstellen . Sie
können also entweder eines erstellen. Sie können eines
von einem bestimmten Ort importieren, vielleicht aus einer früheren
Version von Gadot oder einem anderen Ort, den
Gado nicht überwacht, oder Sie können einen
bestimmten Ort
nach Projekten durchsuchen , die möglicherweise
bereits existieren Wir werden also erstellen und wenn Sie ein neues Projekt erstellen, haben
Sie die Möglichkeit, ihm einen Projektnamen
zu geben Also werden wir
unseren Zone Battle nennen. Und wir werden einen Ordner dafür
erstellen. Und das bedeutet, dass es in den Ordner
geht,
in dem wir ihm
sagen, dass es unser Projekt ablegen soll, und dann
einen Unterordner erstellt, der speziell nach dem Projekt
benannt ist den Ordner
geht,
in dem wir ihm
sagen, dass es unser Projekt ablegen soll , und dann
einen Unterordner erstellt , sodass wir uns keine
Sorgen machen müssen, versehentlich zu
versuchen, ein Projekt
und einen Ordner zu erstellen , in dem sich
bereits Inhalte Also werde ich
das ändern und ich werde es woanders ablegen Es wird in
Larngdo Three D gespeichert und wir werden ihm einen neuen Ordner
geben Eigentlich
müssen wir ihm keinen
neuen Ordner geben, weil wir einen erstellen
werden Also wählen wir einen neuen Ordner und es wird Larndo
Three D heißen und dann Zone Battle, was der Name
unseres Projekts ist Für den Renderer hängt
das also von der Plattform ab, auf die
Sie abzielen Kompatibilität bedeutet also, dass es auf so ziemlich allem
laufen sollte Und dann
ist Mobile natürlich für mobile Geräte. Das Rendern und die verschiedenen Effekte und die verschiedenen
unterstützten Funktionen von Three D
werden auf
Mobilgeräten tendenziell reduziert ,
da sie nicht
so leistungsstark sind wie PC-Hardware Wenn Sie also
auf Telefone abzielen,
insbesondere auf Telefone der unteren Preisklasse, sollten Mobilgeräte
verwenden, und das wird
Ihnen genau hier angezeigt. Es unterstützt also
Desktop- und Mobilgeräte. Die drei D-Grafiken
sind weniger fortschrittlich, sie sind weniger skalierbar,
so weiter und so fort. Wir werden uns für Forward entscheiden , weil wir auf einem Desktop
entwickeln werden. Und nebenbei würde ich nicht
empfehlen, diesem
Kurs zu
folgen , wenn Sie
versuchen , Gadot
auf einem Android-Gerät auszuführen, insbesondere wenn es sich um ein Telefon handelt Sie werden das Beste aus
diesem Kurs herausholen , indem Sie auf einem Desktop
arbeiten Nachdem das geklärt ist, belassen
wir unsere
Versionskontroll-Metadaten bei Git. werden wir eigentlich nichts diesem Kurs werden wir eigentlich nichts
mit Virgin Control
machen. Aber wenn Sie
Ihre Daten später in die
Quellcodeverwaltung hochladen möchten Ihre Daten später in die
Quellcodeverwaltung , um sie zu sichern, sind
die Daten bereits da. Also erstellen
wir jetzt einfach Ed Okay. Jetzt, wo wir unser
Projekt erstellt und geladen haben, werden
wir uns mit
den Grundlagen der
Gadot-Benutzeroberfläche befassen Und dafür kannst du in der nächsten Lektion mit
mir zusammen sein, und wir werden lernen, wie
die verschiedenen Windows funktionieren, und dann können wir mit unserem Spiel beginnen
. Sehen wir uns dort?
4. Navigieren in Godot: Hauptfenster, Szenenbaum und Inspektor: Willkommen zurück. Nachdem Sie Ihre Projektdatei
erstellt haben, müssen
wir uns
mit der
Godot-Entwicklungsumgebung vertraut machen mit der
Godot-Entwicklungsumgebung Im Hauptfenster hier wird der Großteil Ihrer Entwicklung stattfinden,
und es
ist wichtig genug, dass wir ihm eine eigene Lektion geben In der darauffolgenden Lektion werden wir also besprechen, wie Sie in diesem Fenster
navigieren können. Als Nächstes kommt das Dateisystem. Der Ressourcenordner
im Dateisystem stellt Ihren
Stammprojektordner dar. Und wir können dies überprüfen, indem rechten Maustaste darauf klicken und Open File Manager
auswählen. Und Sie werden sehen, dass wir direkt zu
dem Zone Battle-Ordner
gelangen dem Zone Battle-Ordner , den wir erstellt haben, als wir unser Projekt
gestartet haben. Hier ist unser Projektpunkt GadoFle , der die physische
Projektdatei ist, und hier ist der Symbolpunkt SVG
, der hier erscheint. Alle Dateien, Ressourcen,
Skripte, Szenen, was auch immer Sie entweder
in diesen Ordner ziehen oder direkt in diesem Ordner
speichern, solange Gadot weiß, was sie
sind und weiß, wie man
sie importiert , werden hier
in Ihrem Dateisystem angezeigt Sie können
hier sogar
neue Ordner erstellen und Ihr
Projekt nach Ihren Wünschen organisieren Als nächstes kommt der Szenenbaum. Im Szenenbaum verfolgen wir
die Hierarchie der Knoten, aus
denen die Hierarchie der Knoten, aus sich die Szene zusammensetzt, in der wir
gerade arbeiten. Alles in GaDo wird durch Szenen
dargestellt, und Szenen sind lediglich
Sammlungen von Knoten Knoten selbst sind einfach kleine oder manchmal nicht
so kleine Komponenten die verschiedene Dinge tun, und alles, was Sie
möglicherweise in
einem GadoGame verwenden möchten , wird
durch einen Knoten repräsentiert Wenn wir also zum Beispiel
nur ein Drei-D-Objekt wollen, nur ein Drei-D-Objekt das durch eine
Position im Drei-D-Raum repräsentiert wird, könnten wir
hier einen Wurzelknoten erstellen, und das würde
uns einen Knoten drei D geben, und ein Knoten drei D ist buchstäblich nur eine Position im
Drei-D-Raum, was wir
natürlich noch nicht
wirklich besprochen haben, also wird
das keinen Sinn ergeben. Aber darüber hinaus können
wir weitere Knoten
darunter als
untergeordnete Knoten dieses Knotens hinzufügen , denn an der Basis
jeder Szene befindet sich ein Wurzelknoten, und dann gibt es eine Reihe von Knoten, die
darunter angehängt sind, und all diese
bilden Ihre Szene. Wir können also
eine ganze Reihe
davon erstellen und sie werden alle
als Teil dieser Datei betrachtet. Wir
werden uns in
zukünftigen Lektionen definitiv eingehender mit der Verwendung
des Szenenbaums befassen und uns mit der Hierarchie von Knoten
usw. befassen. Aber vorerst sollten Sie wissen, dass alles, was sich in
Ihrem GodObject befindet , in
diesem speziellen Baum dargestellt und
gespeichert und angezeigt wird Schließlich müssen wir über den Inspektor
sprechen. Mit dem Inspektor können Sie
alle sichtbaren Daten
in jedem Ihrer Knoten ändern . Da zum Beispiel ein Knoten mit drei D eine
Position im Drei-D-Raum ist, können
wir seine Position,
seine Drehung und seinen Maßstab ändern . Wir können ihn also so verschieben und
so weiter, und Sie werden sehen, dass der
Wert hier aktualisiert ist. Aber wenn wir das direkt
ändern wollten, könnten wir das auch tun. Und das gilt für
so ziemlich jede Art von Knoten, die
Sie möglicherweise haben könnten. Wenn wir also zum Beispiel etwas anderes
wie eine Kamera
hinzufügen wollten , können
Sie jetzt sehen, dass die Kamera
über einen eigenen Datensatz verfügt. Da eine Kamera aber
auch ein Knoten drei D
ist, stehen ihr zusätzlich zu all ihren kameraspezifischen
Daten alle Daten für
Knoten drei D zur Verfügung. Also auch hier
ist alles, was Sie
für einen vorhandenen Knoten
ändern möchten , in diesem Fenster verfügbar. Und wir
werden dieses Fenster
ausgiebig nutzen , um
die Informationen unserer Knoten
festzulegen die Informationen unserer Knoten und sie
beim Debuggen zu untersuchen. Apropos
Debuggen, hier unten sehen
wir eine Reihe von Tabs, die derzeit nicht erweitert
sind, aber einer davon ist der Debugger, und er ist äußerst nützlich,
und wir
werden ihn auf jeden Fall verwenden, wenn die Zeit gekommen Hier unten haben Sie auch
Audioanimations- und Shader-Editoren sowie die Jede Ausgabekonsole ist
nützlich, wenn Sie
Inhalte auf der Konsole wiedergeben möchten ,
während das Spiel läuft, oder wenn Sie nach Fehlermeldungen oder ähnlichem
suchen möchten.
Da hast du es also. Das ist Gados Editor
auf den Punkt gebracht, und all die
verschiedenen Funktionen des Editors,
die
wir zur Erstellung unseres Spiels verwenden werden, werden
wir
in späteren Lektionen definitiv eingehender untersuchen in späteren Lektionen definitiv eingehender Und in der nächsten
Lektion werden
wir uns, wie versprochen, das
Editorfenster ansehen Also werde ich dich dort sehen.
5. Navigieren in Godot: Das Spielfenster und grundlegende Navigation im 3D-Weltraum: Mm. Willkommen zurück.
In dieser Lektion werden
wir uns mit den Grundlagen der
Navigation in
Godos Drei-D-Raum befassen . Außerdem werden wir uns mit einigen Möglichkeiten
befassen
, wie Sie die Viewport-Fenster konfigurieren
und
die Dinge
so ausrichten können Viewport-Fenster konfigurieren
und
die Dinge
so ausrichten , dass Sie sehen können, was Sie gerade tun und wie
Sie Das Erste, was ich erwähnen
werde, ist, dass der Großteil dieser Steuerelemente
sowie alle
Tastenkombinationen, sowie alle
Tastenkombinationen die wir
während dieses Abenteuers stoßen könnten, im Grunde dieselben sind
wie für Blender. Sie
können dies
unter anderem anpassen, wenn Sie unter Editor-Einstellungen zu Editoren, drei D
und Navigation
gehen und Navigation werden
nicht nur die verschiedenen Einstellungen angezeigt, sondern es gibt auch eine Option Dort werden
nicht nur die verschiedenen Einstellungen angezeigt,
sondern es gibt auch eine Option
namens
Navigationsschema, mit der Sie es von Gdolablender auf Maya oder Modo ändern
können , wenn diese für Sie
komfortabler sind. Es gibt auch Tastenkombinationen
, die Sie ebenfalls ändern können, aber darauf
werden wir nicht näher eingehen. Was wir
hier lernen werden, reicht aus, um Ihnen den Einstieg zu erleichtern,
und dann können Sie
sich nach
Belieben eingehender mit
den Kontrollschemata befassen, da sie ziemlich tiefgreifend sein
können Das Erste
, was wir uns
merken werden, ist, wie man dieses Fenster
umgehen Und das Erste, was Sie tun können ist, die rechte Maustaste gedrückt Dadurch wird
Ihre View-Kamera anhand ihrer
Position im Drei-D-Raum ausgerichtet Wenn Sie dann die mittlere Maustaste gedrückt
halten, wird
die Kamera umkreist. Und schließlich, wenn Sie die Kamera bewegen
müssen, können
Sie die Umschalttaste gedrückt halten und die mittlere Maustaste
verwenden Dadurch wird
Ihre Kamera bewegt Eine Kombination dieser
drei Dinge ermöglicht es Ihnen also, Ihre Kamera so
auszurichten, dass Sie sehen
können, was auch
immer Sie gerade betrachten Sie haben auch dieses kleine Gizmo in der oberen
rechten Ecke
Ihres Bildschirms,
mit dem Sie
schnell zu einer
bestimmten Ausrichtung wechseln können schnell zu einer
bestimmten Ausrichtung wechseln Wie Sie also sehen können, wenn ich
auf das X, das Z oder das Y klicke, wird
es sofort so , dass die Achse direkt
auf mich zeigt und die anderen beiden ebenfalls ausgerichtet
sind Auf diese Weise können Sie auch auf
einen Blick erkennen, wie Ihre
Ausrichtung ist, wenn Sie sich nicht unbedingt an
die Farben der Achsen erinnern. Die Z-Achse ist also blau, die rote Achse ist X und die
grünlich-gelbe Achse ist Y. Wenn ich mir das schnell ansehe, kann
ich erkennen, dass Y gerade nach
oben und unten verläuft , sodass ich gerade
nach unten schaue Und das wird
durch diesen kleinen
Indikator hier, der oben orthogonal ist
, noch verstärkt durch diesen kleinen
Indikator hier, der oben orthogonal ist
, oben orthogonal ist
, Das bedeutet, dass ich im Blick habe, was
auch immer ich gerade
betrachte , weil ich auf der Y-Achse nach unten schaue Und wenn wir dann
noch einmal darauf klicken, wird nichts passieren. Ähm, und jetzt sind
wir ganz unten. Also, wenn ich das für
X anklicken würde, würde das auch so sein. Und wenn ich dann darauf klicke,
was das Gegenteil von Z ist
, rückt es in
den Vordergrund, was bedeutet, dass wir es von hinten
betrachten. Sie können also auch
diese Ausrichtungen ändern ,
anstatt mit
diesem kleinen Steuerelement zu spielen , indem Sie mit der linken
Maustaste auf die drei Schaltflächen oder die
drei Punkte in der Ecke Und jetzt können Sie
eine dieser Ansichten auswählen, und Sie können auch die
verschiedenen Tastenkombinationen
für diese Ansichten sehen , falls Sie schnell zu ihnen wechseln
möchten Wenn ich also nach links gehen möchte, kann
ich das von links auswählen Und wenn ich nach hinten gehen möchte, kann
ich
das von hinten auswählen und so weiter. Dabei wird auf die sogenannte
orthogonale Ansicht umgeschaltet ,
was im Grunde bedeutet, dass
Sie geradeaus schauen und keine
Tiefenberechnungen berücksichtigt werden Wenn Sie also in die perspektivische Ansicht
wechseln, können
Sie normalerweise die perspektivische Ansicht sehen Und das ist im Grunde
Mathematik. Wenn Sie darüber
nichts wissen, müssen
Sie
sich darüber keine Gedanken machen. Im Allgemeinen werden
Sie neun von
zehn Fällen in der perspektivischen
Ansicht
arbeiten , weil Sie dadurch die realistischste Vorstellung
von dem haben, was Sie sehen. Im Grunde genommen wissen Sie, wann
Sie die orthogonale Ansicht verwenden
müssen, sobald Sie besser
mit drei D arbeiten können,
und Sie können
zur Ansicht wechseln Wenn ich versuche, Ihnen zu sagen,
unter welchen Umständen orthogonale Ansichten verwendet werden, werden
Sie es wahrscheinlich nicht verstehen Machen Sie sich also vorerst keine Gedanken
darüber. Arbeiten Sie perspektivisch und
alles wird großartig. Und wir haben auch die Möglichkeit mehrere Viewports bereitzustellen Wenn ich hier also auf die
kleine Ansichtsschaltfläche klicke, habe ich die Möglichkeit, mein Fenster in
zwei oder drei oder sogar
vier Viewports
aufzuteilen zwei oder drei oder sogar
vier Viewports Und sobald ich eine
Kamera in die Welt gesetzt habe und wir in der Lektion über Kameras sehen werden, wie das funktioniert, werde
ich
in der Lage sein, eine
dieser Ansichten so zu ändern , dass sie
mir zeigt, was meine Kamera sieht Auf diese Weise kann
ich arbeiten und
verstehen, kann
ich arbeiten und was der
Spieler sehen wird und
wie sich meine Änderungen auch
auf den Spieler auswirken. Wenn wir also auf „Zurück“ klicken, kehren
wir zu Viewport 1 zurück Und ja, das sollte uns genügen. Jetzt, wo wir in unserer Drei-D-Welt
herummanövrieren können, zeige
ich Ihnen, wie Sie
unseren Freund des Würfels
tatsächlich
im Drei-D-Raum manövrieren können, aber das wird eine Lektion für
sich sein . Ich
werde dich dort sehen
6. Primitive und 3D-Raum – Rotation, Skalierung, Translation: Willkommen zurück. Wir sind jetzt an dem Punkt angelangt, an dem
wir beginnen können die Manipulation von Objekten
in einem Raum mit drei D zu untersuchen. Und zum Glück müssen
wir diese Objekte nicht wirklich selbst
erstellen. Wenn wir nicht
drei D-Modelle verwenden, die
wir entweder selbst erstellt haben oder die woanders
erstellt wurden, können
wir zumindest drei D-Modelle verwenden, die
wir entweder selbst erstellt haben oder die woanders
erstellt wurden, Dinge mit
sogenannten Primitiven herausarbeiten ,
um Platzhalter bereitzustellen Und
genau das werden wir
vorerst
tun , nämlich unsere Objekte
aus Platzhaltern zu erstellen Der allererste Platzhalter
, dessen Verwendung wir lernen
werden, ist also , dessen Verwendung wir lernen
werden, die Mesh-Instanz Und technisch gesehen
ist die Mesh-Instanz kein Platzhalter,
aber sie bietet
Platzhalter-Primitive aber sie bietet
Platzhalter-Primitive Wir könnten also entweder
eine neue Drei-D-Szene mit
einem Knoten mit drei D an der
Wurzel erstellen oder wir könnten zu einem anderen Knoten
gehen und
die Mesh-Instanz drei D auswählen, und genau das werden
wir tun Also, was genau haben wir hier gemacht? Nun, wir haben eine neue Szene erstellt, und an der Wurzel dieser Szene befindet sich eine
Mesh-Instanz mit drei D-Knoten. Nun, der Knoten der Mesh-Instanz mit
drei D ist nicht
nur schwer zu sagen, es ist auch ein Knoten mit drei D, was bedeutet, dass er
eine Position und Ausrichtung
im Drei-D-Raum hat , aber auch
zusätzliche Werte hat. Und einer dieser Werte
ist die Netzeigenschaft. Wenn wir also dieses Drop-down-Menü erweitern, sehen
wir all diese verschiedenen
Netze, die wir erstellen können Und das, was wir
wollen, ist New Box Mesh. Bum. Jetzt haben wir eine Kiste. Wenn wir keine Schachtel wollten, könnten
wir daraus eine Kapsel oder ein Quad machen,
was eine ausgefallene Art ist, ein flaches Rechteck zu
sagen. Wir haben auch ein Prisma, das ein Dreieck ist Also ja, das wird uns
ermöglichen,
eine ganze Reihe verschiedener Arten
von Brunnen zu bauen eine ganze Reihe verschiedener Arten
von , es gibt sogar einen Stier Das ist ein netter.
Ich habe einen Donut Lass uns ein paar Donut-Tanks machen. Das wird saukomisch aussehen. Vielleicht mache ich mir gegen
Ende des Kurses ein paar Luftkissenfahrzeuge zu
Feinden Wie dem auch sei, lass uns zu unserer Box
zurückkehren. Das gibt uns einen Würfel und
das ist eine wunderbare Sache. Wenn wir nun auf
den Würfel selbst klicken, öffnet sich das Netz und wir können
Dinge daran ändern. Und bevor wir
das tun, müssen wir beachten,
dass diese Mesh-Objekte,
ob es sich nun um dass diese Mesh-Objekte, ein
Zylindernetz, ein einfaches Netz was auch immer handelt, es sich um eine so
genannte Ressource handelt. Gadot arbeitet also tatsächlich mit zwei verschiedenen Arten von Objekten Einer ist ein Knoten, und das ist ein Ding, das in Ihren Szenenbaum aufgenommen wird
, und das andere ist eine Ressource Und eine Ressource ist im Grunde
eine ausgefallene Sammlung von Daten. Und manchmal benötigen wir
Ressourcen innerhalb unserer Knoten. So benötigt beispielsweise eine Mesh-Instanz
Three D ein Mesh. Was ist ein Mesh? Nun, ein Mesh ist eine Sammlung von Punkten und Gesichtern, die uns, wenn sie von
der Gadot-Game-Engine gerendert werden, einen Würfel sehen
lassen, und diese Daten werden in einer Datei gespeichert, die unsere Mesh-Ressourcen darstellt Etwas mehr oder weniger verwirrend
wäre Icon Dot SVG Eine SVG-Datei ist eine Bilddatei. Und was ist eine Bilddatei, aber nur ein paar Bits,
die das bestimmen Nun, im Fall einer SVG-Datei ist
es eigentlich Vektorgrafiken. Aber wenn es eine Bitmap wäre, wäre
es eine Sammlung von Daten,
die die Farben und
die Positionen und einige andere
Werte innerhalb der Bitmap angeben Also würden wir
diese Bitmap-Datei
für Texturen oder Sprites
oder irgendetwas anderes benötigen für Texturen oder Sprites
oder irgendetwas anderes Das
Sprite wäre also zum Beispiel der Knoten
und es würde eine Bitmap-Ressource benötigen Das ist eine ausgefallene Art zu sagen
, dass Mesh ein Mesh benötigt und ein Mesh eine Ressource ist, und so machen wir es Wir werden später im
Kurs
Ressourcen erstellen , wenn wir
an unseren Benutzeroberflächen
und ähnlichen Dingen arbeiten . Aber wir haben jetzt Dinge, die wir als Teil
der Ressource ändern können. Wenn wir also ihre Größe
in X- und Z-Richtung ändern wollen , sie
zum Beispiel zu vergrößern, können wir das tun. Und wieder haben wir
hier unseren
kleinen kreisförmigen Pfeil , um die Dinge wieder
normal zu machen, wenn wir es so wollen. Und wir haben auch Dinge, die
auf Texturierung hinweisen können , und eine
Menge anderer Dinge, die
wir uns später ansehen werden, aber wir werden es wahrscheinlich nicht innerhalb
des Meshs selbst
ändern Wir werden es woanders
ändern. Aber jetzt, wo wir einen Würfel haben, können
wir ihn ausrichten
und verschieben. Und als Erstes erweitern
wir die Transformationseigenschaft des dritten Knotenteils D der
Mesh-Instanzdaten innerhalb
des Expetors
und
schauen uns Position,
Rotation und Skalierung an Diese drei Gruppen
von Zahlen
bestimmen die Position,
Drehung und Skalierung der
Würfel innerhalb des Weltraums Die Position eines Objekts
im Weltraum wird auf drei Achsen angezeigt, die durch Linien dargestellt werden Wie Sie
hier sehen können, verläuft die rote Linie, das X von links
nach rechts, die Z-Linie, die blau ist, geht in Richtung Horizont,
und dann die
gelblich-grünliche Linie, die Y-Achse,
verläuft nach und dann die
gelblich-grünliche Linie, die Y-Achse, oben oder unten Wenn Sie den Wert in einer
dieser Achsen oder auf einer
dieser Achsen ändern, ändert sich die Position des
Objekts im Raum Im Moment befindet es sich also am sogenannten
Ursprung, also im Totpunkt
, Null, Null, Null, Null, Null,
wie Sie sehen können. Wenn wir das Objekt nun nach oben
bewegen wollten, könnten
wir sein Y
zum Beispiel auf eins ändern , und
jetzt hat es sich bewegt. Wir können
seine Position auch mit
diesen Pfeiltasten ändern . Im Moment
sehen wir also tatsächlich alle Steuerelemente, die für dieses Objekt verfügbar sind
, sodass wir damit machen können
, was wir wollen Aber wir können
die Steuerelemente mit diesen
Schaltflächen hier oben auch einschränken die Steuerelemente mit diesen
Schaltflächen hier oben Wenn wir also nur unser Objekt bewegen
wollen, würden
wir auf diese Schaltfläche klicken,
um es in den Verschiebemodus zu versetzen würden die
anderen Drehsteuerungen ausgeblendet, was bedeutet, dass
wir es nicht
drehen könnten, wir könnten es hier nur entlang der Achse
bewegen. Die Pfeile sind also ziemlich
selbsterklärend, aber was leicht verwirrend ist,
sind diese kleinen Und diese Rechtecke sind eine kurzlebige Methode, um etwas entlang
einer bestimmten Ebene zu bewegen Also zum Beispiel dieser hier,
dieser blaue, bewegt das Objekt in
Bezug auf
die X- und Y-Koordinaten
oder im Grunde entlang der horizontalen Ebene, die
diese beiden Achsen bilden Also lasst uns das wieder auf Null setzen. Und wenn ich anfange, sie zu
verschieben, können
Sie sehen, dass sich
meine X- und Y-Werte
hier im Inspektor ändern. Wenn ich dasselbe
mit diesem grünen machen würde, wäre
es auf der X
- und der Z-Achse und das Gleiche gilt für das Rot auf der Y- und
der Z-Achse Das bietet also eine schnelle Möglichkeit das Ding in eine
bestimmte Ausrichtung zu bewegen Wenn Sie also beispielsweise etwas einfach
auf dem Boden herumschieben möchten, ohne es
versehentlich in die Luft zu
ziehen, könnten
Sie es entweder
so oder so
bewegen,
je nachdem, in welche
Richtung Sie schauen Und es wird ein bisschen
einfacher,
eines dieser Dinge auszurichten , wenn
Sie in eine
bestimmte Richtung schauen, und jetzt kann ich DS wählen Änderung der Position eines
Objekts im
physikalischen
Drei-D-Raum wird also als
Translation bezeichnet und wird hier
durch die Positionseigenschaft repräsentiert . Darüber hinaus, und wir
werden
sie uns in Zukunft etwas
genauer ansehen , wird eine Sammlung
mehrerer Werte wie X, Y und Z als Vektor bezeichnet. Und wir
werden alle möglichen Arten von
Mathematik mit
Vektoren machen, um Dinge zu bewegen und physikalische Berechnungen und alle
möglichen anderen lustigen Dinge durchzuführen. Aber damit werden wir uns in einer späteren Lektion befassen. Schritt ist Rotation, und die
Drehung kann mit
dem Rotationsmodus eingestellt werden oder einfach, wenn Sie diesen Modus wieder in den
Auswahlmodus
versetzen , sodass Sie
alles tun können, was auch immer Sie tun können, um sie alle
neu auszurichten Aber gehen wir zurück
zum Rotationsmodus. Im Drehmodus können Sie das Objekt
entlang der drei Achsen drehen. Wenn ich also
um die X-Achse drehen wollte ,
würde ich diese rote verwenden. Und wenn ich es dann um
die gelbe Achse manövrieren
wollte , würde
ich die gelbe
Achse verwenden, und dann ist Blau natürlich die Z-Achse Und eine Sache, die Ihnen
auffallen wird Wenn Sie mit der Maus über
diese Tasten fahren, werden
Sie feststellen, dass dort
Hotkeys angezeigt werden, mit denen
Sie zusätzliche
Funktionen nutzen Wenn
wir also zum Beispiel den Regler gedrückt halten und dann versuchen würden ,
das Ding zu
drehen, würde
es im Raster einrasten Wie Sie sehen können, dreht es sich also
nicht gleichmäßig. Es springt von
Punkt zu Punkt. Und das ist etwas offensichtlicher, wenn wir
zum Verschiebemodus zurückkehren würden, weil jeder dieser
Rasterschnittpunkte eine Koordinate auf dem Gitter
ist Wenn ich also die Strg-Taste gedrückt halte
und das Objekt jetzt hierher verschiebe, werden
Sie sehen, dass es die Mitte des
Punktes dort
einrastet, was 000 minus eins ist, schätze
ich, in Z-Richtung Ja, nun ja, Null,
Null, Eins, eigentlich, denn positives Z
geht auf
dich zu und negatives Z geht
zurück in den Horizont Wir. Aber wie Sie sehen können, hängt es
hier von den
einzelnen Rasterpositionen ab , ganze Zahlen Und das Einrasten können Sie natürlich
ändern. Nun, nicht da,
aber Sie können
das Snapping in
Ihren Editor-Einstellungen ändern das Snapping in
Ihren Editor-Einstellungen Das ist es nicht. In Ordnung,
lass uns zurückgehen Und schließlich haben wir den Maßstab, und der Maßstab ist irgendwie seltsam,
weil der Maßstab die Größe
eines Objekts auf eine
bestimmte Weise verändert eines Objekts auf eine
bestimmte Weise Im Moment sind also
alle drei gesperrt. Wenn ich also einen
von ihnen ändere, werden sich auch die
anderen ändern, was bedeutet, dass er
gleichmäßig in
alle Richtungen skaliert wird gleichmäßig in
alle Richtungen skaliert Wenn ich die Verknüpfung aufhebe,
indem ich auf diese Schaltfläche hier
klicke, kann ich sie einzeln ändern,
was bedeutet, dass ich sie entlang
einer bestimmten Achse dehnen oder
quetschen kann bestimmten Achse dehnen oder
quetschen Das Problem dabei ist nun, dass
diese Werte die hier definierten
Werte verändern Wenn ich also sage, dass mein Würfel eins nach dem anderen
war und ich ihn dann in X-, Y
- und Z-Richtung skaliere, sodass es
zwei und zwei ist , oh,
das hat nicht funktioniert. Und das liegt daran, dass
ich das hätte tun sollen , bevor ich wieder
auf sie verlinkt habe. Was passiert ist, dass
es eins nach dem anderen nimmt und es
um diesen Faktor in die Höhe treibt, sodass es
tatsächlich zwei mal zwei mal zwei ist. Wenn ich das nun
so ändern würde, dass X gleich zwei ist, wäre
es
jetzt funktionell vier S eins, zwei, drei oder eins, zwei, drei,
vier, weil es
die ursprüngliche Basisgröße des
Objekts mit dem Skalierungswert multipliziert die ursprüngliche Basisgröße des
Objekts mit dem Skalierungswert Und das wird verwirrend , weil das Skalieren von Objekten die Physik durchbrechen
kann , weil die physikalischen
Berechnungen annehmen, dass das Objekt eine Größe hat, obwohl
es aussieht, als wäre es eine andere Aber im Allgemeinen würden Sie
Skalierung verwenden, um ein Objekt zu korrigieren , das
bei
der
Erstellung in Blender oder was auch immer nicht auf den richtigen Maßstab eingestellt , das
bei
der
Erstellung in Blender oder was auch immer nicht auf den richtigen Maßstab eingestellt war . Generell gilt: Wenn
Sie ein Objekt erstellen, möchten
Sie, dass es innerhalb des Weltraums die richtige
Größe Diese Weltraum-Koordinaten , die wir hier an der Position sehen
und so weiter und so weiter, sind alle in Metern angegeben, aber das
ist völlig Wir könnten sie leicht als
Fuß oder Meter oder was auch immer betrachten Fuß oder Meter oder was auch immer Dem Computer ist das auf die eine oder andere Weise
egal. Er weiß nur, dass
dieser Wert eins ist, und das ist alles, was es ist. Aber wenn wir die Objekte
zum Beispiel
in unserer Modellierungssoftware erstellen , benötigen Sie
einen Referenzrahmen. Ein Mensch ist zum Beispiel etwas, das 1,5 Meter
groß ist , mehr oder weniger. Es tut mir leid. Ich komme aus den USA, es gibt
also diese verrückten
Messwerte, wissen
Sie, wir
kennen sie nicht. Aber sagen wir einfach,
ein Mensch war 1,6 Meter groß und ein Jet war
etwa 10 Meter lang. Nun, wenn Sie einen
Menschen und einen Jet in einem Blender modellieren würden, würden
Sie
sicherstellen wollen, dass der Mensch 1,6 Meter lang und der Jet tatsächlich 10 Meter lang ist
, damit Sie den Menschen in den Jet setzen können den Menschen in den Jet setzen und alles die richtige Größe hat. Nehmen wir an, aus
welchem Grund auch immer, der Modellierer hat den
Jet in einem anderen Maßstab geschaffen, vielleicht sollte es
eine Miniatur oder
so sein , und dann müssten Sie
ihn als Jet in voller Größe verwenden, und dann haben Sie die
beiden zusammen importiert, und die Person ist unendlich
größer als der Jet, Sie würden
den Menschen entweder verkleinern oder
den Jet vergrößern wollen , und hoffentlich
würde die Physik nicht kaputt gehen, ja, deshalb würdest
du generell Skalierung verwenden. In den meisten Fällen belassen Sie
die Skalierung jedoch bei eins und ändern dann die
Größe Ihrer Primitiven Zumindest werden
wir das tun. Das ist das am wenigsten
verwirrende von allen. Also hier sind
jeweils unsere Drehtasten, und dann haben wir auch
unsere Skalentasten, unsere Skalierungstaste hier oben. Wir könnten also auf
diese Weise skalieren , wie wir es
dort getan haben. Und dann funktionieren die
Rechtecke natürlich genauso. Anstatt es zu verschieben, wird
es nur skaliert Also ja, so manipuliert
man die Grundausrichtung und weiter eines
Drei-D-Objekts im Drei-D-Raum Und in unserer nächsten Lektion werden
wir uns Materialien
ansehen, und dann werden
wir
einen Panzer bauen und anfangen, den Panzer zu bewegen, indem wir das Zeug verwenden, das wir hier gelernt haben.
Also
werde ich dich dort sehen.
7. Materialien: Willkommen zurück. In dieser Lektion werden
wir
uns kurz den grundlegenden Funktionen
eines Netzmaterials befassen Material ist eine Ressource
, die im Grunde viele verschiedene Aspekte
des Aussehens eines Objekts definiert viele verschiedene Aspekte
des Aussehens ,
von seiner Textur seine Beleuchtung
bis hin zu seiner Transparenz und vielen anderen Dingen Dough ermöglicht eine Reihe
verschiedener Effekte
, für deren Erstellung Sie normalerweise einen
Shader verwenden
müssten Aber aufgrund der Leistungsfähigkeit ihrer Materialien
müssen Sie sich darüber keine Gedanken machen Lassen Sie uns also ein
Material zu unserem Objekt hinzufügen, und wir können einfach auf
das Netz klicken , um die Eigenschaften
des Netzes zu öffnen. Und etwa auf halber Strecke
sehen Sie, wie das Material herunterfällt,
und wir werden sehen Sie, wie das Material herunterfällt, ein neues Standardmaterial mit
drei D erstellen . Wie Sie sehen können, gibt es drei verschiedene
Materialtypen Shader-Material müssen
Sie einen Shader schreiben speziell
darauf abzielt, wie das Objekt gerendert werden
soll, und das
würde
den Rahmen dessen, was wir hier tun werden, bei weitem sprengen würde
den Rahmen dessen, was wir hier Gehen wir also mit einem
Standardmaterial von drei D aus, und jetzt können Sie sehen, dass sich unser
Block leicht geändert hat, und das liegt
an den
Standardeinstellungen des Wenn wir also einmal
auf das Material klicken, wird
das
Material-Drop-down-Menü erweitert. Und wow, da ist eine
Menge Zeug drin. Also die erste und
wichtigste, die wir uns ansehen
sollten, ist die
Albedo oder Albedo Ich weiß nicht genau,
wie das ausgesprochen wird. Aber der Albedo steuert sowohl die Textur als auch
die Farbe des Objekts Unser Objekt ist also völlig
untexturiert, wie Sie sehen können. Und wenn wir die Farbe
ändern wollen, können
wir einmal auf die Farbe klicken Und wenn wir
es dann ändern, können Sie sehen, wie die Farbe des Objekts in unserem Fenster
ändert. Wir werden das
zurücksetzen. Wir können Objekt
auch eine Textur
hinzufügen. Also schnappen wir uns unser Icon Dot
SVG und werfen es da rüber. Und jetzt kannst du sehen, dass
dein Objekt texturiert ist, obwohl die Skalierung nicht besonders
gut
ist , weil diese Textur
nicht für dieses
Objekt gemacht wurde . Wir könnten das beheben, indem wir
das UV öffnen und die Skala ändern Also machen wir das, nur
um zu sehen, wie es funktioniert. Und ich glaube das, ja. Es sieht aus, als wäre es Whoops Es sieht so aus, als ob es zwei und zwei sein wird
. Vielleicht nicht. Versuch es mit
drei. Da haben wir's. UV bezieht sich also auf
die Koordinaten
der Textur, wenn sie
nachgeschlagen und
auf das Objekt projiziert wird. UV-Koordinaten beginnen bei Null und gehen dann
bis zur äußersten Ecke
der Textur
auf eins . Und je nachdem, wo
auf der Oberfläche der Textur
wir zu rendern versuchen, wird
Godot das Pixel
an diesem Punkt nachschlagen und es dann
hier projizieren. Aber auch hier, da diese
Textur in Blender oder
wo auch immer nicht richtig auf dieses Bild
abgebildet wurde , mussten
wir das
hier unten anpassen, damit es Also können wir das entfernen, indem wir unserem
Freund
einfach auf den kreisförmigen Pfeil drücken, und dann gehen wir hier hoch
und löschen es Lassen Sie uns das für eine Sekunde zurückstellen
. Weil Sie es einfärben können, indem Sie auch die
Albedo-Farbe ändern Zwischen diesen beiden Dingen können
Sie also ein gutes
Maß an
Kontrolle darüber haben, wie Ihr Objekt Gadot nimmt also die Textur
und färbt sie dann
basierend auf der Wenn Sie also nur
die tatsächliche Farbe wollen, lassen
Sie sie weiß Also lass uns das nochmal klären. Und der nächste Punkt, uns interessant
ist, ist Transparenz. Wenn Sie also ein Objekt haben möchten,
das halbtransparent ist, können
Sie es ändern. Sie können es von deaktiviert auf einen
dieser verschiedenen Werte
ändern. Alpha ist am
einfachsten. Jetzt wird es natürlich
nicht
anders aussehen, weil unsere
Albedo völlig undurchsichtig ist Wenn wir also zurückgehen und
unsere Albedo erweitern und dann
das Alpha, also die Transparenz,
ändern , können Sie
jetzt sehen, dass das Objekt transparenter wird und
wir
tatsächlich Ich ändere das wieder. Ein weiterer interessanter
Aspekt ist metallisch und die entsprechende Rauheit. diesen beiden
können Sie
das Objekt also
metallischer aussehen lassen , daher der Name Und dann
bestimmt die Rauheit , wie gut,
rau das Objekt ist Und stellen Sie dabei
fest, wie viel Licht
tatsächlich von dem Ding ausgeht Wir erhalten kein
völlig genaues Bild von den Einstellungen mit unserem Würfel, und das liegt zum Teil an
der Umgebungsbeleuchtung, die wir in einer zukünftigen Lektion definitiv ändern werden . Wenn Sie jedoch wissen möchten,
wie
er bei sonst gleichen Bedingungen aussehen soll, können
Sie sich die Vorschau
oben im Material ansehen sonst gleichen Bedingungen aussehen soll, bei sonst gleichen Bedingungen aussehen soll, können
Sie sich die Vorschau
oben im Material Dort werden Ihnen die
Ergebnisse der Einstellungen angezeigt. Wenn wir also diese Albedo
ändern würden, sagen
wir, auf leicht
dunkel oder grau, und wenn wir das Metallische gut
nach unten bewegen, ist metallisch gut Wir werden die Spiegelung etwas nach unten und die Rauheit
etwas
weiter nach unten bewegen und die Rauheit
etwas . Das sieht
nicht gut aus Also, ja, wie Sie sehen können, wird das
Ändern dieser Werte das Aussehen Ihres Objekts
verändern, und es wird besonders
interessant aussehen , wenn wir tatsächlich anfangen, Beleuchtung einzubeziehen. Eine andere Methode, die
wir
irgendwann verwenden werden , ist Emission, und Emission ermöglicht es dem Objekt,
Farbe auszustrahlen und zu leuchten. Wenn wir es also aktivieren und dann die
Emissionsfarbe auf grün ändern, leuchtet das Objekt
jetzt grün, und wenn wir den
Energiemultiplikator ändern, es
jetzt wirklich Und wir haben
auch eine Menge anderer
interessanter Einstellungen , auf die wir später
noch näher eingehen werden, wenn wir uns
entscheiden, unser Spiel zu verschönern werden wir also In der nächsten Lektion werden wir also den vom Spieler
gesteuerten Panzer
aus Primitiven bauen,
und wir werden die Albedo, die Metallik und
die Rauheit
verwenden , damit er halbwegs anständig
aussieht Und dann werden
wir in späteren Lektionen einige
dieser Materialeinstellungen noch einmal überdenken und
Texturen und Bump-Maps und
all das hinzufügen Texturen und Bump-Maps und , damit unser Spiel wirklich gut aussieht . Fühlen Sie sich frei,
mit diesen Werten zu spielen. Es gibt im Grunde keine Möglichkeit
für dich, sie zu knacken. Und dann, weißt du, kommt das
Schlimmste zum Schlimmsten. Du gehst einfach zurück zum
Material und sagst, klar, und dann kommst du
wieder zu keinem Material zurück, und dann kannst du wieder von vorne anfangen. Lassen Sie uns also zur
nächsten Lektion übergehen, in der ich Ihnen zeigen werde , wie wir
unseren Panzer bauen und
ihn ein bisschen verschönern, und dann werden wir die Welt erschaffen und wir werden uns in
der Welt bewegen. Wir sehen uns dort
8. Erstellen komplexer Objekte aus Primitiven: der Tank: Willkommen zurück. Was wir jetzt
tun werden, ist unsere neu gewonnenen primitiven
Manipulationsfähigkeiten unter Beweis zu stellen, und wir werden alle Komponenten aus
Primitiven bauen Komponenten aus
Primitiven , die wir in unserem Spiel verwenden werden Das ist im Allgemeinen nicht das, was Sie für ein
professionelles Produkt tun
würden Normalerweise hast du ein
Grafikteam, das
deine Meshes und so weiter
erstellt , damit du sie importieren Wir werden uns später im Kurs
damit befassen
und einige besser aussehende
Modelle
importieren, um sie in unserem Spiel zu verwenden Aber wenn es darum geht, Prototypen zu entwickeln und Dinge einfach zum
Laufen zu bringen
, damit du sehen kannst, dass sie
funktionieren, oder einfach nur, um
etwas an Ort und Stelle zu haben ,
sodass du
zum Beispiel mit der Programmierung deines
Bewegungsskripts
beginnen kannst , ist so etwas
von unschätzbarem Wert Und wenn Sie
tatsächlich einen extrem
Retro-Low-Poly-Look
anstreben, möchten Sie Ihre Sachen vielleicht erst einmal
so
bauen Letztlich werden wir in dieser Lektion unseren Panzer bauen, und dann
werden wir in unserer nächsten Lektion
das Spielfeld bauen und
uns auch damit befassen, einzelne
Szenen zu speichern, um
Objekte zu duplizieren Lassen Sie uns hier also
mit einer neuen Drei-D-Szene beginnen. Klicken Sie also einfach
auf eine Drei-D-Szene, und
Sie erhalten einen Knoten drei D. Und dieser Knoten D ist im Grunde ein leerer Knoten, lediglich eine Position
im Drei-D-Raum
ist, wie wir bereits
gesehen haben, dargestellt durch unser Transformationsobjekt
hier im Inspektor. Wir werden es umbenennen, also klicken Sie
einmal darauf, um es auszuwählen, und klicken Sie dann erneut darauf, oder Sie können mit der rechten Maustaste
darauf klicken und Umbenennen wählen, und wir werden es Tank nennen. Und irgendwann werden wir
in zukünftigen Lektionen diesen
Panzer duplizieren, um uns Feinde zu machen. Und außerdem ist es einfach eine
gute Idee, deine Arbeit zu speichern. Warum
wählen wir also nicht Szene speichern und platzieren sie im Stammverzeichnis
unseres Ressourcenordners,
was bedeutet, dass sie
im Stammverzeichnis unseres Projekts gespeichert wird, und wir wählen einfach Speichern aus, und das gibt
uns unsere Panzer-Szene. Wenn Sie nun diese
Fehlermeldung hier sehen, geraten Sie nicht in Panik. Dies ist ein Bug und
Gadot, der schon seit einiger Zeit in
der Vier-Dunkt-Zwei-Ära existiert, und
es sieht nicht so aus, als ob er noch behoben wurde Auch hier befinden
wir uns zum Zeitpunkt
der Aufnahme in einem stabilen Zustand von 43. Also nochmal, wenn Sie diesen
Fehler sehen, ignorieren Sie ihn einfach. Es hat eigentlich keine
Auswirkungen und wird irgendwann behoben. Klopf an oh, wir werden
eine Gruppierung von Mesh-Instanz-Ds verwenden ,
um unseren Panzer zu bauen Das erste, was
wir tun werden, ist mit der rechten
Maustaste auf Tank zu klicken und dann den Adhild-Knoten zu
erstellen Und wir werden hier ausgiebig mit dem
Mesh-Instanz-D-Knoten
arbeiten Beachten Sie auch, dass Sie, sobald Sie das Fenster „Neuen
Knoten erstellen“ geöffnet
haben , tatsächlich suchen können, wenn Sie den Namen des Knotens
kennen. Andernfalls können Sie die Knotenbäume einfach erweitern, bis
Sie das bekommen, was Sie wollen. Der Großteil dessen, womit wir
arbeiten werden, befindet sich sozusagen
im D-Zweig von Knoten 3. Zumindest bis wir daran arbeiten oder
zumindest bis wir anfangen unsere Benutzeroberfläche erstellen und mit
Sound und ähnlichem zu arbeiten. Aber wie dem auch sei, im Moment klicken
wir einfach auf Mesh Three D und wir
erstellen ein neues. Und jetzt, wo wir ein Mesh Three D
haben, können
wir ein neues Primitiv hinzufügen. Also werden wir diesen Ordner
aufklappen und brauchen ein neues Box-Mesh, und da ist es, unser
guter Freund, der Würfel. Was wir jetzt tun werden, ist dieser Würfel
das Zentrum unseres Panzers sein wird. Also werde ich
ihm ein neues Material geben, ein neues Standardmaterial, drei D, und ich werde es auf Grau
umstellen. Also erweitern Sie die Albedo,
klicken Sie auf Farbe, ziehen Sie das Ding ein
wenig nach unten, bis wir etwas Schönes Graues
sehen, und los geht's Im Allgemeinen sollten
Sie, wenn Sie die Größe dieser
Primitive
ändern fast immer direkt im
Inspektor arbeiten, weil Gadot,
zumindest soweit ich weiß,
keine Werkzeuge hat, um die Objekte innerhalb des Fensters
direkt zu dehnen und quetschen Gehen wir also hierher und sagen
wir, dass es jetzt
0,5 ist , machen wir es trotzdem 0,25 Also, was ich hier mache,
ist rein künstlerisch. Letztlich werde
ich ein paar
dieser Primitiven so
zusammenschustern , dass sie einem Panzer
ähneln Fühlen Sie sich frei, all diese Dinge zu ändern
, die Farben zu
ändern, die Proportionen zu ändern, Ihren Panzer so aussehen
zu lassen, wie Sie
möchten Es gibt nur ein paar
Dinge, die ihr
genauso
machen müsst, wie ich sie gemacht habe,
und das ist meistens der Fall, wenn es
darum geht, den Turm zu erziehen,
und damit werden wir uns befassen, wenn wir an diesem Punkt angelangt Das wird also
0,25 Meter hoch sein
und sagen wir, es wird Whoa
sein, das ist zu Es geht auch in die
falsche Richtung. Sagen wir, 3 Meter mehr
oder nehmen wir, oder wollen wir fünf?
Ja, gute Frage. Ja, nehmen wir drei und schauen, wohin uns der Wind führt Und 1 Meter breit ist in Ordnung. Nun, um die
untere Hälfte des Panzers zu erstellen, könntet
ihr versucht sein, einfach
Control D
zu drücken und euer Netz zu
duplizieren, es hierher zu
ziehen und es dann zu
manipulieren Aber du hättest ein Problem. Weil Sie
den vorhandenen Knoten dupliziert haben, teilen sich
diese Knoten
dieselbe Mesh-Ressource Die
Mesh-Ressource selbst wird nicht dupliziert. Wenn Sie das
jetzt ändern würden, machen wir fünf, das würde
beide ändern, weil
sie auf
demselben Mesh arbeiten. Also, was du hier tun willst,
ist, dass du dich ändern willst. Sie gehen also zum
Drop-down-Menü für das Mesh und wählen „Einzigartig machen“. diese Weise können Sie dieses Netz
ändern, ohne das bestehende Netz zu
beeinflussen. Und das werden wir tun. Also werden wir
all das so zurücksetzen , dass
es wieder ein Würfel ist, und wir werden
die Materialfarbe ändern , weil wir wollen, dass sie
jetzt grün ist. Und wir haben genau das gleiche
Problem, weil
es wiederum darum geht, das
Material zu teilen, also wollen wir das
ändern und es auch einzigartig machen
. Und wenn wir jetzt
die Albedo-Farbe ändern, sollten
wir los Jetzt können wir ein schönes
Grün bekommen, ohne dass es etwas anderes
beeinflusst.
Klicken Sie einmal darauf, um es zu schließen. Okay, die
Breite ist also dieselbe, und wir werden
das Y bei einem halben Meter machen Und was Sie
hier tun können, ist den Pfeilen
die Ausrichtung zu ändern, und Sie können auf
dieses Ding klicken, um
die orthogonalen Ansichten zu erhalten ,
sodass Sie die Dinge ungefähr so
perfekt
ausrichten können Dinge ungefähr so
perfekt
ausrichten , wie Sie sie
erhalten möchten Sie können das aber auch
durch die Transformation tun. Indem Sie die
Zahlen direkt eingeben. Und meistens mache ich
das,
weil ich weiß, wie groß die
Dinge sind, die ich mache In diesem Fall
haben wir also, dass das Y
einen halben Meter hoch ist, was bedeutet, dass es von Null bis zum Boden 0,25 sein
wird Wenn ich das also auf 0,25 ändere
, sollte
es falsch ausgerichtet sein Und das liegt daran, richtig. Nun, mach es 0,5, und das wird
auch falsch sein. Ist es Nullpunkt Okay, nun, es ist gut für mich , wenn
ich versuche, in meinem Kopf zu rechnen. In Ordnung, wir
ziehen das einfach hierher. Und wenn Sie weit genug hineinzoomen, können
Sie sehen, dass es ungefähr so nah ist, wie es wichtig sein wird Ich werde auch
einen der Gründe nennen, warum du
das nicht für ein richtiges Spiel machen
möchtest, obwohl
es in unserem Fall, da
unser Spiel niedrig genug ist, nichts
beeinflussen wird du
Probleme mit der Optimierung haben wirst wir zum Beispiel unseren Panzer fertig
haben, werden
wir die Vorderseite
dieses Würfels nie mehr sehen, weil sie von der unteren
Hälfte des Panzers verdeckt
sein wird unteren
Hälfte des Panzers verdeckt
sein Und genauso werden wir
nie die Oberseite dieses grünen Würfels
sehen , weil sie auch von
diesem grauen Block verdeckt wird . Und obwohl wir sie
nie sehen werden. Gadot wird immer noch
versuchen, sie zu rendern. Was wir also erleben
werden, ist, Godot
eine Menge Dinge rendern wird dass
Godot
eine Menge Dinge rendern wird, die
wir nie wirklich sehen, was
in unserem Fall nicht zu einem Leistungsabfall
führen wird , weil unser Spiel
so low poly ist , dass
es egal Aber letztendlich würden Sie diese Netze in
einem externen Programm
wie Blender so erstellen wollen , dass diese unsichtbaren Gesichter
einfach überhaupt nicht Teil
des Modells sind einfach überhaupt nicht Teil
des Modells Aber auch hier machen wir nur
Prototypen, also
ist das völlig Also verschieben wir das einfach ein
bisschen zurück , damit es irgendwie cool
aussieht Und dann werden wir
dieses Netz duplizieren und
es etwas weiter nach hinten verschieben Und was wir hier tun werden,
ist, das Netz in ein Prisma
umzuwandeln das Netz in ein Prisma
umzuwandeln und
ihm sein eigenes Material zu geben,
wieder ein neues Standardmaterial ,
wieder ein neues Standardmaterial Wir wollen aber, dass es
dieselbe Farbe wie die anderen Materialien Also werden wir das erweitern. Wir werden nach Albedo gehen. Und wenn wir dann auf die Farbe
klicken, haben wir
jetzt eine kleine Wenn wir also auf die
Pipette klicken und hierher gehen, können
wir genau dieselbe Farbe erhalten, was bedeutet, dass diese beiden Dinge jetzt Eine der praktischen Einstellungen
für das Prisma ist also diese Einstellung von links nach rechts, Sie
die Oberseite
des Dreiecks neigen können Wenn wir es also auf Null setzen, ergibt das ein
perfekt rechtes Dreieck Und jetzt wollen wir den
Kerl so drehen , dass er so aussieht Und lassen Sie uns sicherstellen, dass
die Transformation korrekt ist. Das ist also ein bisschen falsch. Also wollen wir, dass es
sogar 180 sind, und los geht's. Und jetzt
müssen wir ihn genauso hoch haben
wie dieser hier. Die Höhe beträgt also die
Hälfte in Y-Richtung. Also ändern wir das auf eine
Hälfte in Y-Richtung. Und wir wollen, dass es auch in
X-Richtung nicht ganz so breit ist. Machen wir also 0,5 daraus. Und wir können das reinbringen, und es ist immer noch
nicht so, dass es zu groß ist. Es ist so, dass
der andere zu weit weg ist. Wenn wir das also
dorthin verschieben und dann darauf
klicken und es hierher
verschieben,
sieht das ziemlich gut aus, obwohl
wir sie in Bezug auf die Transformation ein
wenig
verbessern müssen in Bezug auf die Transformation ein
wenig
verbessern Ich habe immer noch nicht ganz
herausgefunden
, was diese Y-Position sein
soll Null, 3,75 vielleicht. Das
sieht ziemlich gut Und dann muss
dieses Netz ein bisschen überzogen sein. Sollte 0,5 sein, minus 0,5. Da haben wir's. Das
sieht ziemlich gut aus. Obwohl ich
gerne wissen würde, okay, dieses Material
sieht tatsächlich so aus, als wäre es zu dunkel. Also wollen wir, dass sie gleich sind. Also öffnen wir das
und die Albedo. Also gut, da ist dieser Fluch, und dann schauen wir uns diesen an Wir gehen hier hin, die Albedo. Ja, es sind
unterschiedliche Zahlen. Also werden wir diesen kopieren. Warte? Nein. Haben sie
dieselbe Nummer? Kopieren Sie das. Geh hier hin. Nein, sie haben nicht dieselbe Farbe. Ich weiß nicht, was ich war. Ich
weiß nicht, was dort passiert ist. Wahrscheinlich liegt es tatsächlich
an der Beleuchtung. Okay, da haben wir's.
Das ist perfekt. Also, wir
nehmen diesen hier und wir werden ihn
duplizieren, und wir werden ihn
drehen und ihn für
den anderen Teil hier verwenden. Also werden wir das Netz noch einmal
erweitern. Wir werden die Transformation erweitern. Wir transformieren, wir werden
das Y so ändern, dass es jetzt 180 sein muss. Also haben wir das jetzt gedreht. Wir wollen das da haben, und das
hier wird 2,5 sein? Nein, nun, ich habe
den gleichen Fehler gemacht wie zuvor. Ich
muss es einzigartig machen. Da haben wir's. Und was war
das T zwei, ist zu viel. 1.5. Sieht ziemlich gut aus. Schieb das rüber. 0,75. Cool Ordnung, das ist also der
Boden unseres Tanks und er sieht ziemlich gut Jetzt werden wir diese drei
duplizieren. Also wählen wir eine aus, indem wir mit der
linken Maustaste darauf klicken, und dann klicken wir mit der linken Maustaste
, um alle drei zu erhalten. Und dann können wir sie duplizieren. Und dann können wir
sie entlang der X-Achse drehen. Gehen wir also um 180 Grad und bewegen sie jetzt nach oben. Was war der negative
Wert von diesem? Also können wir das kopieren. Und sobald wir
alle drei ausgewählt haben, können
wir tatsächlich alle
ihre Positionen
gleichzeitig ändern . Und wir müssen das
Schild dort umkehren. Bum. Perfekt. Okay, drücken wir Steuerung und
stellen sicher, dass wir unsere
Arbeit speichern für den Fall, dass unser Computer explodiert, weil wir das
nicht noch einmal machen
wollen das
nicht noch einmal machen
wollen Und jetzt werden wir
den Turm bauen. Aber bevor wir das tun, wäre es eine gute Idee, sie als Körper
zu gruppieren Also fügen wir dem Tank einen weiteren
untergeordneten Knoten hinzu, und dieser wird
nur ein Knoten drei D sein Wir werden ihn Body nennen. Und wir werden umziehen. Wir werden all diese auswählen und wir werden sie verschieben. Wir werden
sie hierher ziehen,
um sie unter der Leiche Und das
heißt, wenn wir später
den ganzen
Körper in irgendeiner Weise,
Form oder Form
manipulieren müssen den ganzen
Körper in irgendeiner Weise,
Form oder Form
manipulieren , können wir das tun Aber es geht uns mehr darum etwas Ähnliches
für den Turm zu
tun Lassen Sie uns also
einen weiteren Knoten drei D erstellen, nennen
wir ihn Turm Und dieses Mal werden
wir
eine weitere Mesh-Instanz Three D hinzufügen , und diese wird
ein Röhrenpfad sein,
was ein seltsam benanntes Mesh ist Aber es ist eine
Art Zylinder, aber Sie können die Anzahl der Seiten
des Zylinders ändern Wenn wir es also, sagen wir, sechs machen, haben
wir jetzt ein Sechseck. Wenn wir 12 daraus machen, haben
wir ein, was auch immer das Ding ist, ein Dodekaeder,
ich glaube, Also setzen wir das
wieder runter auf sechs
und dann holen wir uns
wieder die Farbe, weißt
du, das müssen wir
eigentlich nicht tun Also werde ich Ihnen
gleich zeigen, wie Sie
das gesamte Material kopieren können. Also werden wir das nehmen. Wir werden den
Radius auf 0,125 ändern, was zu klein ist Sagen wir 0,25. Das ist besser. Und dann
werden wir die Höhe ändern, was technisch gesehen der Fall ist Wenn wir
also die
Anzahl der Abschnitte ändern, ja. Also das gibt es und wir können das
tatsächlich überprüfen, und ich werde es dir gleich zeigen.
Also lass uns das nach oben verschieben. Und wenn wir uns das ansehen,
okay, es ist nicht sichtbar. Es ist unter dem Nein, es ist nicht unter den drei Punkten. Wo war das Ding? Okay, es war hier und drüben.
Diese drei Punkte. Wenn wir hier hingehen und von der normalen Anzeige
zur Wireframe-Anzeige
wechseln , Jetzt können wir sie sehen und
ich werde das wieder zentrieren. Sie können die Polygone sehen,
die Dreiecke, aus denen Ihr Primitiv
besteht In diesem Fall haben
wir also zwei Abschnitte, nämlich die obere und
die untere Hälfte, und jeder Abschnitt
hat Wenn ich das
so ändere, haben wir
jetzt nur noch zwei
Abschnitte, eher zwei Ringe. Das ist also eine Möglichkeit,
die Anzahl der Abschnitte
in deinem Ding zu reduzieren . Und aus irgendeinem Grund kann ich damit
nicht einen Abschnitt machen. Es werden trotzdem zwei benötigt. Und wir können die Form
dieses Dings mithilfe der Kurven tatsächlich
ändern , aber das werden wir nicht tun. Die Länge des Abschnitts ist also gut. Und eigentlich nein,
lass uns das reduzieren. Das sollte es auf 1,25 abflachen. Ja, da haben wir's.
Okay, also nehmen wir das. Also hier ist der Turm. Und in Ordnung, ich werde das
wieder in den normalen Modus versetzen. Also, was wir
hier haben, ist der ursprüngliche
Root-Node der Turrets hier ist, aber dann sind wir zur
Mesh-Instanz hier oben übergegangen Wir wollen also die
Transformation der Mesh-Instanzen auf Null,
Null
ändern , sodass sie zentriert sind, sodass sie
genau dort zentriert sind, wo der Turm
sein sollte Und jetzt bewegen wir das nach
hinten und wir bewegen es nach unten, sodass es so
nah wie möglich am Körper anliegt wie möglich am Körper , weil
wir nicht wollen, dass Licht durch den
Boden schaut Wir gehen zu einem dieser
Körpersegmente, nicht zu diesem. Wir gehen zu einem
dieser Körpersegmente. Wir können jetzt
das Material kopieren und hierher gehen und
dann das Material einfügen. Und jetzt müssen wir uns nicht mehr
darum kümmern, mit
der Pipette herumzualbern und sicherstellen die Farben
stimmen Also einfügen, bumm, da ist es. Und jetzt machen wir
noch eins
davon für das Fass. Also dieses Mal
werden wir einen Zylinder verwenden und ihn drehen. Und wir können ihn
auch so drehen. Also wenn wir das machen, machen
wir so weiter. Im Idealfall wird sich diese Rotation
also ändern, wenn
wir das Spiel spielen. Wir werden es
so machen, dass wir das Fass anheben
und absenken können . Aber im Moment wollen wir, dass es
auch bei 90 Grad schön ist. Öffne das Netz. Fügen Sie
das Material erneut ein. Wir werden das Whoa ändern. In Ordnung, also die Höhen. Machen wir 1,5 draus. Und wir werden den oberen
und den unteren Radius ändern. Wie Sie also sehen können, wenn ich den oberen Radius
ändere, wird er quasi zu einem Kegel. In Ordnung, lassen Sie uns also tatsächlich
0,120 0,1 daraus machen. Ja, 0,1. Sieht ziemlich gut aus. Jetzt ziehen wir den Kerl einfach
hierher, bis er
wieder so Fleisch ist, wie wir es mit dem Turm machen
können Und wenn es ein
bisschen reingeht, ist das okay. Es muss nicht perfekt sein. Es ist nur so, dass wir
es so gut wie möglich machen wollen. Ordnung. Sieht ziemlich groovig aus Ich weiß es nicht. Ich
finde immer noch, dass das zu groß ist. Machen wir 0,05 draus. Da haben wir's. Das gefällt mir. Und jetzt fügen wir eine Schnauze hinzu. Und die Schnauze
wird im Grunde dieselbe sein wie dieses Ding, also können wir sie duplizieren Und wir werden das Netz wieder
einzigartig machen , damit
wir es modifizieren können Wir werden
die Transformation ändern. Wir werden
ihm eine Rotation von 90 geben. Was ist gerade passiert? Hmm. Interessant. Ich
weiß nicht, wo das hingegangen ist. In Ordnung, Position ist Null, Null. Ordnung, weißt du was?
Ich lösche das
einfach
und mache es nochmal. In Ordnung, wir werden das auf die altmodische Art machen
. Wir fügen einfach eine weitere
Mesh-Instanz drei D hinzu. Wir
geben ihr einen Tube-Trail Wir werden wieder das richtige Material einfügen
. Wir ändern den Radius vorerst auf, sagen
wir, 2,5. Wir werden ihn für einen Moment ändern. Abschnitte. Wir werden sie wieder
reduzieren. Radiale Stufen runter auf sechs. Und dann transformiere 90. Oh, ich sehe, was ich letztes Mal gemacht habe. Okay, ich verstehe mein Problem. Anstatt die Drehung zu ändern,
habe ich die Position geändert, sodass sie auf 90 gesetzt wurde, was außerhalb der Kamera lag Ordnung. Offensichtlich
brauche ich noch eine Tasse Kaffee, bevor ich heute versuche
zu unterrichten Also, lassen Sie uns das hier rausbringen. Nun, wie Sie sehen können, ist
das offensichtlich viel zu groß, obwohl es für manche Leute cool sein könnte. Aber ich werde das
dorthin verschieben und dann
den Radius wieder ändern. Also machen wir den Radius zu Null, Eins. Das sieht viel besser aus. Okay, jetzt haben wir einen Panzer und er sieht gut aus. Und der Grund, warum wir den Turm
so gebaut haben, ist, dass wir einen zentralen Punkt
wollen an
dem der Turm
manövrieren kann Da der Turm
normalerweise hier mittig
ist, schauen wir uns das Fass hier
an Wenn ich dieses Fass normalerweise
drehen würde, nun, lassen Sie uns es drehen,
können Sie sehen, dass es sich
um den Mittelpunkt
des Netzes dreht , und es gibt keine Möglichkeit, den Ankerpunkt
des Netzes selbst so zu
ändern des Netzes selbst so , dass Gadot ihn als
Mittelpunkt des Netzes betrachten
würde Mittelpunkt des Es wird immer hier sein. Deshalb
verwenden wir einen Knoten drei D als Ankerpunkt für das gesamte Objekt, denn wenn ich
jetzt
den Knoten drehe, dreht sich
der Tankar
genau so, wie er Und jetzt, wo ich darüber nachdenke, müssen
wir
etwas Ähnliches tun, um den Turm selbst drehen
zu können .
Also lass uns das jetzt machen Wir fügen ein weiteres Kind hinzu, das ein Knoten drei D ist, und dieses wird ein Rotationsturm oder besser gesagt ein
Fass-Ankerpunkt sein Rotationsturm oder besser gesagt ein
Fass-Ankerpunkt Und dann nehmen wir die
beiden Fassstücke
und ziehen sie
hierher, sodass sie dem
Fass-Ankerpunkt zugeordnet sind dem
Fass-Ankerpunkt zugeordnet Und wenn ich das jetzt drehe, kann sich
das Fass auf und ab
drehen Aber da wir
das gemacht haben und das Fass hier
in der Mitte
ist, wollen wir es eigentlich wollen wir es eigentlich ein wenig nach unten bewegen. In Ordnung, das werden wir ändern. Und natürlich
sind die Fässer jetzt falsch versetzt, also werden wir uns darum kümmern Wir werden es nur ein
bisschen so anpassen. Jetzt sind die beiden hier drunter. Und wieder können Sie beide Dinge
gleichzeitig
auswählen , sodass Sie sie zusammen
verschieben können. Jetzt haben wir das genau da. Und jetzt sind wir da, wenn
wir das Fass drehen, dreht sich
das Fass gut, obwohl wir es
eigentlich nur ein bisschen nach
innen bewegen sollten , damit
wir die Naht nicht sehen. Da ist es also Und irgendwann werden wir die Drehung des Zylinders sperren
wollen ,
damit es nicht
durch den Boden
des Tanks geht , aber da ist es. Ordnung. Kontrolliere S erneut. Wir haben einen Panzer. Es gibt
nur noch ein Problem, und das ist, dass wir wollen, dass die
Basis,
der Ursprung, der Ankerpunkt des Panzers auf dem Boden liegt. Aus diesem Grund haben wir
unsere Körperteile einem Tankknoten
zugeordnet, denn jetzt müssen wir sie nur noch
nach oben bewegen Oh, lass es uns in
der Position hier machen. Wir bewegen sie nach oben.
Jetzt ist der Panzerversatz hier an der Basis, und genau
dort wollen wir ihn haben. In Ordnung, das war eine Menge. Wenn ihr weiterhin das
Manövrieren im
Gado Three D-Space
und das Manipulieren von
Mesh-Primitiven
üben Manövrieren im
Gado Three D-Space
und das wollt, könnt ihr entweder
euren Panzer wechseln oder ihm weitere Teile
hinzufügen Andernfalls sehen wir uns
in der nächsten Lektion, in der wir das Spielfeld bauen werden.
Wir sehen uns dort
9. Aufbau des Playfields: Willkommen zurück. In dieser Lektion werden
wir
das Spielfeld so bauen , dass
wir etwas
haben dem die Panzer und
ihre Feinde
herumlaufen können, und wir werden
eine neue Szene erstellen, sodass wir unter die
Szene und eine neue Szene gehen können Und wieder wird
es eine Drei-D-Szene sein, also ein Knoten drei D. Und wir
werden diese umbenennen und sie Arena
oder Spielfeld oder
Schlachtfeld oder wie auch immer Sie wollen nennen oder Spielfeld oder
Schlachtfeld oder wie auch immer Sie Dann fügen wir eine Mesh-Instanz
drei D hinzu. Und wieder geben
wir ihr ein Box-Mesh In diesem Fall
könnten Sie jedoch auch ein ebenes Netz verwenden. Meiner Erfahrung nach
habe ich jedoch manchmal festgestellt
, dass Flugzeuge Kollisionen
nicht richtig registrieren. Manchmal
wird Gados Physik etwas verrückt. Also nehmen wir ein Boxnetz und
ändern es in X- und Y-Richtung
auf 100 Nun, nicht die Y-Richtung, sondern
die Z-Richtung. Und wir können es ein
wenig verdünnen, es auf 0,5 machen. Nicht dass das wirklich wichtig wäre. Und dann wieder
ein neues Material, und dieses wird
bräunlich sein bräunlich Da haben wir's. Wir haben ein Spielfeld.
Lassen Sie uns jetzt
unserem Spielfeld ein
bisschen Farbe verleihen unserem Spielfeld ein
bisschen Farbe indem wir einige Bäume und einige Hügel und auch einige
Felsen Also fügen wir eine neue
Mesh-Instanz hinzu. Eigentlich nein. Wir werden einen neuen Knoten drei D hinzufügen und ihn Tree nennen. Okay, komm schon.
Klicken Sie mit der rechten Maustaste. Da haben wir's. Und dieser Baum wird wieder ein Paar
von Mesh-Instanzen sein. Also die erste
Mesh-Instant-Mesh-Instanz, ist nicht leicht auszusprechen. Die Mesh-Instanz wird
ein Zylinder sein. Und dieser Zylinder wird dunkelbraun sein , um
der Baumstamm zu sein. Und wir werden es schaffen. Nun, der Radius ist in Ordnung
und wir schaffen es auf 3 Meter. Ich schiebe das so
hoch, dass es bodenbündig
ist Und wir werden auch
eine Kugel oben drauf legen. Also eine weitere Mesh-Instanz, diese wird ein Kugelnetz sein, und das Material wird grün sein Nun, diese
Kugel ist natürlich viel zu klein, also werden wir
das Material zusammenklappen, und dann gehen wir zu Radius
und machen daraus, sagen wir, zwei, und die Höhe
wird ebenfalls zwei sein. Und an diesem Punkt können
Sie
sie so gestalten, wie Sie wollen. Wenn ich also diese fünf machen würde, würde
es so aussehen,
was ziemlich cool ist. Ich habe sie ursprünglich
perfekt sphärisch gemacht, was auch funktioniert, obwohl mir das
jetzt, wo
ich darüber nachdenke ,
ein bisschen besser gefällt. Also werden wir das tun. Und
wir werden uns noch einmal vergewissern, in Ordnung, jetzt haben
wir einen Baum Jetzt wollen wir die Bäume. Wir wollen den
Baum quasi als Fertighaus verwenden können , sodass wir
so
viele Bäume kopieren, einfügen
und platzieren können , wie wir wollen Aber um das zu tun, brauchen
wir eine Möglichkeit,
gemeinsam auf
jeden Baum zu verweisen , denn nehmen wir ,
wir kopieren, wir haben
gerade Control D ausgeführt, und wir kopieren und fügen einen
Haufen dieser Bäume Und dann, aus irgendeinem Grund,
haben wir später beschlossen, dass der Baumstamm zum Beispiel
blau sein sollte. Nun, wir müssten
zurückgehen und all diese
Bäume manuell
ändern. Und wenn wir 100 Bäume
in unser Spielfeld stellen würden
, wäre das eine Menge Arbeit Also klicken wir einfach mit der rechten Maustaste und wählen Filiale als SN
speichern Und dann ist es schon so Dateiname
automatisch auf den
Namen des Knotens voreingestellt auf den
Namen des Knotens Also wird es uns hier gut gehen. Wir drücken einfach auf Tree
und
ignorieren wieder diesen Parsing-Fehler Es geht einfach nie weg. Und jetzt haben wir einen Baum. Wenn wir wollten,
können wir jetzt mehr Bäume
in unsere Szene ziehen , und
wir haben zwei Bäume. Also werde ich das ein
paar Mal machen. Und du kannst einen wahren
Wald bauen, wenn du willst, aber ich werde
nur drei hier platzieren Und wir werden
dasselbe tun und einen Hügel bauen. Und es wird nicht der
schönste Hügel
der Welt sein , weil unsere Maschen
begrenzt sind, aber wir werden ein Prisma bauen, und wir werden es groß machen Und wir werden
es braun machen. Mach es ein bisschen
brauner als das Spielfeld. Und wir sollten
das in Hill umbenennen. Jetzt, wo wir das haben, können
wir das Material schließen
und
die Transformation ändern, und
die Transformation ändern weil
wir es drehen wollen. Und dann gleichen wir das auf minus 120
aus. Und wir werden das auf
minus 120 ausgleichen. Was eigentlich nicht
ganz richtig ist, aber nicht wirklich. Negativ 115, wie es aussieht. Nein. Interessant. Okay, egal,
wir haben jetzt einen Hügel
, der immer noch nicht groß genug ist. Lass uns rundum sieben draus machen. Und das ist hier nur ein rein
persönlicher Geschmack. Es gibt kein fantastisches Ja oder Nein. Deshalb muss das Ding so groß
sein. Ich mache es einfach ,
weil
ich es so haben möchte. Sie können
diese ganz einfach selbst ändern. Und
angesichts der Tatsache, dass die Hügel buchstäblich
wie Dreiecke
sind, müssen
sie für die Zwecke
unseres Prototyps hier nicht besonders
detailliert sein ,
aber du kannst den Hügeln ganz einfach
weitere Mesh-Instanzen hinzufügen weitere Mesh-Instanzen hinzufügen und
sie steiniger aussehen lassen Aber wir werden das einfach
hier drüben platzieren. Und noch einmal klicken wir mit der
rechten Maustaste auf Speichern wie gesehen. Und jetzt haben wir einen Hügel, also fügen
wir einen weiteren Hügel hinzu. Und wir können leicht einen Stein bauen,
indem wir dasselbe tun. Also drücke ich mit der rechten Maustaste und duplizieren und wir
nennen diesen einen Stein. Und wir werden diesen
Zweig als Szene speichern. Ordnung, da war
eine Fehlermeldung In Ordnung, da war
eine Fehlermeldung
. Zweig der Szene speichern Was war die
Fehlermeldung? Die Fehlermeldung lautete, dass der Zweig einer
bereits instanziierten Szene gespeichert werden kann Um eine Variation
einer Szene zu erstellen, können
Sie auf der
Grundlage der instanziierten Szene eine geerbte Szene erstellen auf der
Grundlage der instanziierten Also wollen wir das nicht tun. Also ich schätze, wir
machen den Stein einfach manuell. In einer zukünftigen Lektion werden wir uns instanziierte Szenen ansehen Also gehen wir vorerst einfach
zurück zu Arena. Child Node, Instanz
drei, D. Rock. Und lassen Sie uns die Steine
etwas anders machen. Wir werden die Felsen
wie eine Kugel machen, aber sie werden klein sein
und sie werden halb unter der Erde
vergraben sein. Albedo ist grau. Und lassen Sie uns den Radius auf 0,75 setzen. Und wir werden den
Rock auch als eigenen Szene-Rock speichern. Und wir drücken Control D
, um die Steine
ein paar Mal zu duplizieren , und wir werden einige
verschieben. Jetzt haben wir also unsere Arena und die Hügel sind irgendwie abgedreht, also ist es eigentlich
gut, dass wir
eine Szene daraus gemacht haben, damit ich dir
zeigen kann, wie du das anpassen kannst. Schauen wir uns an, ob ein
Doppelklick nicht funktioniert. In Ordnung, lass uns hierher gehen. wir
also Wenn wir
also
auf dieses kleine Symbol
mit der Aufschrift Editor öffnen doppelklicken , können
wir die
Hill-Szene im Editor öffnen Aber auf diese Weise können
wir die Szene bearbeiten, und dann
werden alle anderen Szenen aktualisiert, um
dies zu berücksichtigen. Schauen wir uns das mal an. Wir haben unsere Transformation,
was seltsam ist. Wir verlieren immer wieder den Überblick. Okay, lassen Sie uns
das Rot tatsächlich vorziehen . Da haben wir's. Okay, nun, anstatt daran zu
schrauben, ist
der einfachste Weg, es zu reparieren, es einfach
ein wenig nach unten zu bewegen , sodass der Boden vom Gelände abgeschnitten
wird Also wenn wir das jetzt speichern und zu Oh, wir haben unsere Arena
nie gerettet
zurückkehren Wir machen besser diese
Szene und retten Arena. Ein Hmm. Okay. Nein.
Das haben wir immer noch, ist das richtig? Okay, ja, es ist
nur der Schatten, nein. Genau da. Okay, jetzt sind die Hügel
richtig bündig mit der Arena. Und wieder werdet ihr
feststellen, dass wir
die Y-Position des Hügels
direkt in der
Hügelszene selbst geändert die Y-Position des Hügels haben. Dann wurden beide
Hügel automatisch
aktualisiert, Dann wurden beide
Hügel automatisch als wir sie gespeichert haben und zu unserer Hauptebene
zurückgekehrt Okay. Oh, das ist unser Level,
so toll es auch aussieht. Und wenn du weiter
üben
möchtest, Szenen zu erstellen und
Fertigobjekte in das Level einzubauen, warum peppst du es nicht
ein bisschen auf Eine gute Sache wäre
wahrscheinlich,
diese Grenze mit Hügeln zu sperren , damit der Panzer nicht vom Rand der Welt fällt, wenn wir
die Kollision irgendwann in
die Physik
einführen Panzer nicht vom Rand der Welt fällt, wenn wir
die Kollision irgendwann in
die In unserer nächsten Lektion werden
wir eine Kamera hinzufügen, und danach werden
wir uns
den guten Dingen zuwenden . Also
werde ich dich dort sehen.
10. Der Camera3D-Knoten: In dieser Lektion
nehmen wir alle Szenen, die
wir ursprünglich erstellt haben, und
setzen sie nicht nur zu einer Master-Szene zusammen, sondern schauen uns auch
den Kameraknoten an und wie wichtig es ist, Ihre
drei D-Spiele zum Leben zu erwecken Wir haben also unsere Panzer. Wir haben unsere Steine. Wir haben alles, was wir
in der vorherigen Lektion gebaut haben. Wenn wir nun
versuchen würden, unser Spiel auszuführen, würden
wir nichts
besonders Beeindruckendes herausbekommen. Also lass uns das machen. Das erste Problem, das wir haben,
ist, dass wir nicht
definiert haben , was Godot die Hauptszene
nennt Wie ich bereits erwähnt habe, ist
alles in Gadot eine Szene, und Godot muss wissen, was die Standard-Rootszene ist, damit sie geladen und ausgeführt wird,
wenn wir das Spiel starten Machen wir es also vorerst einfach zur Arena. Wenn Sie also versuchen, das Spiel zu starten ohne
eine Standardszene festgelegt zu haben, gibt Ihnen
Godot
diesen Dialog, der besagt, dass keine Hauptszene definiert wurde Wähle einen aus. Und wenn wir „ Aktuell auswählen“ sagen, weil die Arena unsere aktuelle Szene
ist, ist
das die Szene, die
Gadot laden wird, wenn das Spiel beginnt.
Und wir bekommen nichts Und der Grund, warum wir
nichts bekommen, ist, dass
wir in einer
Drei-D-Umgebung spielen und Godot
eine Drei-D-Umgebung
ohne Kamera nicht rendern kann eine Drei-D-Umgebung
ohne Kamera Wie Sie vielleicht vermutet haben, eine Kamera in Godot ein Knoten Und wir wollen die
Kamera an unseren Player anschließen. Gehen wir also zurück
zu unserer Panzerszene und klicken mit der
rechten Maustaste auf „Untergeordneten Knoten hinzufügen“. Und was wir wollen, ist Kamera drei D. Beachten Sie nun, dass es
in vielen Fällen auch zwei D-Versionen
derselben Knoten
gibt , an denen
wir arbeiten. Und das ist für
Flat-Two-D-Sprite-Umgebungen. Wenn Sie also ein
Bitmap-basiertes Side-Scrolling-Spiel
oder ein japanisches Rollenspiel der alten Schule machen würden , würden
Sie Camera
Two D oder Two D Nodes verwenden Aber da wir in diesem Kurs
ausschließlich in drei
D arbeiten , wollen
wir nur die
Knoten für drei D, zumindest bis wir zum Teil
der Benutzeroberfläche kommen Also wählen wir Kamera
drei D aus und fügen sie hinzu. Und jetzt haben wir eine Kamera
an unserem Tank angebracht. Und Sie können jetzt sehen
, dass wir eine Kamera haben Lassen Sie mich sie löschen, damit
Sie den Unterschied sehen können. Es war ein bisschen subtil. Jetzt, wo die Kamera
weg ist, sehen wir hier nichts. Und wenn wir jetzt wieder
eine Kamera hinzufügen, haben
wir jetzt die Möglichkeit Vorschau unserer Kamera
im Frontfenster anzuzeigen. Also, wenn wir eher auf dieses oder
das Hauptfenster klicken. Wenn wir also darauf klicken, können
wir jetzt sehen, was wir haben. Und natürlich
sieht es nach Müll aus, weil wir unsere Kamera nicht richtig
ausgerichtet haben. Also lass uns das machen.
Wir werden das Häkchen entfernen Aber
anstatt das Häkchen zu entfernen, gehen
wir zurück zur Ansicht, und jetzt gehen wir
zu zwei Ansichtsfenstern Und wie Sie sehen können,
ist
unser oberes Ansichtsfenster das, was Sie in der Kamera
sehen können, und unser unteres Ansichtsfenster ist dieselbe Drei-D-Ansicht
, die wir zuvor hatten Wir können also diese Ansicht von unten verwenden , um unsere Kamera auszurichten, und wir können sehen, wie sie in Echtzeit aktualisiert wird, was unsere Kamera tatsächlich sieht Ziehen wir also unsere Kamera nach oben, weil eine Kamera
nur ein Drei-D-Knoten ist, genau wie die anderen, mit denen
wir gearbeitet haben. Also können wir
es auf die gleiche Weise manipulieren. Also drehen wir es
nach vorne und ich werde es ein
wenig
verfeinern, bis es minus 90 entspricht
. Und ich werde
es leicht nach hinten ziehen. Und wir werden es ein bisschen nach oben bewegen und dann werden wir
es leicht nach unten neigen
, damit wir unseren Panzer
in seiner ganzen Pracht sehen können Und natürlich hat die Kamera
eine Reihe von Einstellungen, mit denen wir in zukünftigen Lektionen
spielen werden Die wichtigste davon
ist die Umgebungseinstellung. Sie können aber auch das Sichtfeld der
Kamera ändern, sodass Sie Ebenen in der Nähe und in der
Ferne schneiden, was Sie in den meisten Fällen
nicht wirklich wollen Sie werden feststellen,
dass der Tank irgendwann
verschwindet, wenn
Sie ihn zu nah einstellen dass der Tank irgendwann , weil die
Kamera
bestimmt, wo die Kamera mit dem Rendern beginnt
und wo die Kamera das Rendern beendet Und das ist an und für sich schon ein
Volumen von drei D. Also alles in diesem
Volumen wird gerendert. Also lasst uns die nochmal zurücksetzen. Und das ist auch eine
extrem wichtige Einstellung, und wir werden feststellen, welche Kamera tatsächlich gerendert wird. Es ist also möglich, ihr das
in anderen Three-D-Spielen gesehen habt ,
dass ihr mehrere Kameras und
mehrere Kameraansichten habt. Und eine Möglichkeit, das zu
tun, besteht darin, die Kamera einfach manuell
in eine andere Ausrichtung zu zwingen. Eine üblichere Methode besteht jedoch darin,
einfach mehrere Kameras verwenden und nur das Bild
betrachten zu lassen , das
jeweils von einer von ihnen gesehen wird. Wenn wir also zwei Kameras hätten
und wir es mir erlauben könnten, würde ich eine zweite Kamera
hinzufügen, und wir würden das in Echtzeit sehen. Also duplizieren. Und die zweite Kamera, lass uns sie rüberbewegen. Nun, lassen Sie uns so vorgehen
und wir machen eine Vorschau, und natürlich sehen wir
nichts Interessantes. Wenn wir also hierher zurückkehren,
ist es die aktuelle Kamera. Und wenn wir dann hierher gehen,
können wir das auf
die aktuelle Kamera ändern. Das wird hier
nichts ändern, da
wir automatisch eine
Vorschau unserer Hauptkamera Das wird also nicht richtig
aktualisiert. Das könnte ein Bug sein, vielleicht mache
ich etwas falsch. Ich kann
es nicht wissen. Aber wenn wir jetzt unsere Szene durchgehen
, werden
wir
wieder nichts bekommen , weil ich es
nicht geändert habe. Das ist also eine gute
Gelegenheit, dir zu erklären, wie du die Szene in
Gado zu deiner
Standardszene
ändern kannst. Wenn wir also zu den
Projekteinstellungen gehen und zu „Ausführen“ gehen, kannst du die Hauptszeneneigenschaft
sehen Also können wir das ändern, und wir haben es derzeit auf Ana eingestellt, was keine Kamera enthält Und wenn wir es auf Panzer ändern, der
die Kamera hat, und wenn wir das Spiel
jetzt starten, werden
wir unseren Panzer in seiner
ganzen unbeleuchteten Pracht sehen, und wir sehen die Ansicht von unserer ursprünglichen Kamera, weil
es die erste Kamera ist, also ist es die Standardkamera,
weil keine unserer Kameras auf aktuell
eingestellt Wenn wir die zweite
Kamera auf „Aktuell“ setzen und dann die Szene erneut ausführen, sollten
wir die Ansicht von der zweiten Kamera
aus sehen Und da ist sie. Also, das
nützt uns natürlich nicht , denn alles, was
wir sehen, ist der Panzer. Und das liegt daran, dass
sich der Panzer derzeit nicht in der Arena befindet. Also lass uns zurück in die Arena gehen. Jetzt könnten wir den Panzer
direkt in die Arena ziehen, und daran ist wirklich
nichts falsch, aber ich halte
meine Strukturen gerne getrennt
und hierarchisch,
was ein Wort ist, das
nicht leicht auszusprechen ist Also werden wir eine
neue Szene erstellen, und wieder wird
es
ein Knoten drei D sein, und diesen werden
wir Spiel nennen Und das Spiel
wird, wie
ihr euch vielleicht vorstellen könnt, die Arena beinhalten, und wir mussten sie nur
hineinziehen , weil wir sie
bereits erstellt haben, und dann
ziehen wir einfach einen Panzer rein. Und wenn wir jetzt
unser Spiel als Szene speichern
und den ersten Schwung
machen, werden wir
das
ein wenig bereinigen und
diese schlecht ausgerichtete Kamera entfernen. Und jetzt, wo wir das
getan haben,
wird Gadot standardmäßig
zu dieser Kamera zurückkehren, aber wir werden sie trotzdem
auf aktuell setzen nur um die Konsistenz zu gewährleisten Und wenn wir jetzt zu unserem Projekt
zurückkehren und die aktuelle Szene
von Panzer oder die Standardszene
von aktuellem Spiel zu Panzer ändern von Panzer oder die Standardszene , nein, wenn wir zurückgehen und
die Standardszene
von Panzer zu Spiel ändern und sie dann
jetzt schließen, wenn wir unser Spiel starten, sollten
wir alles sehen
, was wir erwarten würden. Und das tun wir. Jetzt haben
wir natürlich keine Beleuchtung
oder ähnliches
in die Umgebung gebracht . Also ist es natürlich
völlig dunkel. Wir haben keine Skybox,
nichts von dem Zeug. Aber seien Sie versichert, dass wir unser Spiel
sehr, sehr bald verschönern werden unser Spiel
sehr, sehr bald Aber bevor wir
das tun, müssen wir ein bisschen
über Vektoren
lernen und wie man einige
dieser Dinge organisiert , damit
wir uns tatsächlich in dieser Spielwelt
bewegen können in dieser Spielwelt
bewegen Und an diesem Punkt
müssen wir sehen, was wir tun. Dann schauen wir uns die Umgebung
und die Beleuchtung
an . Ich
werde dich dort sehen.
11. Vektoren: Willkommen zurück. In dieser Lektion werden
wir uns mit dem mathematischen Konzept befassen ,
das als Vektor
bekannt ist. Und der Grund, warum wir das
tun werden, ist, dass Vektoren
in Videospielen
ständig, häufig und überall verwendet werden , insbesondere wenn es
um Drei-D-Umgebungen geht. Und da wir
ausschließlich in drei D arbeiten und viel Physik machen
und Objekte
im Drei-D-Raum bewegen werden , ist
es ein gutes Konzept, das zu wissen. Ich habe hier also einen
Zwei-D-Knoten eingerichtet, und der Grund dafür
ist, dass es etwas einfacher ist, Vektorkonzepte in
zwei D zu veranschaulichen als in drei D, aber die Mathematik und die Konzepte
sind alle identisch. Wenn Sie also das eine verstehen, verstehen
Sie das andere. Wir haben bereits ein
bisschen mit Vektoren
gearbeitet ,
wie Sie sich vorstellen können, unter der
Transformationseigenschaft unserer Knoten Gehen wir zurück zu unserem Tank, und wir können das
etwas genauer sehen. Wir haben die Positions
-,
Rotations - und Skalenwerte,
und das sind alles Vektoren. Ein Vektor ist ein
mathematisches Konzept, das durch eine Richtung
und eine Größe definiert
wird. Und Größe ist
einfach eine ausgefallene Art zu sagen, wie lang dieser Vektor ist. Wenn wir also zu
zwei D zurückkehren und
zu diesem leeren Knoten zurückkehren , ich erstellt habe,
kann ich Ihnen das zeigen. Nun, was ich hier
mit dem Raster gemacht habe ist, dass ich das Raster
selbst eingeschaltet habe, indem ich gut gedrückt habe, eigentlich habe ich
nichts gedrückt, um das zu tun. Aber wenn du diese Taste
hier drückst, um das Raster auszurichten,
und wenn du dann unter
die drei Punkte gehst und Snap und wenn du dann unter
die drei Punkte gehst und konfigurieren
auswählst und sicherstellst, dass
Pixel-Snap gesetzt ist, dann wird alles, was
du gerade tust, am Raster ausrichten, wie ich bereits gezeigt habe, als
wir drei
D gemacht haben . Und was ich
getan habe, ist
den Snap auf ein Pixel
für den Rasterschritt konfiguriert , sodass wir die
Koordinaten gut sehen können. Also werde ich hier einen untergeordneten
Knoten mit dem Namen Cast Two D hinzufügen. Und ich stelle fest, dass es auch ein D in
Guss 3 gibt, aber wie gesagt,
wenn man eine Dimension
aus der Gleichung
herausnimmt, wenn man eine Dimension
aus der Gleichung
herausnimmt ist es etwas einfacher, sie
zu konzeptualisieren Aber auch hier
ist die Mathematik genau dieselbe. Der einzige Unterschied zwischen Guss 2 D und Guss 3 D besteht , dass D aus Guss 2
keine Z-Komponente hat, weil
wir
in zwei Dimensionen nur in X und Y arbeiten, aber in drei Dimensionen arbeiten
wir in X, Y und Z. Zum Glück für uns ist
ein Strahl oder ein Strahlwurf
also aber in drei Dimensionen arbeiten
wir in X, Y und Z. Zum Glück für uns ist
ein Strahl oder ein Strahlwurf
also ein Vektor. Wie Sie
hier sehen können, handelt es sich also um einen Pfeil. Nun, wenn Sie einen davon
in Ihr Spiel werfen würden , würden
Sie
diesen Pfeil nicht in Ihrem Spiel sehen. Dies dient nur zur Anzeige im
Editor und zum
Debuggen, sodass Sie tatsächlich sehen
können, wohin
Ihr Vektor zeigt Und es ist ein
bisschen falsch , weil es einen
Wert gibt, der Zielposition genannt wird, und diese Art von
Röcken um uns herum versucht, das, was wir zeigen wollen, zu
zeigen Aber im Allgemeinen behandeln wir
alle Vektoren so, als ob
sie bei Null,
Null beginnen würden, obwohl
man bei einem Strahlwurf
natürlich sagen kann, dass er beginnen soll,
wo immer man will Mathematisch gesehen spielt
es jedoch keine Rolle, ob ein Strahl oder ob ein Vektor
bei Null beginnt oder bei 34 16 beginnt oder wo auch immer
wir ihn platzieren wollen Die gesamte Mathematik ist
dieselbe und geht davon aus, dass Vektoren am Ursprung des lokalen
Raums beginnen , aus dem
sie stammen Und das ist eine weitere Sache,
über die wir ein wenig sprechen sollten, und das ist lokaler Raum
versus globaler Raum. Wie Sie sich vorstellen können, drei
D-Räume und auch zwei D-Räume aufgeteilt oder zumindest sind
die Positionen in Koordinaten
definiert. Und wir haben die
ganze Zeit Koordinaten verwendet, zum Beispiel indem wir unserem Panzer mitgeteilt haben, dass er sich an Position 000
befindet. Das ist ein Satz von
Koordinaten im lokalen Raum. Und jetzt
ist der lokale Raum für
das Objekt relevant, an dem Sie
arbeiten, oder besser gesagt,
er ist sein eigener, in sich
geschlossener Raum. Und dann kann dieser Raum relativ
zu einem größeren Raum
definiert werden , der in neun von
zehn Fällen globaler Raum ist. In diesem Fall nehmen wir zum Beispiel an, dass
unser Spielknoten wir in der vorherigen
Lektion erstellt haben, der globale Raum ist und wenn sein Ursprung von 000
der Totpunkt von allem
ist , was unser Spiel verwendet, und dann sagen wir, dass sich unser Panzer, unser gesamter
Tank, relativ zum
Ursprung des globalen Raums
bei 7,34 befindet relativ zum
Ursprung des globalen Raums
bei 7,34 Nun, da der Tank
seinen eigenen lokalen Raum hat, befindet sich
der Körper des Panzers
bei 00 oder
ich glaube nicht, dass dies der Fall ist. Lassen
Sie uns die Transformation überprüfen. Nein, der Körper des Panzers befindet sich
bei 0,626 im lokalen Raum, was Sie dann zur globalen
Position
des Panzers hinzufügen würden , um
die tatsächliche globale
Position dieses Objekts zu erhalten die tatsächliche globale
Position dieses Es ist also alles hierarchisch. Sie können einen Drilldown durchführen und
mehrere lokale Bereiche einrichten. So hat zum Beispiel der
Panzerturm seinen eigenen lokalen Bereich, weil sich unter
ihm mehrere
Objekte befinden Der Ursprung des Panzers oder der
Geschütztürme ist also Null, Null, das Fass ist
eigentlich seine Position bezieht
sich auf die
Position des Panzers und so weiter und so fort Das alles ist wirklich
kompliziert. Aber all das ist im Grunde eine extrem ausgefallene
Art zu sagen, dass diese 00 tatsächlich
ein anderer
Koordinatensatz im Weltraum sein kann , aber wenn es um
Vektorberechnungen geht, spielt das
alles keine Rolle. Vektoren werden also eine Größe
haben, und was die Größe
ist, ist die Länge dieser Linie. Lassen Sie uns das so ändern
, dass der Endpunkt hier ist. Bei einem Strahlwurf
, der ein Vektor ist, wird
der Endpunkt des Vektors
also der Endpunkt des Vektors durch den
Zielpositionsparameter angegeben. Und in diesem Fall haben
wir 56 mal 24. Das ist also diese Koordinate hier. Es sind 56 X und 24 Y. Die Größe des Vektors ist
nun die
Länge dieser Linie, die mathematisch nach
dem Satz
von Pythagoras berechnet wird, der nicht leicht auszusprechen ist
, weil er hier ein rechtwinkliges Dreieck Die Größe des Vektors ist
nun
die
Länge dieser Linie, die
mathematisch nach
dem Satz
von Pythagoras berechnet wird, der nicht leicht auszusprechen ist
, weil er hier ein rechtwinkliges Dreieck bildet. Zum Glück
müssen wir uns nicht wirklich darum kümmern, weil Gadot uns
Vektorklassen für
GD-Skripte zur Verfügung stellt , die alles
berechnen, was Sie für einen Vektor berechnen weil Gadot uns
Vektorklassen für
GD-Skripte zur Verfügung stellt, die alles
berechnen, was Sie für einen Vektor berechnen möchten. Sie können seine Größe berechnen. Sie können Dinge
wie Punktprodukte berechnen. Sie können sie addieren
und subtrahieren, worauf wir gleich eingehen Aber es ist eine gute Idee,
diese Konzepte zumindest
auf einer grundlegenden Ebene zu kennen diese Konzepte zumindest ,
sodass Sie sagen können
: Oh, um das mit einem Vektor zu machen, muss
ich diese beiden
speziellen Dinge tun, und wir werden uns gleich ein paar
davon ansehen Aber im Moment reden wir
nur ein bisschen über Wortschatz. Die Koordinaten sind also der Punkt des Vektors relativ zum
Ursprung des Vektors, und dann ist die Größe
des Vektors die
Länge dieser Linie. Nun, natürlich die Größe der
wir alle
möglichen netten Dinge tun können, zum Beispiel, wenn wir die Entfernung
zwischen zwei Objekten
in unserer Spielwelt ermitteln wollen , wenn wir annehmen, dass
eines der Objekte der Ursprung des Vektors und dann die Position
des zweiten Objekts im Weltraum der
Endpunkt des Vektors ist. Wenn wir die
Größe des Vektors berechnen würden, wüssten wir
die Entfernung der Objekte
untereinander in Metern. Und wir werden uns
das ein wenig ansehen, wenn wir in einer späteren Lektion
über das Zielen und Abfeuern von
Kugeln sprechen in einer späteren Lektion
über das Zielen und Abfeuern von
Kugeln Lassen Sie uns also einen zweiten Strahlwurf hinzufügen. Und den
ersten verschieben wir hierher. Und tatsächlich werden wir
sie ein bisschen kleiner machen. Aber wie dem auch sei, wir werden zu
diesem und zu jenem gehen. Nun, Vektoren, bevor wir weitermachen, ein Vektor mit einer Größe wird
ein Vektor mit einer Größe
von eins als
normalisierter Vektor bezeichnet Und wir verwenden normalisierte Vektoren
häufig beim Lesen von Eingaben und auch überall dort, wo wir
nicht wollen,
dass der Vektor mangels eines besseren Begriffs durch die Länge
des Und das werden wir uns ansehen, wenn wir mehr über Eingaben sprechen Aber da Vektoren
mathematische Strukturen sind, können
wir sie addieren und voneinander subtrahieren Also nehme ich diesen Vektor hier und füge
ihn diesem Vektor hier hinzu Visuell gesehen bedeutet
das, dass
ich das hätte lassen sollen
, wo es ist. Aber wie dem auch sei, visuell gesehen, wenn Sie zwei Vektoren hinzufügen, erhalten Sie genau
das. Sie nehmen den ersten Vektor, und wenn Sie ihm den
zweiten Vektor hinzufügen, platzieren
Sie
ihn im Grunde ganz am Ende
des Vektors. Und dieser neue Endpunkt entspricht
einem dritten Vektor. Ups. Versuchen wir das nochmal. Also setzen wir das wieder auf Null. Und lassen Sie mich das tatsächlich
ändern, damit es etwas klarer
ist. Wenn wir also diesen
Vektor zu diesem Vektor hinzufügen, erhalten
wir funktionell
diesen Vektor, denn
Sie addieren die Koordinaten
der beiden Endpunkte Dieser ist also 24 32, und wenn wir dann 016 hinzufügen, erhalten
wir diesen dritten
Wert, nämlich Und das ist wichtig,
denn wenn wir
das in
etwa zwei Lektionen sehen werden, wenn wir
anfangen, unseren Panzer zu bewegen, werden wir unseren Panzer
so bewegen dass die Geschwindigkeit
oder Geschwindigkeit des Panzers durch einen Vektor
dargestellt wird, und wir werden diese Geschwindigkeit
ändern, indem wir diesem Vektor mehr Geschwindigkeit
hinzufügen Als zweiter Vektor. Und
das wird etwas klarer, wenn wir es tatsächlich mathematisch
betrachten Aber so wäre
es im visuellen Raum. Nun, die andere Sache,
die wir uns kurz ansehen werden, ist, wie
man Vektoren subtrahiert Wenn wir also
diesen dritten Vektor
hier nehmen und ihn
vom ersten Vektor subtrahieren würden , würden
wir das
Äquivalent des zweiten Vektors erhalten Und ich werde das
herumdrehen. Was bedeuten würde, dass es eine schnelle und schmutzige
Methode ist,
herauszufinden , wie sich zwei Objekte gegenüberstehen
können Wenn wir also
den Vektor herausfinden wollten , wollten wir die Richtung
herausfinden, in
die etwas an dieser
Position
schauen müsste , um
etwas an dieser Position zu sehen, würden
Sie die beiden Vektoren
subtrahieren,
die
ihre Positionen würden
Sie die beiden Vektoren
subtrahieren,
die repräsentieren Vektormathematik ist also ein sehr
langwieriges und kompliziertes Thema. Aber vorerst
müssen wir nur wissen, dass Vektoren durch einen Punkt
im Drei-D-Raum
oder im Zwei-D-Raum
dargestellt werden . Und indem Sie
sie entweder addieren
oder subtrahieren oder die
Länge des Vektors berechnen, können
Sie verschiedene Eigenschaften erhalten oder verschiedene Dinge
in der Spielwelt bewirken Und wie ich schon sagte,
wenn wir in
ein oder zwei Lektionen anfangen, Dinge zu verschieben, wirst
du sehen, wie das im Code
funktioniert
12. Der CharacterBody3D-Knoten: Willkommen zurück. In dieser Lektion werden
wir endlich anfangen, uns mit
den Dingen
zu befassen , die
unser eigentliches Spiel ausmachen, und wir werden mit dem Programmieren beginnen. Aber bevor wir das tun,
werden wir ein wenig außer
Betrieb gehen, denn wenn Sie sich erinnern, ist es dunkel,
wenn Sie Ihr
Spiel ausführen. Jetzt werden wir in
einer späteren Lektion über Beleuchtung
und Umgebung
sprechen . Aber im Moment werden
wir uns eine sehr
schnelle und schmutzige Methode ansehen,
um die Beleuchtung
, die wir in dieser
Szene
standardmäßig haben , in unser Spiel zu integrieren. Und das geschieht unter
Umweltgesichtspunkten. Die drei Punkte
neben diesen Schaltflächen
hier lassen also die Vorschausonne und die Vorschauumgebung erscheinen. Und schon jetzt gefällt uns
das Aussehen, also klicken wir einfach auf Sonne zu Sonne
hinzufügen. Und dass Gadot
alle Einstellungen, die
die aktuelle Sonne in
diesem Vorschaufenster zeigt, in
einen Richtungslichtknoten kopiert die aktuelle Sonne in
diesem Vorschaufenster zeigt , in und zur Arena hinzufügt Und jetzt, wenn wir
unser Spiel starten, ist es beleuchtet, wenn auch nicht so hell, wie
es sein könnte, weil wir
offensichtlich
kein Hintergrundlicht
von der Umgebung haben kein Hintergrundlicht
von der Umgebung Aber auch das werden wir uns später
ansehen. Im Moment
müssen wir nur sehen, was wir tun. Gehen wir also zurück zu unserem Tank. Gadot kannst du Skripte, also Mini-Programme
,
an jeden Knoten in deinem Spiel
anhängen Mini-Programme
,
an jeden Knoten in deinem Spiel Und durch das Zusammenspiel
dieser Skripte
entsteht ein Spiel Also
fügen wir hinzu, dass wir auf die
Hauptebene unseres Tanks klicken und wir werden
zu dieser Schaltfläche hier gehen, ein neues
oder vorhandenes Skript angehängt wird. Wir behalten die
Sprache als GD-Skript und sie erbt Knoten
drei D.
Das werden wir in Kürze ändern. Ja, lass uns das jetzt machen. Okay. Also unser Tank ist derzeit
ein Knoten drei D, und bis jetzt war
das in Ordnung, aber wir wollen das
tatsächlich ändern. Also klicken wir mit der
rechten Maustaste und ändern den Typ. Und wir werden es ändern, das werden
wir nicht tun. Wir werden es in
einen Charakter Körper drei D ändern .
Was ist nun ein Charakter
Körper drei D? Ein Charakterkörper drei D ist
Körper ein Physikkörper drei D, der
die Basis aller auf
Physik basierenden Knoten in Gadot ist Und wir wollen Physik, weil wir Dinge
wie die Möglichkeit
haben
wollen,
unsere Charaktere zu bewegen und sie miteinander kollidieren zu lassen und Physik zu betreiben Nun, da unser Panzer
durch unsere Skripte
und durch unsere Steuerung
gesteuert wird Skripte
und durch unsere Steuerung
gesteuert , die der Spieler verwendet Wir wollen nicht, dass der Panzer ausschließlich von der Physik
beeinflusst wird. Wir werden also den D-Node des
Charakters Body Three verwenden. Dabei handelt es
sich um einen Knoten,
der nur so mit
den Physiksystemen
interagiert , wie es
das Skript, das wir ihm anhängen
, vorgibt. Und das macht momentan nicht viel Sinn, aber bleib bei mir und in ein paar Augenblicken wird alles klar
sein Also ändern wir den
Panzertyp auf Charakterkörper zwei D
oder Charakterkörper drei D, und wir
haben sofort ein Problem Gadot wird uns warnen, dass
dieses Objekt keine Form hat, also nicht
mit anderen Objekten kollidieren und dass es nicht
mit anderen Objekten interagieren kann Und im Moment ist uns das
egal. Also lassen wir uns einfach
weiterhin von Gadot warnen und
uns beschweren, und wir werden
es vorerst einfach ignorieren, und wir werden uns später darum kümmern Also lasst uns noch einmal versuchen, ein Skript an
Gado
anzuhängen und jetzt können wir sehen, dass es vom dritten
Charakterkörper
D erbt . Das liegt daran GD-Skript eine
objektorientierte Skriptsprache ist, was bedeutet, dass du
den Objekten in deinem
Spiel, wie deinem Panzer, mitteilen kannst , dass es Verhalten
von einem anderen Knoten erbt. Also, was wir hier tun,
ist Gadot zu sagen , dass unser Panzer ein
Charakterkörper drei D ist, aber er wird
einige zusätzliche Dinge enthalten, die wir hinzufügen werden. Wir wollen also alle Verhaltensweisen und
den gesamten Code und
alles, was
der Charakterkörper 3 D standardmäßig enthält, und dann werden
wir noch einige zusätzliche
Funktionen hinzufügen Funktionen Und es wird uns fragen, wo wir unser Drehbuch platzieren
wollen. Und ich mag es,
die Dinge zu organisieren, also werde ich
ihm sagen, dass er einen anderen Ordner verwenden soll. Ich lege alle meine Skripte gerne
in einem eigenen Ordner ab. Also öffnen wir und dann haben wir einen neuen
Ordner namens scripts erstellt, und jetzt werden
wir unser
Tank-Skript in diesen Skriptordner legen . Sie können dasselbe auch
mit den Szenen machen. Normalerweise habe ich
einen Ordner
für Drehbücher und einen weiteren
Ordner für Szenen. Aber ja, vorerst ist
es völlig in Ordnung. Wir
werden eigentlich nicht mehr
viele Szenen in diesem Spiel haben , also
wird diese
Art von Organisation nicht notwendig sein. Aber vielleicht werde ich die Dinge
verschieben , sobald wir
tatsächlich anfangen,
Soundeffekte und
Texturen und so weiter hinzuzufügen Soundeffekte und
Texturen und so weiter Gadot ist in der Tat
intelligent genug, dass in den meisten Fällen, es in den meisten Fällen, wenn Sie Objekte in
verschiedene Ordner
verschieben, aktualisieren kann Ihren Szenenbaum und alle relevanten Links ohne dass Sie sie
manuell aktualisieren müssen Sie können Ihre Sachen also
beliebig verschieben ,
ohne dass sie kaputt gehen Okay. Jetzt, wo wir dieses Skript
erstellt haben, haben
wir ein leeres Skript. Und ganz oben haben wir
das Schlüsselwort extends
character body three D, und so weiß Gudo,
dass unser Panzerskript, das jetzt
an unseren Panzercharakter angehängt
ist, von
Charakterkörper drei
D erben wird . Wir können ihm, wenn wir wollen, einen eigenen Klassennamen geben,
sodass
wir innerhalb des Spiels wissen, dass es vom
Klassentyp Tank ist , und dann
können wir es als solchen bezeichnen. Also ja, lass uns das machen. Jetzt habe ich die
Standard-Skriptvorlage deaktiviert. Normalerweise erhalten Sie ein paar zusätzliche Kommentare und einige Standardfunktionen, die für Sie
definiert wurden, aber wir werden
sie trotzdem in Kürze neu definieren Und dann können
Sie in Zukunft entweder
die Vorlage einschalten oder
sie so oder so weglassen Aber ja, so fangen wir an
und dann drücken wir einfach Controls, und dann drücken wir einfach Controls um sicherzugehen, dass wir
nichts verlieren. Und bevor wir
zur nächsten Lektion übergehen und
über die Steuerung
unseres Panzers über Benutzereingaben sprechen, schauen wir uns die Grundlagen
an wie wir
mit einem Charakterkörper drei D interagieren werden . Der
Charakterkörper drei D hat
also eine Funktion, die als
Physikprozess bekannt ist. Und da es existiert, wird
Gados Eingabe oder Autocomplete versuchen, es für uns zu
erstellen,
damit wir es zulassen können, und dann müssen
wir uns auf diese Weise keine Gedanken darüber machen, uns
an seine
Funktionssignatur zu erinnern. Und als Variable benötigt es die Zeit,
die zwischen Aufrufen
des Physikprozesses
vergangen ist zwischen Aufrufen
des Physikprozesses
vergangen Das wird als Float ausgedrückt, also
wird es wahrscheinlich
0,012 oder so ähnlich sein , W natürlich,
wobei Eins eine volle Sekunde Der physikalische Prozess wird mit einer
Geschwindigkeit von 60
Mal pro Sekunde aufgerufen , genau darauf läuft auch die
Physik-Engine, die Gadot verwendet Zum Glück
müssen wir keine
unserer Geschwindigkeitsoperationen
innerhalb des physikalischen Prozesses
auf Charakterkörper
3 D nach Delta skalieren unserer Geschwindigkeitsoperationen
innerhalb des physikalischen Prozesses auf Charakterkörper
3 D nach Delta weil all die Berechnungen unter der Haube dies
bereits berücksichtigen Aber bei anderen Arten
von physikalischen Objekten werden
wir das tun, und wir werden uns
damit befassen, wenn es soweit ist Aber wie dem auch sei, wir müssen keine Variable namens
Geschwindigkeit
definieren, weil sie bereits in den dritten Teil der
Figur D eingebaut
ist.
Wenn wir sie also einfach richtig buchstabieren, können
wir diesem Wert einen neuen Vektor
drei zuweisen. Und das tun wir,
indem wir das Konstruktorschlüsselwort Vector Three Und wie Sie sehen können, versucht Gadot
uns zu sagen , dass Sie diese Variable auf diese Weise
definieren
und dass dies die Werte sind, die
Sie in sie eingeben müssen Also wollen wir eigentlich
diesen dritten , weil wir
das X, das Y und
das Z selbst bereitstellen Y und
das Z selbst Wenn wir das also tun würden, würden
wir eine Geschwindigkeit
von Null angeben , was natürlich
bedeutet, dass sich unser Panzer nicht bewegen
wird, aber das werden wir
nicht tun. Wir wollen, dass sich unser Panzer in X-Richtung
bewegt. In diesem Fall
wird er sich also genau
entlang der X-Achse bewegen entlang der X-Achse ,
weil
er derzeit in diese Richtung zeigt. Also werden wir diesen Wert auf, sagen
wir, zehn
ändern , einfach
so Und jetzt
hat der
Körper der Figur 3 D eine Methode namens
bewegen und rutschen, und bewegen und rutschen
nimmt die Geschwindigkeit an, führt eine ganze Reihe führt eine ganze Reihe
verschiedener Berechnungen damit und
bewegt dann letztendlich den Panzer Und da wir die Geschwindigkeit bei
jedem physikalischen Prozess
auf diesen konstanten Wert
zwingen , wird sie sich nie
verlangsamen oder so. Und wenn wir hier die
Play-Taste drücken, können
Sie jetzt sehen, dass sich unser
Panzer vorwärts bewegt,
und er wird sich weiter
vorwärts bewegen, bis die
Hitzetiefe des Universums erreicht ist und er wird sich weiter
vorwärts bewegen . Beachten Sie auch hier, dass
er nicht fällt,
und das liegt daran, dass wir
ihm keinen Abwärtsvektor zugewiesen haben ,
um die Schwerkraft zu simulieren Also auch hier bleiben Y, die
Auf-
und
Abwärtsgeschwindigkeit und
die Z-Geschwindigkeit, also rein und raus, konstant bei Null, und der Tank bewegt sich auf eine Geschwindigkeit von zehn Nun, was bedeutet zehn
eigentlich? Ähm, ich bin mir nicht hundertprozentig sicher. nicht in Metern pro
Sekunde oder Fuß pro Sekunde oder so
oder in Einheiten pro Sekunde angegeben Soweit ich weiß,
sind
die Werte für die Geschwindigkeitsberechnungen nicht in Metern pro
Sekunde oder Fuß pro Sekunde oder so
oder in ,
sie sind willkürlich. Also eines der Dinge, die
Sie tun müssen, um Ihren
physikalischen Prozess zu verfeinern, ist, mit einem Wert zu beginnen und dann so lange
mit diesen Werten herumzuspielen bis sie tatsächlich
etwas ähneln , das Sie wollen,
leider. Ich werde einige
Nachforschungen darüber anstellen,
und wenn sich
herausstellt, dass es falsch ist, werde ich es
in einer zukünftigen Lektion aktualisieren. Aber lassen Sie uns zunächst mit der nächsten Lektion fortfahren
. Dort werden wir sehen, wie Sie die
Tastatursteuerung erfassen können, um dies zu ändern und den Panzer
tatsächlich so zu
bewegen, wie wir es
wollen. Ich werde dich dort sehen.
13. Reaktion auf Spielereingaben – Bewegung: Willkommen zurück. In dieser Lektion werden
wir
lernen, wie man die Tastatursteuerung
des Benutzers abfragt Tastatursteuerung
des Benutzers um unseren
Panzer
im Drei-D-Raum zu manövrieren Alle Bewegungen oder das gesamte Lesen von
Eingaben in
Gdo werden also durch sogenannte
Aktionen ausgeführt Und wir können die für
ein Projekt festgelegten
Aktionen unter den
Projekteinstellungen und der Eingabekarte einsehen ein Projekt festgelegten
Aktionen unter den
Projekteinstellungen und der Eingabekarte Nun, deine wird
standardmäßig so aussehen , weil GADO eine
Menge integrierter Aktionen hat, aber aus irgendeinem Grund weigert
es sich,
sie dir zu zeigen , bis du
auf diese Schaltfläche Und hier kannst du eine
ganze Reihe von ihnen sehen. Diejenigen, an denen wir am meisten interessiert
sind, sind die für
die Benutzeroberfläche, also speziell
die Benutzeroberfläche links, die
Benutzeroberfläche rechts, die Benutzeroberfläche hoch und die Benutzeroberfläche unten. Und Sie können hier sehen
, dass sie
einer Reihe verschiedener
Steuerkonfigurationen zugeordnet sind einer Reihe verschiedener
Steuerkonfigurationen linke Benutzeroberfläche ist also dem
Linkspfeil auf der Tastatur
sowie einer bestimmten
Joypad-Schaltfläche oder einem JoyPad-Zugriff zugeordnet sowie einer bestimmten
Joypad-Schaltfläche oder einem JoyPad-Zugriff Es spielt also keine Rolle
, welches Steuergerät Sie verwenden. Wenn du einen
Joystick einsteckst und
die entsprechende Taste drückst ,
wirst du mich verlassen Oder wenn Sie
den Linkspfeil auf
der Tastatur drücken ,
wird ich links angezeigt Oder wenn Sie es
einer Maustaste zuordnen, was Sie manuell tun können, tut
es das auch. Aber wir werden nichts von dem Zeug
machen. Aber du kannst tatsächlich
deine eigenen kreieren. Wenn
Sie also zum Beispiel die
Kartenanzeige direkt auf die Taste legen
möchten, könnten Sie eine neue
Aktion namens Map erstellen und sie
dann dem MK zuordnen,
und schon Kartenanzeige direkt auf die Taste legen
möchten, könnten Sie eine neue
Aktion namens Map erstellen und wären Sie damit fertig. Das erste, was wir tun werden
, ist also, innerhalb des Spielobjekts
einen Verweis auf den
Panzer des Spielers anzugeben . Und es sieht so aus, als hätte ich es hier
bereits umbenannt, aber so sah es
ursprünglich aus. Also war es Tank, und dann werden
wir
es in Player Tank umbenennen. Und der Grund, warum wir ihn
umbenennen, ist, dass wir
irgendwann eine
ganze Reihe von Panzern
haben , die Feinde
und dergleichen repräsentieren, und wir wollen nicht wissen
müssen, welcher welcher ist. Das wird
also der Spieler sein. Und einer der anderen Gründe
, warum wir ihm einen Namen geben, ist ,
dass wir ihn direkt mit
den Steuerelementen
manipulieren können ihn direkt mit
den Steuerelementen
manipulieren , was
wir gleich sehen werden. Wenn wir zum Spielskript gehen
und das Schlüsselwort export verwenden, können
wir jede Variable, die wir unter dem Schlüsselwort export
definieren, so einrichten
, dass unter dem Schlüsselwort export
definieren sie hier im
Inspektor angezeigt wird. Wenn ich also zum Beispiel
einfach eine Variable
namens X definiere , wirst du sie nicht sehen. Aber wenn ich diese Variable
exportieren
und Export
korrekt buchstabieren und dort die
richtige Anmerkung verwenden würde und Export
korrekt buchstabieren ,
oh ja, sie setzt voraus, dass sie einen Typ
erfordert, also los geht's. Wenn ich
das nun tun würde,
erscheint die Variable X im Inspektor und ich kann
ihre Werte hier ändern, genauso wie wir es für
die Transformation oder
andere Dinge tun würden , die
wir bisher verwendet haben. In diesem Fall werden wir
also eine namens Player erstellen und
ihren Wert an Tank binden. Dadurch
haben wir Gadot gezwungen, alles, was wir da mit reinziehen
,
anzuerkennen oder einzuschränken. Wenn ich zum Beispiel Ana hierher schleppen
wollte, würde mich
Godot nicht lassen Aber wenn ich den
Spieler Tank ziehen würde, was
natürlich ein Panzer ist , Oh Gewinnen Sie, ziehen Sie. Da haben wir's. Jetzt haben wir das zugewiesen.
Wenn wir also aufhören, wenn wir die
Spielervariable in unserem Skript manipulieren, werden die Methoden dieses
speziellen Skripts aufgerufen, das natürlich ein Panzer ist. Und der Grund, warum der Klassenname
zur Verfügung steht uns
der Klassenname
zur Verfügung steht, ist, dass
wir ihn hier definiert haben. Also lasst uns unser Spiel speichern. Drehbuch. Und es sieht auch
so aus, als hätte ich mit der
Aufnahme begonnen , nachdem ich das
Skript an das Spielobjekt angehängt habe. Wenn du also zu Hause
mitmachst, solltest du als allererstes ein Skript an
deine Spielklasse
anhängen , genauso wie wir es
mit einem Panzer gemacht haben, bei
dem
unser Panzerskript an
das Panzerobjekt in
der vorherigen Lektion angehängt wurde. Jetzt, wo wir das zur Verfügung
haben, werden
wir
das Spiel dafür verantwortlich machen, den Input zu das Spiel dafür verantwortlich machen, den sammeln
und nicht den Panzer. Und der Grund, warum
wir das
tun werden , ist, dass
wir später andere Panzer
haben werden, die die Gegner repräsentieren, und wir wollen nicht
den Code, der die
Steuerung für den Spielerpanzer liest,
von den feindlichen Panzern und
all dem anderen Zeug trennen
müssen den Code, der die
Steuerung für den Spielerpanzer liest,
von den . Es ist also besser, einfach
einen generischen Panzer zu haben und dann das Spiel den Panzer des
Spielers direkt manipulieren lassen
und dann die Benutzeroberfläche
die feindlichen Panzer direkt manipulieren die feindlichen Panzer direkt ,
sodass sie
eine gemeinsame Oberfläche haben. Jetzt haben alle Knoten in Gado eine vordefinierte Methode, die als
unbehandelte Tasteneingabe bezeichnet wird, und genau diese werden
wir verwenden Diese Methode wird immer dann aufgerufen, wenn
der Benutzer eine Taste drückt. Immer wenn der Benutzer
eine Taste loslässt, wenn der Benutzer eine Taste
gedrückt hält, oder
alles, was mit einem Schlüsselereignis
in Gadot zu tun hat, wird diese
Methode aufgerufen Und der Grund, warum wir
diese Methode verwenden , anstatt direkt Tastatureingaben des
Benutzers
zu überwachen,
zum Beispiel in der
Prozessmethode oder was auch immer,
ist, dass diese Methoden nur aufgerufen werden, wenn sich
der Schlüsselstatus ändert, sodass wir nicht ständig ziehen und erneut fragen und abfragen Eine der
Grundregeln der
Computerprogrammierung lautet also , nicht mehr Arbeit
zu erledigen,
als Sie müssen Sei so faul wie möglich. Also
wollen wir nicht,
dass Gadot ständig sagt:
Ist der Schlüssel runter? Ist der Schlüssel unten?
Ist der Schlüssel unten? Wir wollen nur, dass der Schlüssel
so lautet: Hey, ich bin ausgefallen und dann muss
Go Gadot darauf reagieren Also das
werden wir hier tun. In dieser Methode werden
wir also zwei Variablen
definieren. Wir werden
eine definieren, die als Turn-Wert bezeichnet wird, und es wird ein Float
sein, und wir werden
eine definieren, die als Move-Wert bezeichnet wird. Und es wird
auch ein Float sein. Und diese Werte werden
entweder Null, negativ eins oder eins sein, abhängig vom
Status unserer Eingabe. Und wie Sie sich vorstellen können, werden
wir
den Tank anhand dieser Werte manipulieren . Was wir also
tun wollen,
ist zum Beispiel, wenn die linke Maustaste oder
der Linkspfeil gedrückt gehalten werden, wir wollen, dass sich der
Panzer nach links dreht, was in die
negative Richtung wäre. Und wenn wir die rechte Pfeiltaste
gedrückt halten, dreht sich der Tank
in die positive Richtung. Und wenn keine Tasten gedrückt gehalten werden, dreht sich
der Tank überhaupt nicht. Und das tun wir, indem wir
die Eingabe Singleton verwenden, die für den
Umgang mit allen
Eingaben in GIDO zuständig ist Umgang mit allen
Eingaben in GIDO Und wir werden eine
Funktion namens G-Achse verwenden. Und Gaxis benötigt zwei Parameter. Es erfordert eine negative
und eine positive Aktion. Und Sie können die
Funktionsdefinition
hier im Hinweis
unter meiner Eingabe sehen hier im Hinweis
unter meiner Eingabe Also lass uns die Benutzeroberfläche
links und ich rechts geben. Nun, was ist dieser ganze Unsinn über positive und
negative Handlungen Nun, es ist möglich
, dass ein Eingabewert einen Wertebereich hat,
weil das
zum Beispiel möglich ist , wenn Sie einen Controller
verwenden um etwas nach links
oder ganz nach links zu
drücken Und Gadot repräsentiert das
mit einem Wert von etwa Null bis Eins, um zu zeigen, wie weit der
Stick nach links gedrückt wird Und
das wollen wir mit dem Wert in
die andere Richtung kombinieren , was nicht wirklich möglich Oder vielleicht ist es das irgendwie. Ich meine, es wird lustig, wenn
man es mit Analogen zu tun hat. Aber
da wir die Tastatur verwenden, ist die Eingabestärke
des linken Befehls
entweder Null, Eingabestärke
des was bedeutet, dass die Taste nicht gedrückt
wird, oder Eins,
was bedeutet, dass die Taste gedrückt
wird. Wir
wollen jedoch unterscheiden , welcher negativ und
welcher positiv ist. Und da ich bereits gesagt habe, dass wir wollen, dass links negativ
dargestellt wird, in diesem speziellen Fall ab, fragt
die
Funktion input get access ob die linke
Aktion stattfindet oder nicht. Wenn dies der Fall ist und es
die negative Aktion ist, dann wird sie eine negative Aktion
zurückgeben. Und da wir die
positive Aktion sind, wenn sie richtig gedrückt hält, dann werden wir eine bekommen. Dieses
Code-Bit gibt also entweder minus Eins,
Null oder Eins
zurück ,
je nachdem, wie diese Tasten gedrückt gehalten
werden. Und wenn Sie beide gleichzeitig gedrückt halten, löschen
sie sich gegenseitig aus
und es wird Null angezeigt, was wir auch wollen. Also werden wir
dasselbe für den Verschiebungswert tun, obwohl
es in diesem Fall UI
down und I up sein wird ,
was ein bisschen rückwärts erscheint, aber Gadot steht für Vorwärts und Rückwärts mit der Z-Koordinate
und der Z-Koordinate, und ich werde Ihnen das hier
zeigen. Die Z-Koordinate zeigt also in
diese Richtung. Die ist auf dich gerichtet, und das
ist die positive Richtung. Ein Rückgang von Z ist also positiv. Ein Anstieg von Z ist negativ. Normalerweise würden wir uns also einen Anstieg als positiv
vorstellen, aber in Wirklichkeit ist es rückwärts Deshalb drehen wir
es hier im Drehbuch um. Und Gadot beschwert sich,
weil
ich den Unterschied
zwischen einem Plus und einem Gleichen eindeutig nicht kenne Jetzt, wo wir diese Werte
haben, können
wir überprüfen, ob wir das
bekommen, was wir wollen, indem wir sie
ausdrucken .
Also lass uns das machen. Also jetzt, wenn ich mein Spiel starte. Nun, der Tank bewegt sich,
weil wir
den Code aus unseren
vorherigen Lektionen nicht entfernt haben. Also lass uns
das vorerst einfach ignorieren. Es wird
nirgendwohin führen. Aber du wirst sehen, wenn ich nach oben drücke und
loslasse , dass die
Eingangsstärke erhöht ist. Und runter. Und wenn ich jetzt rechts und links mache, bekommen
wir unsere Nullen und unsere negativen Einsen genau
so, wie wir sie haben wollen. Lassen Sie uns also diesen Code
aus dem physikalischen Prozess entfernen
und das Schlüsselwort pass
hier einfügen, und das Schlüsselwort pass
hier einfügen um anzuzeigen, dass es sich um eine leere Funktion
handelt, und wir
müssen einige Werte
und Variablen definieren ,
damit unser Tank funktioniert Als Erstes müssen
wir also ein paar
Werte definieren, um
zu bestimmen, wie schnell sich unser Panzer bewegen und drehen wird
. Also werden wir eine
Variable namens Wendegeschwindigkeit exportieren. Und eine Sache, die man beachten
sollte, ist, dass
Gadot technisch gesehen Snake-Groß- und
Kleinschreibung verwendet Aber ich bin seit 15 Jahren Programmierer
bei Sea
Sharp und Java ,
also neige ich dazu, Camel Case
zu verwenden Ich werde wahrscheinlich während des gesamten
Kurses
uneinheitlich zwischen den beiden
hin- und herwechseln gesamten
Kurses
uneinheitlich zwischen den beiden
hin- und herwechseln , folgen Sie
also nicht meinem Beispiel.
Such dir einen aus und bleib dabei Aber wie dem auch sei, Turnspeed
wird
ein Float sein und Move-Speed wird
auch ein Float sein Und ich werde Ihnen auch
einen netten kleinen Annotationstrick zeigen einen netten kleinen Annotationstrick , falls Sie
mit älteren Versionen in
Gadot vertraut sind, irgendwann in der 4.2-Ära hinzugefügt wurde . Ich bin mir nicht
ganz sicher wo Aber wenn du einen Tooltip
hinzufügen möchtest, dann lass uns hier
zu unserem Tank gehen. Ihr könnt sehen, dass wir Geschwindigkeit und
Bewegungsgeschwindigkeit geändert haben,
und wenn ihr den Mauszeiger darüber bewegt , erhaltet ihr einen Tooltip mit der Aufschrift „ Keine Beschreibung verfügbar“.
Und das macht dich traurig Wenn Sie also einen Tooltip
hinzufügen möchten, verwenden Sie
einfach einen doppelten Hashtag. Ein einzelner Hashtag ist ein Kommentar, was bedeutet, dass Godo ihn ignoriert Aber wenn es ein doppelter
Hashtag ist, ist es ein Tooltip. Lassen Sie uns also die Geschwindigkeit in Grad angeben. Eher die
Drehgeschwindigkeit des Panzers in Grad. Und es hat eine etwas
andere Farbe, sodass Sie sehen können, dass
es sich um eine Anmerkung handelt. Wenn wir jetzt rüber
gehen, haben wir Tooltipps und es ist wunderbar. Seitdem ich davon
erfahren habe, bin ich in sie verliebt. Ich kommentiere jetzt alles. Also, wie versprochen, habe
ich tatsächlich ein bisschen nachgeforscht
und herausgefunden, dass Godot,
obwohl Godot die drei D-Rastereinheiten
als Meter
bezeichnet und
so tut , als
wäre es dieselbe
Maßeinheit wie in Blender,
der wäre es dieselbe
Maßeinheit wie in Blender, auch Einheiten verwendet,
Godot egal Es ist nur eine Einheit. Sie können sie
als Zoll, Meter, Freiheitseinheiten, wie auch immer
Sie sie nennen wollen, betrachten, und die Berechnungen werden
alle gleich funktionieren. Also ja. Wir werden es einfach willkürlich als Meter
betrachten. Ich glaube nicht, dass es wirklich wichtig ist. Und wir werden hier
einige Standardwerte angeben. Unsere Wendegeschwindigkeit
in Grad ist also 20, und lassen Sie uns
einfach Grad sagen. Und der Grund, warum wir das so
definieren, ist
, dass die Rotation
in Gado sowohl in
Grad als auch im Bogenmaß gehandhabt werden kann in Gado sowohl in
Grad als auch im Bogenmaß Intern, in der Engine, wird
alles in Radiant angegeben, aber sie akzeptiert in
vielen Fällen Grad als Eingabewerte, und Sie können ziemlich einfach zwischen
den beiden umrechnen den beiden Ich persönlich und oft, wenn man
Drei-D-Modellierung und
solche Sachen macht , ist
es einfach einfacher, in Graden zu
denken denn wenn man Winkel sagt,
was denken dann die meisten Leute Sie denken 45-Grad-Winkel, 90-Grad-Winkel, rechter
Winkel, was auch immer. Und das alles ist in Grad, aber alles andere
ist im Bogenmaß Daher ist es normalerweise eine
gute Idee, anzugeben , welchen Wert Sie erwarten , wenn Sie
eine Variable wie diese erstellen Also ja, die Drehgeschwindigkeit in 2 Graden. Und die Bewegungsgeschwindigkeit wird in
Einheiten pro Sekunde angegeben, also
müssen wir dort nichts wirklich definieren. Entspricht zehn. Also nochmal, zehn Einheiten pro Sekunde. Jetzt
benötigen wir ein Methodenpaar
, um diese Werte zu
aktualisieren,
und wir werden auch die Werte
selbst benötigen, weil das nur Konstanten
sind Das heißt einfach, hey, wenn sich der Tank dreht, dreht
er sich
mit 20 Grad pro Sekunde, aber wir brauchen etwas, das die
aktuelle
Umdrehungsgeschwindigkeit
des Panzers überwacht aktuelle
Umdrehungsgeschwindigkeit
des Panzers Und wir werden gleich sehen,
warum das so ist. Definieren wir also einfach eine Variable
namens Rotationsgeschwindigkeit. Und das ist ein Float, und dann haben wir eine
weitere, die
Bewegungsgeschwindigkeit genannt wird. Und diese Werte werden durch die Eingabe geändert,
wie wir gleich sehen werden. Aber das Erste, was wir tun
müssen, ist, ein paar
weitere Funktionen zu definieren, und eine davon wird als
Soll-Turn-Geschwindigkeit bezeichnet. Und es wird einen
Eingabewert annehmen, der ein Float ist. Und im Moment setzen wir
es einfach auf Pass, damit es nichts
tut. Das nennt man Stubbing
Out einer Funktion. Wir können sie definieren, ohne
tatsächlich Informationen zur Verfügung zu stellen, damit wir das Framework einrichten
können Und wir werden die Bewegungsgeschwindigkeit festgelegt
haben. Jetzt, wo wir diese Werte haben, können
wir zum Spiel zurückkehren, und anstatt diese Werte einfach
auszudrucken, können
wir den
Panzer des Spielers nehmen und
seine Zuggeschwindigkeit
auf der Grundlage seines Zug-Werts festlegen . Und wir können die
Bewegungsgeschwindigkeit des Spielers auf der Grundlage
seines Bewegungswerts festlegen . Also
, was bedeutet das alles? Das bedeutet, dass, wenn sich
der Zustand der Tasten ändert, also wenn der Benutzer eine Taste drückt
oder loslässt, diese Information berechnet
wird, wie wir bereits erwähnt haben, und diese
Werte dann die vorhandenen Dreh
- und Bewegungsgeschwindigkeiten
ändern. Wenn sich der Tank also überhaupt
nicht bewegt, wird
seine Umdrehungsgeschwindigkeit Null sein. Was sich in der Tatsache widerspiegeln
wird , dass der übergebene
Wendewert Null ist. Und wenn sich der Tank
nach links dreht, nun ja, dann entspricht die Umdrehungsgeschwindigkeit der aktuellen Drehgeschwindigkeit, die durch die Richtung
modifiziert wird. Es wäre also negativ 20 für links und positiv 20 für rechts. Wir
wollen also die Drehzahlvariable
gleich der Umdrehungsgeschwindigkeit des
Tanks in
Grad
multipliziert mit dem Eingabewert
setzen gleich der Umdrehungsgeschwindigkeit des
Tanks in Grad
multipliziert mit dem Eingabewert Also nochmal, wenn wir die linke Taste
gedrückt hätten, wäre
der Eingabewert
gleich minus Eins Das bedeutet, dass die
Drehzahl
20 mal minus eins wäre ,
was minus 20 ist, was bedeutet, dass sich der Tank minus 20 Grad drehen würde, was ihn nach links und
dasselbe nach rechts drehen würde. Und wir werden dasselbe für
die Bewegungsgeschwindigkeit tun . Also die Bewegungsgeschwindigkeit wird
gleich sein Nun, äh, Bewegungsgeschwindigkeit wird gleich der Bewegungsgeschwindigkeit
sein, und
hier habe ich tatsächlich
zwei Variablen erstellt , die
mehrdeutig benannt sind, also sollten Sie das nicht tun Nennen wir das Vorwärtsgeschwindigkeit. Nennen wir das nun Bewegungsgeschwindigkeit, und das hier ist Vorwärtsgeschwindigkeit. Vorwärtsgeschwindigkeit
entspricht also der
Bewegungsgeschwindigkeit mal dem Eingabewert. Und jetzt, wo wir diese Werte
haben, können
wir die
bestehenden Werte des Tanks mit diesen neuen
Werten im physikalischen Prozess modifizieren . Wie ich bereits
erwähnt habe, ist der physikalische Prozess , 60
Mal pro Sekunde aufgerufen
wird,
und das ist der Ort, an dem Sie alle Manipulationen
von,
sagen wir, Geschwindigkeit oder Rotation vornehmen
oder irgendetwas, das die physikalischen Werte
der Tanks beeinflussen würde In unserem Fall
wäre das also die Geschwindigkeit des Panzers und
natürlich die Rotation des Panzers Das erste, was
wir tun werden, ist, die Rotation
des Panzers gleich
seiner aktuellen Umdrehung
plus der Umdrehungsgeschwindigkeit einzustellen Rotation
des Panzers gleich
seiner aktuellen Umdrehung . Also, wie machen wir das?
Nun, es gibt zwei Möglichkeiten. Es gibt eine Variable innerhalb des dritten Knotens D, die
als Rotation bezeichnet wird, aber es gibt auch eine Variable, die
als Rotationsgrad bezeichnet wird. Und wie gesagt, da ich
gerne in Grad arbeite und Drehungsgrad dafür
eine praktische
Variable ist , setze
ich die Rotationsgrade
gleich einem neuen Vektor Drei und wir beginnen
mit drei Nullen Das bedeutet also, dass
es absolut keine Rotation Aber wir
wollen den Tank entlang
der Y-Achse drehen , weil die Y-Achse gerade auf und ab verläuft. Und wenn wir
den Tank entlang dieser Achse drehen würden, würde sich
der Tank tatsächlich an Ort und Stelle
drehen. Wie Sie hier sehen können, da
es die hellgrüne Linie und das ist die
hellgrüne Drehung, würde sich
der Panzer auch so bewegen,
wenn ich das bewegen würde. Und genau das
wollen wir im Code tun. Also gehen wir zurück zu
den Drehungsgraden und wir wollen
die Y-Komponente ändern. Die Y-Komponente
entspricht jetzt also der Drehzahl mal Delta. Und das liegt daran, dass
wir sie
um die Zeit skalieren wollen um die Zeit , die zwischen den Frames vergangen ist,
was Delta ist. Andernfalls würde die Umdrehungsgeschwindigkeit, die 20 oder minus
20 ist die 20 oder minus
20 ist, 60 Mal pro Sekunde
aufgerufen,
was bedeutet, dass sich die Drehung alle
60stel-Sekunden um 20 Grad in
beide Richtungen aktualisieren würde , und wir wollen keinen Panzer
, der sich wie ein Dach dreht Also das sollte eigentlich funktionieren. Lass uns unser Spiel starten und sehen. Wenn ich jetzt nach links drücke, passiert
absolut nichts. Und wenn ich nach rechts drücke, passiert
absolut nichts. Nun, das ist kaputt. Also gut, lass uns sehen, was das Problem ist Das Problem ist höchstwahrscheinlich , dass wir nicht
Move and Slide machen Ich glaube nicht, dass das der
Fall ist, aber lassen Sie uns das überprüfen. Nein, das ist nicht der Fall. Okay, ich verstehe, was das Problem ist. Das Problem ist, dass
ich die Drehung bedingungslos auf einen Wert setze, obwohl wir wollen, dass
er
dem aktuellen Wert
plus dem neuen Wert entspricht dem aktuellen Wert
plus dem neuen Wert Denn das ist so dass wir entweder
20 oder negative 20 erhalten Und wenn wir die
Rotation nur auf 20 ändern, werden
wir keine konsistente Rotation erhalten
. Wir
gehen davon aus, dass sich der Panzer entweder
bei 20 oder minus 20 von selbst einrastet, und das wird das Ende
sein. Wir wollen, dass es sich Laufe der Zeit allmählich
ändert. Wenn die Rotation also Null wäre, dann addieren wir das so, dass sie innerhalb einer Sekunde
minus 20 ist . Und dann, in der nächsten Runde, ist
es minus 40 über eine Sekunde
und so weiter und so fort. Also das sollte das Problem eigentlich
beheben. Und wir haben es umgekehrt,
und das liegt daran, dass wir die Werte hier umkehren
müssen Perfekt. Jetzt haben wir
einen rotierenden Tank und wir machen fast
das Gleiche für Bewegung. Was wir also
tun müssen, ist, dem Körper
des Charakters drei fest
eingebaute Geschwindigkeitskörper variabel zu setzen, was ich anscheinend nicht buchstabieren
kann. Und die Geschwindigkeit wird
gleich etwas sein. Nun gibt es ein paar
verschiedene Möglichkeiten, anhand seiner Ausrichtung zu bestimmen, wie ein
Knoten bewegt werden soll. Am einfachsten ist einen nach vorne gerichteten Vektor
zu nehmen, ihn mit dem
Wert der Bewegung zu
multiplizieren und diesen dann
auf die Geschwindigkeit einzustellen. Und obwohl das völlig
akzeptabel ist,
empfiehlt
Gadot in den meisten Fällen einer ganzen
Reihe mathematischer Gründe, dies
nicht zu tun Es wird auch ein bisschen kompliziert, weil man die Ausrichtung des Panzers und
die Tatsache berücksichtigen muss Panzers und
die Tatsache berücksichtigen , dass Gadot
denkt, dass Forward in Z-Richtung verläuft,
und allen möglichen
anderen Unsinn, der dich wahrscheinlich
dazu bringt, mich anzusehen Worüber
zur Hölle redet dieser
Typ gerade? Der einfachere Weg besteht darin,
ein internes Tool oder
ein internes Objekt zu verwenden ein internes Tool oder
ein internes ,
das als Transformationsbasis bezeichnet wird Jeder Knoten in Gadot
hat also eine interne Variable
namens transform, und Transform ist genau das,
wonach es sich anhört Es ist im Grunde dieses Objekt hier, das die
Position, Drehung und
Skalierung des Objekts bestimmt und wahrscheinlich noch
ein paar andere Dinge , die ich im
Drei-D-Raum vergesse Und Gadot verwaltet all diese Berechnungen über seine Physik-Engine
unter der Und eine der
internen Variablen der Transformation,
die sie uns gibt ist dieses Ding, das man Basis nennt Die Grundlage ist das Ergebnis
all dieser Berechnungen vor allen zusätzlichen
Änderungen , die Sie möglicherweise vornehmen. Also werde ich
dir zeigen, wie das funktioniert. Hoppla. Control K.
Wir kommentieren sie und lassen
uns zum Spiel zurückkehren, und wir werden das nur ein bisschen
ändern Drucken Sie den Spielerpunkt,
transformieren Sie den Punkt BASIS. Jetzt tippe ich einfach auf eine Taste und
das Spiel läuft nicht mehr. Und das ist die Grundlage. Die Basis ist ein
Vektor von Vektoren. Und was es Ihnen gibt,
ist die Orientierung
Ihres Objekts in einer ganzen Reihe
von verschiedenen Kontexten. Am nützlichsten für uns ist der X-Kontext,
da dieser Vektor die X- und
Z-Ausrichtung
unseres Panzers
bestimmt , nachdem die
Drehung angewendet wurde. Und um
den Panzer vorwärts zu bewegen, wollen
wir ihn
in der X-Z-Ebene bewegen. Das wäre also eine Kombination aus dieser Richtung und
der blauen Richtung vorwärts und
rückwärts in die Richtung, in
die der Panzer zeigt. Wenn wir also zu unserem
Skript zurückkehren und das
loswerden können,
entspricht die Geschwindigkeit
des Panzers der Panzerbasis, der X-Komponente
der Panzerbasis, multipliziert mit der
Bewegungsgeschwindigkeit Dadurch wird der X-Vektor mit
der Bewegungsgeschwindigkeit skaliert, was genau
das ist, was wir für die Geschwindigkeit
benötigen Wenn ich nun Move and Slide nenne, sollte
das
dem Panzer ermöglichen, sich
vorwärts zu bewegen , egal in welche Richtung
er sich gerade befindet. Drücken wir also die Daumen. Und, äh, nein. Das liegt daran, dass die
Bewegungsgeschwindigkeit konstant ist. Wir wollen eigentlich Vorwärtsgeschwindigkeit. Und aus diesem Grund
müssen Sie Ihre Variablen
mit Bedacht und
Verantwortung benennen Bedacht und
Verantwortung Okay, da haben wir's.
Wenn ich jetzt vorwärts drücke, bewegt sich der Panzer vorwärts. Wenn ich zurückdrücke, bewegt er sich zurück. Wenn ich den Tank drehe und ihn
jetzt vorwärts bewege,
sind wir fertig. Lasst uns auf den Baum zielen und wir gehen direkt durch den Baum hindurch. Und das liegt daran, dass wir keinerlei Kollision
aktiviert haben . Und der einzige Grund, warum es so
aussieht, als ob wir eine
Kollision haben, ist, dass ,
da wir keine
Geschwindigkeit in Y-Richtung anwenden , der Tank in keiner Weise
von der Schwerkraft beeinflusst wird, also nicht herunterfallen wird. Aber jetzt haben wir einen sich bewegenden Panzer und können mit
der nächsten Lektion weitermachen . Also
werde ich dich dort sehen.
14. Reaktion auf Spielereingaben – Steuerung des Turms: Willkommen zurück. In dieser Lektion, die unendlich
einfacher sein wird als die letzte Lektion, werden wir das, was
wir in
der letzten Lektion gelernt haben, nutzen , um den Turm des Panzers zu
manipulieren Das Erste, was wir tun
müssen, ist, unserem Panzer ein paar zusätzliche
Variablen zur Verfügung zu Insbesondere benötigen wir eine
Turmdrehzahl. Und wir benötigen auch eine
Turmwinkelgeschwindigkeit. Weil der Turm
sowohl rotieren als auch
heben und absenken kann sowohl rotieren als auch
heben und Grund benötigen
wir auch eine Geschwindigkeit, mit der sich der Turm bewegen Und schließlich, und der
Turm. Da haben wir's. Wir brauchen einen maximalen
Winkel für den Turm
, damit wir ihn nicht rundum drehen können Maximaler Winkel des Turms in Grad schweben. Und nennen wir das 15. Und wir werden
einige ähnliche Funktionen benötigen, um den Turm auf die gleiche
Weise zu manipulieren , wie wir es
beim Drehen und Bewegen getan haben Also lasst uns Rotationen machen. Türme Nein. Es wird
einen Eingabewert benötigen. Und Winkelturm. Ich kann nicht tippen und
mein Leben retten, oder? Und jetzt, wo wir diese haben, können
wir die
Rotations- und Winkelgeschwindigkeit
genauso ändern , wie wir es beim Drehen
und Drehen getan haben. Und um die Dinge
einfach zu halten: Der Turmwinkel, die Hebe- und
Absenkgeschwindigkeit entsprechen exakt
der Geschwindigkeit der Turmbewegung,
der Umdrehungsgeschwindigkeit Wenn Sie als Übung den Wert ändern
möchten, ändern
möchten sodass
ein anderer Wert verwendet wird, wäre
das eine gute
Übung für Sie, die Sie in Ihrer Freizeit machen Ordnung. Bevor
wir diese Werte über die
Steuerung manipulieren und sie auch zu unserem physikalischen Prozess
hinzufügen können, was wir tun werden, benötigen
wir Referenzen zum
Turmteil des Panzers Wenn wir also zu unserem
Drei-D-Wert hier zurückkehren, unserer Drei-D-Ansicht hier,
haben wir
in unserer vorherigen Lektion tatsächlich einen Knoten
erstellt, der den Panzer
darstellt, der die
Netzinstanzen des Panzers enthält, und dann haben wir auch
einen Fass-Ankerpunkt erstellt, der das
Fass mit dem Turm verbindet. Jetzt müssen wir
aus dem Tank heraus
Referenzen zu diesen Werten Und in Gadot gibt es ein paar
Möglichkeiten, das zu tun. Aber heutzutage, in Vier Punkt
Zwei und Vier Punkt Drei, ist
der einfachste Weg, dies zu tun, Objektreferenzen
zu verwenden Also werden wir noch
ein paar Werte exportieren. Und da es sich bei beiden um D-Knoten
handelt, können
wir den Typ
an Knoten 3 D festklemmen, also werden wir den Turm
exportieren und wir werden das
Revolverscharnier exportieren Und jetzt, wo sie existieren, können
wir zum Panzer gehen und den Turm
hierher ziehen
und das Turmscharnier , das der
Ankerpunkt des
Laufs ist, Ankerpunkt des
Laufs ist Und dann werden wir sie ein
bisschen zusammenpacken. Der Grad der Turmdrehung
wird also genauso verändert
wie
die Panzer, indem man einen Rotationsvektor erzeugt und
die
Turmdrehzahl mal Delta
verwendet die
Turmdrehzahl mal Delta . Und wir werden
das Gleiche mit dem Scharnier machen , aber nicht ganz Der aktuelle
Drehgrad des Scharniers wird
also durch
den Vektor Drei verändert, aber wir werden ihn um einen anderen Winkel
drehen Wir werden es
entlang der Z-Achse drehen , sodass es sich auf und ab bewegt, weil sich
die Z-Achse hier rein und raus
bewegt Und wenn wir es dann um die blaue Achse
drehen würden, die für die Z steht,
würde sie sich auf und ab bewegen. Das bedeutet also, dass die X- und Y-Eigenschaften des
Vektors Null sein werden, aber das Delta der
Turmdrehzahl oder besser gesagt die Z-Komponente wird die
Turmdrehzahl Delta sein Und wir werden noch eine
Sache tun. Wir müssen die
Rotationsgrade auf unseren maximalen Winkelbereich beschränken, und das tun wir mit
der Clamp-F-Methode weil wir mit Floats arbeiten
werden Also Drehung des Drehgelenks in Grad und wir wollen die Z-Eigenschaft
, weil das die Drehung nach oben und unten ist Drehungsgrad Z des Scharniers
entspricht dem Rückgabewert von Klemme F. Und wir
wollen, dass Klemme F
drei Parameter annimmt Der erste Wert ist der
Wert, den wir festklemmen. Der zweite Wert ist das Minimum des Bereichs, auf den
wir klammern, und der dritte ist der maximale Bereich, auf den wir klammern. Das wären also
negative maximale Winkelgrade bzw. maximale Winkelgrade. Wenn wir nun versuchen,
unseren Turm um die Spitze zu drehen oder unseren
Turm aus diesem Bereich abzusenken, wird er mit
dieser Methode innerhalb dieses Bereichs
festgeklemmt
und wir werden nicht zulassen, dass sich
der Turm in
vertikaler Richtung dreht , was genau das
ist, was Jetzt, wo wir das alles erledigt
haben, müssen
wir unsere
Spielmethode oder unsere Methode zur Eingabe
von
Tasten ohne Bedienung ändern ,
damit das alles funktioniert Also, wie
wirst du das machen? Nun, wir
gehen davon aus, dass der Spieler, wenn er
seine Steuertaste gedrückt hat, den Turm manipuliert, und wenn er
seine Steuertaste nicht gedrückt hat, manipuliert
er Also müssen wir
unseren eingegebenen Singleton überprüfen
und wir werden die Methode verwenden, bei der
die physische Taste gedrückt wird Und dann werden
wir nach
der Steuertaste suchen und da ist sie Wenn nun die
Steuertaste gedrückt
wird, wollen wir die Zugwerte für den Turm verwenden Zugwerte für den Turm Andernfalls wollen wir es für den Panzer
verwenden. Also haben wir den Spieler eingestellt, Spieler dreht den Turm mit
dem Zugwert und der
Spieler dreht den Turm
mit dem Zugwert. Das wird zwar funktionieren, aber es wird einen Bug geben Und eines der großartigen Dinge daran, mehr Erfahrung
mit der Programmierung zu sammeln, ist, dass Sie Fehler erkennen können bevor Sie beim Testen tatsächlich auf
sie stoßen. Nehmen wir an, wir drücken
die Steuertaste und dann
die Rechtspfeiltaste und drehen den Turm und lassen dann
die Steuertaste los Nun, das wird von diesem Abschnitt
nach unten zu diesem Abschnitt springen, was bedeutet, dass die Turmdrehzahl
nicht mit
dem aktuellen Wert
der Kurve aktualisiert wird Turmdrehzahl
nicht mit
dem aktuellen Wert
der Kurve Anstatt
hier Null zu überschreiten , um zu verhindern, dass sich der
Turm dreht, wird
er hier
direkt nach unten gehen Was wir also tun müssen, ist
die Bewegung und
Rotation
des Panzers explizit zu unterbinden Bewegung und
Rotation
des Panzers , wenn wir den Turm
manipulieren Und das tun wir, indem wir explizit Null
als Wendegeschwindigkeit Und wenn wir den Panzer
manipulieren,
wollen wir die Werte der
Geschütztürme auf Und das sollte funktionieren. Also, wenn ich
meinen Panzer jetzt normal
bewege , ist das großartig. Wenn ich jetzt die Kontrolle gedrückt
halte, stimmt etwas nicht.
Aber wir sind nah dran. Sie können also sehen, dass, wenn
ich den Regler gedrückt halte und der Tank sowohl
rotiert als auch dreht, es
so aussieht, als würde
ich versehentlich irgendwo dieselben Werte
verwenden. T-Umdrehungsgeschwindigkeit,
Turmwinkelgeschwindigkeit. Äh, huh. Und hier ist es Anstatt die
Turmwinkelgeschwindigkeit
zu verwenden , um den Turm zu winkeln, verwende
ich die Rotationsgeschwindigkeit Nun, das sollte funktionieren.
Und da hast du es. Und wie Sie sehen können, funktioniert es nicht, wenn ich
versuche, den Turm einen Wert zu bringen, der größer ist auf einen Wert zu bringen, der größer ist
als der von
uns eingestellte Winkelbereich Und das ist sogar möglich, und wenn ich
jetzt einen Panzer bewege und nach unten treffe, wenn
ich die Steuerung treffe, bewegt sich
der Panzer nicht mehr und
der Turm läuft weiter Okay. Wie Sie
vielleicht bemerkt haben, können
wir derzeit durch Bäume,
Felsen und Hügel
fahren ,
und das ist schlecht. In unserer nächsten Lektion werden
wir also lernen, wie man Kollisionen
einrichtet, und danach
wird es interessant. Wir können anfangen, Chaos
anzurichten und Dinge zu zerstören. Wir sehen uns also
in der nächsten Lektion.
15. Kollision: Willkommen zurück. Diese Lektion wird
unendlich einfacher sein als die letzten beiden und noch
einfacher als die vorherige Wenn Ihnen also der
ganze Unsinn mit Vektormathematik
und Rotation im Kopf
herumschwirrt , wird diese
eine kleine Verschnaufpause sein Also werden wir uns die Kollision
ansehen und
diese kleine gelbe Warnung korrigieren , beschwert er sich also Seit wir unseren Panzer
in einen Charakterkörper mit drei
D verwandelt haben darüber, dass er keine Form hat Also werden wir ihm einen geben. Gehen wir also zu unserer Drei-D-Ansicht. Und ich habe auf das Z geklickt und zunächst sichergestellt, dass es so ist und dass
es nicht so ist Ich habe dafür gesorgt, dass es sich um
eine Ansicht mit zwei Fenstern und habe auf das Z und dann auf das Y
geklickt, sodass wir diese schöne Ansicht von oben nach unten
und nach vorne gerichtet haben Ansicht von oben nach unten
und nach vorne gerichtet Wie ich bereits erwähnt habe, handelt es sich bei
unserem Panzer also um einen Panzer des Typs Panzer,
d. h. um einen
Charakterkörper mit drei D.
Es handelt sich um ein physikalisches Objekt, und ein physikalisches Objekt benötigen Kollisionsformen,
um zu funktionieren Und da wir diesem Ding nie
einen
Kollisionsformknoten hinzugefügt haben, hatten
wir dieses
kleine gelbe Symbol , das
uns die ganze Zeit verspottet hat Also werden wir einen untergeordneten Knoten
hinzufügen und wir werden eine
Kollisionsform drei D hinzufügen. Bumm Nun erfordert Kollisionsform
drei D eine Form, die
den von
uns verwendeten Netzprimitiven sehr ähnlich ist Wir werden also eine Kastenform verwenden
und jetzt haben wir eine ganze Reihe von
Widgets, mit und jetzt haben wir eine ganze Reihe von denen wir die Größe und
Ausrichtung
der Xbox angeben Größe und
Ausrichtung
der Xbox Also das erste, was
wir tun werden, ist das ein wenig nach
oben zu ziehen. Und dann machen wir es und aus irgendeinem Grund ist
es kaputt. Das muss ein Bug sein und Gadot. Manchmal schnappt es bei den Schnappschüssen in den Gittern,
obwohl du es nicht willst Mal sehen, ob ich da
hinkomme. Ich weiß nicht, warum es
vorher darauf beschränkt war. Aber wie dem auch sei, du kannst
diese kleinen rosafarbenen Kreise verwenden, um die Größe und
Position deiner Box zu ändern. Wir wollen also sicherstellen, dass die Box unseren gesamten
Tank in beide Richtungen
abdeckt Wir wollen also, dass es den
Tank in dieser Richtung abdeckt. Und wenn wir nach unten schauen,
wollen wir sichergehen, dass es
lang genug ist , um den Tank auch
in dieser Richtung abzudecken. Jetzt, wo wir eine Kiste haben, die den Tank
umgibt, versuchen wir den Panzer mithilfe der Move-and-Slide-Methode zu
bewegen. Schauen wir uns das
noch einmal an. Da wir uns also in unserem physikalischen
Prozess bewegen und gleiten
müssen, wird
Godot versuchen unsere
kollisionsförmige Box
zu kollidieren Und wie Sie sehen können, verschwindet die kleine
Warnung jetzt. Es wird versuchen,
diese kollisionsförmige Box mit
allen anderen kollisionsförmigen
Boxen zu kollidieren diese kollisionsförmige Box mit
allen anderen kollisionsförmigen , die wir zufällig in unserem Spiellevel
haben. Und im
Moment haben wir keine Also lasst uns dafür sorgen, dass unsere Bäume, Felsen und Hügel kollidieren Gehen wir also zurück zu unserem Baum,
und unser Baum ist ein Knoten drei D, also geben wir ihm eine
Kollisionsform Und wenn wir das versuchen, erhalten
wir sowohl einen Fehler als
auch eine Warnung. Die Warnung natürlich,
weil wir keine Form haben. Aber der Fehler ist, dass
unser Baum nicht
die richtige Art von Knoten , um tatsächlich eine Kollisionsform zu verwenden
. Es gibt also drei Arten von physikalischen Körpern, die Kollisionen
verwenden. Wir haben bereits einen Charakterkörper drei D, der unser Panzer ist, aber dann müssen
wir auch den Typ ändern. Ein statischer Körper drei D und ein statischer Körper drei D sind physikalische Objekte
, die sich nicht bewegen. Und es
bewegt sich nicht nur nicht, es wird sich auch nie bewegen, was bedeutet, dass Gadot
nicht versuchen wird, Schwerkraft oder etwas anderes
darauf anzuwenden, sondern es kann auch kollidieren Nun, da wir
eine Kollisionsform haben, ändern
wir die
Kollisionsform in einen Zylinder Und jetzt können wir die Größe
unseres Zylinders ändern und ihn nach oben
bewegen. Und wieder knallt es aus
irgendeinem Grund. Das ist ein unausstehlicher Bug. Da haben wir's. Ich weiß nicht,
warum es das immer wieder tut. Ich mag es nicht sehr. Aber auch hier können wir
die Griffe verwenden, um
die Größe des Zylinders anzugeben die Größe des Zylinders Jetzt ist unser Baum also vollständig von einer Kollision
bedeckt. Ups, von einer Kollisionsform Und funktioniert tatsächlich. Also, ja, du kannst sehen, dass es
von diesem Zylinder umgeben ist. Und die anderen werden wir auch machen
. Aber jetzt, ganz ohne
zusätzlichen Code,
wenn ich auf den Baum stoße, bumm, kann
ich nicht durch den Baum rennen. Fügen wir also Kollisionsformen zu unseren Felsen und Hügeln hinzu, und dann können wir mit der nächsten Lektion fortfahren
. Also
müssen wir wieder den Hügel wechseln. Also können wir
den Hügel tatsächlich in einen untergeordneten Knoten umwandeln. Also müssen wir zu
einem statischen Körper gelangen ,
weil es ein Netz ist, was bedeutet, dass wir all diese Informationen
verlieren werden. Also werden wir
tatsächlich knifflig werden müssen. Wir werden einen untergeordneten Knoten hinzufügen und es wird
ein statischer Körper mit drei
D sein . Dann klicken wir mit der rechten Maustaste
darauf und sagen „Szene als Root erstellen“,
und jetzt sind sie umgedreht Der statische Körper drei D ist
riesig, und das wollen wir nicht. Das werden wir gleich ändern. Aber jetzt
ist der Hügel dem statischen Körper drei D Gehen wir
also zurück zur Transformation, und die Transformationen sind Aus irgendeinem Grund ist
dieses Ding riesig. Ich weiß nicht, warum das so
ist, aber wir werden ihm eine Kollisionsform
geben. Und lassen Sie uns mit einem Hoppla beginnen. Gehen wir wieder mit einer
doppelten Ansicht vor. Und wieder einmal, das ist
nicht richtig. Da ist es. Doppelte Ansicht, Bum. Wir haben es runter und rauf. Und ich schätze, ah, ja, das liegt
daran, dass diese Positionen falsch sind, also lass uns das ändern Wir setzen das auf Null zurück. Und jetzt haben wir
das hier, quasi so. Also wollen wir die
Rotationen gleich lassen,
aber wir wollen, dass sie lokal
auf 00 stehen Und jetzt ist der statische
Körper drei D nicht einmal annähernd
so groß wie zuvor,
was wir wollen Also werden wir das verschieben,
damit wir es sehen können. Und da es an seiner Grundfläche
quadratisch ist, fügen
wir eine Kiste hinzu, wie
wir es mit dem Panzer gemacht haben. Und dann
strecken wir den Kerl einfach aus und drehen ihn
so, dass er dieselbe
Winkelausrichtung hat
wie der Hügel selbst Und perfekt. Und wir werden dasselbe für einen Stein
tun. Also
müssen wir wieder einen untergeordneten Knoten hinzufügen. Statischer Körper drei D, mach Snoot. Wir werden uns neu orientieren Nun, der war
tatsächlich richtig. Und wir geben dem statischen
Körper seine eigene Kollisionsform. Und wir werden
daraus auch einen Zylinder machen. Mm. Denn obwohl sie
so klein sind, wollen
wir uns eigentlich nicht mit
den physikalischen Wechselwirkungen beim Überfahren
von Felsen befassen den physikalischen Wechselwirkungen beim Überfahren
von Felsen Wir wollen nur, dass der Spieler nicht
in der Lage ist,
sich an ihnen entlang oder über sie zu bewegen. Erspart uns eine Menge
Kopfschmerzen. Okay. Und das allerletzte
, was wir
tun werden, ist, die Kollisionsmasken
aufzusetzen. Was ist also eine Kollisionsmaske? Eine Kollisionsmaske besteht aus
einer Reihe von
Flaggen, die Gadot sagen, was kollidieren soll
und was nicht Und so können
wir unter unserem Panzer sehen, dass es unter dem Körper
des Charakters drei
D
einen Kollisions-Reiter gibt . Und wenn wir ihn erweitern, haben
wir eine ganze Reihe von Ebenen und eine ganze
Reihe Die Ebene ist die Kollisionsebene , zu der das Objekt gehört. Lassen Sie uns also einige davon umbenennen. Bearbeiten Sie also die Ebenennamen. Ebene eins wird Spieler sein. Schicht zwei wird ein Hindernis sein. Und Schicht drei, obwohl wir noch
keine haben, werden
wir Feinde sein. Jetzt können wir sagen, dass
sich der Spieler auf Kollisionsebene eins befindet
, also Spieler,
und er kollidiert Und wenn wir das Häkchen entfernen,
wird es nicht versuchen, mit sich selbst zu
kollidieren, denn das ist sowohl
albern als auch unmöglich Wenn wir aber
auf zwei und drei klicken, bedeutet
das, dass der Spieler mit
allem kollidiert, was sich auf Kollisionsebenen von Hindernissen
oder
Feinden Kollisionsebenen von Hindernissen
oder
Feinden Wenn wir also zurück zum Baum gehen und Kollision erweitern
und es auf Hindernisse setzen und dann
die Maske auf einem lassen, kollidiert
es
mit dem Spieler Und jetzt werden wir das Gleiche für
die Hügel tun und sie ebenfalls auf
die Hindernisebene legen Sie werden
mit dem Spieler kollidieren und dasselbe mit dem Felsen Und funktionell gesehen hat sich
dadurch nichts geändert. Ups. Das, äh, nun, was stimmt da nicht? Das ist seltsam. Habe ich den Panzer so bewegt , dass ich ihn nicht
hätte bewegen sollen? Nun, einer der
Hügel hat sich verändert. Oh, ich verstehe das Problem. Ich habe einen der Hügel
bewegt und jetzt ist er direkt
über dem Tank. Also lass uns den bewegen. Gehen wir zurück in die Arena und finden dort den Hügel, der direkt in
der Mitte
war, und wir
verschieben ihn einfach hierher. Dann haben wir hier drüben einen
zweiten Hügel
, der seltsam ausgerichtet
ist. Dann ändere das Es sollte besser sein.
Okay, lass uns das Spiel jetzt nochmal starten.
Okay, viel besser. Also, wenn ich direkt
auf diesen Felsen
zulaufe, werde ich ihn treffen und anhalten. Bum, und los geht's. Und jetzt machen
wir dasselbe für
einen der Hügel. Geh direkt an diesem Baum vorbei. Und bumm, wir haben den Hügel erreicht. Und wie Sie sehen können, rutsche
ich schräg auf den
Hügel , und genau
das macht Move and Slide. Wenn ihr nicht an dem Objekt
entlang rutschen wollt, mit dem ihr kollidiert, und eure Panzer einfach anhalten
lassen wollt, gibt es eine Methode namens
Move and Collide Und das werde ich
dir ganz kurz zeigen. Wir
werden es nicht wirklich benutzen, aber wir haben Move and Collide, und Move
and Collide benötigt
tatsächlich eine ganze Menge mehr Parameter
als Move and Slide Im absoluten Minimum benötigt
es unsere Geschwindigkeit. Aber. Aber es skaliert es nicht so unter
der Haube wie Moving Slide. Also müssen wir unsere
Geschwindigkeit über unser Delta ändern. Also, wenn ich zurückgehe und
versuche, gegen einen Hügel zu prallen, bewegt sich
mein Panzer nicht den Hügel entlang Es wird einfach aufhören. Bum, und los geht's. Jetzt kann er sich immer noch drehen, aber wenn ich jetzt vorwärts schiebe, rutscht
der Panzer nicht den Hügel entlang. Je nachdem,
welche Art von Spiel du machen möchtest, ist das deine
persönliche Präferenz. Sie können entweder
rutschen oder nicht rutschen. Wir werden wieder zum Rutschen
zurückkehren, nur weil es
etwas einfacher ist. Und jetzt, wo wir Dinge
kollidieren können, werden
wir anfangen, Granaten abzufeuern und Dinge in die Luft zu Also wir sehen uns
in der nächsten Lektion.
16. Der Knoten RigidBody – Auslösen einer Shell: Willkommen zurück. In dieser Lektion werden
wir gewalttätig werden und wir werden die Steuerung und die sehr komplexe
3-D-Mathematik
implementieren ,
die
es uns ermöglicht, Granaten
auf unsere Gegner abzufeuern. Aber bevor wir das tun, müssen wir
einige
Umstrukturierungen vornehmen Sobald Sie also anfangen, sich
mit Drei-D-Mathematik zu befassen, kommt es
auf die Ausrichtung
Ihrer Modelle Es ist sehr wichtig. Und die Tatsache, dass
unser Panzer auf die X-Achse
zeigt,
wird
uns Probleme bereiten , weil
Gadot tatsächlich davon ausgeht, dass die positive
Z-Achse vorwärts verläuft absolutes Minimum müssten
Sie also all
Ihre Winkelberechnungen
um 90 Grad drehen , und das ist Wahnsinn.
Das machen wir nicht Also nehmen wir all
unsere Unterkomponenten unseres Panzers weil der Panzer
selbst nicht auf komische Weise gedreht
wird, aber wir
nehmen all diese Gegenstände und drehen
sie um 90 Grad auf der Z-Achse Und das ist völlig falsch. Das werden wir nochmal versuchen.
Lass uns hier zur Leiche gehen. Und es ist 90 Grad entlang
der Y-Achse, nicht entlang der Z-Achse. Und ich habe heute tatsächlich Kaffee
vor mir stehen, also habe ich keine Ausreden. In Ordnung Nun, das ist natürlich richtig, aber da der Turm versetzt war, muss
der Turm manuell angepasst
werden Also ziehe ich das einfach so
drüber, dass es bei Null X
steht und somit
perfekt Und ich habe das falsch gemacht. Es ist tatsächlich 90 Grad in die entgegengesetzte Richtung.
Da haben wir's. Jetzt ist
die Kamera natürlich aus, also
müssen wir die Kamera komplett neu positionieren ,
und das ist keine große Sache Wir werden einfach unseren kleinen
grünen Kerl benutzen, um ihn in
die richtigen X-Z-Positionen zu manövrieren richtigen X-Z-Positionen Wir werden dafür sorgen, dass
es sich, was die
Verwandlung angeht, direkt auf dem X befindet, und dann drehen wir es einfach so, dass
es dem
Panzer zugewandt ist, wie es Wir gleichen das
auf minus 180 aus. Wir werden es in der Vorschau ansehen. Sieht gut aus. Oh. Eigentlich ist
der Turm ein bisschen zu weit vorne.
Nun, lass es uns zurückbringen Ja. Okay, jetzt geht es uns gut und alles ist
richtig ausgerichtet Wir werden dafür sorgen
, dass alles in Ordnung ist. Unsere Kollisionsbox
ist leicht daneben. Außerdem finde ich, dass wir
es etwas zu groß gemacht haben. Wir werden das nur ein bisschen verkleinern, nicht dass es
eine große Rolle spielt, und wir sind gut in
dieser Richtung Okay, eine weitere Sache,
die ich
erwähnen werde , ist, dass nach dieser
Lektion oder während dieser Lektion der Inspektor für
unseren Panzer unübersichtlich wird
,
weil wir
hier
etwa vier weitere Variablen hinzufügen
werden , mit denen wir spielen wollen Zum Glück gibt es eine
Möglichkeit, damit umzugehen. Wir können ein paar
zusätzliche Exportnotizen verwenden, um
unsere Informationen hier zu organisieren Die erste, die äußerst
nützlich ist
, heißt Export Group Und dafür braucht es ein Etikett. Sobald Sie das getan haben, wird
alles, was
exportierbar ist und
nach diesem Tag kommt ,
in die Gruppe aufgenommen, sodass Sie
es jetzt reduzieren und erneut öffnen können Und wenn Sie die Gruppe
löschen möchten, würden Sie einfach
ein weiteres davon hier einfügen und das Etikett herausnehmen, und dann wird alles
wieder dort sein, wo es sein sollte Jetzt stellt Gadot die
Gruppen natürlich gerne an die unterste Stelle Also, obwohl wir
keine Gruppe, keine Gruppe haben, wird
all das Zeug, das keine Gruppe ist, oben stehen und all das Gruppenkram
wird unten stehen Eine andere, die
aus visueller Sicht
etwas weniger nützlich ist, heißt Export-Kategorie, und das macht hier einen völlig
neuen grauen Header. Und das ist vielleicht das, was Sie wollen. Man weiß nie. Also da hast du's. Wir werden das Zeug für den
Turm in einer eigenen Gruppe
zusammenpacken Und wir haben Drehgeschwindigkeit,
Bewegungsgeschwindigkeit, das ist gut Rückwinkel des Turms,
bla, bla, bla. Das ganze Zeug hat tatsächlich mit
Geschütztürmen zu tun, also Und wir werden
es vorerst so belassen. Und bevor wir weitermachen, müssen
wir aufgrund der
Rotation des Panzermodells eine
Änderung an
unserem bestehenden Code vornehmen. Und das heißt, wir müssen
die Tatsache ändern , dass wir
unsere Geschwindigkeit berechnen , indem
wir die
Transformationsbasis als Grundlage verwenden . Derzeit
verwenden wir die X-Eigenschaft, aber wir müssen sie auf Z ändern. Und sobald wir das getan haben, sollte
unser Panzer Und sobald wir das getan haben, sollte
unser Panzer
genauso
manövrieren wie zuvor H In Ordnung, uns geht es gut. Lassen Sie uns nun die Shell erstellen
und hinzufügen. Das Erste,
was wir tun müssen,
ist also, das Shell-Modell selbst
oder besser gesagt
die Shell-Szene zu erstellen . Also werden wir eine neue Szene machen, und es wird eine Drei-D-Szene
sein. Aber anstatt einen Knoten zu verwenden, klicken
wir mit der rechten Maustaste, ändern den Typ und ändern ihn einen starren Körper drei D. Nun, was ist ein starrer Körper drei D? Starrer Körper drei D,
wie die Figur Körper drei D und der statische Körper drei D, die wir
bisher verwendet haben. Ist ein Physikobjekt. Nur in diesem Fall handelt es sich um ein Physikobjekt
, das tatsächlich Kräfte wie Schwerkraft
und Druck usw.
aufnehmen kann . Und wir werden
es durch die Schwerkraft und
auch durch die anfängliche
Mündungsgeschwindigkeit
unseres Geschützes beeinflussen auch durch die anfängliche
Mündungsgeschwindigkeit
unseres Geschützes lassen, damit
es
abgefeuert werden kann und
mit anderen Zielen kollidieren Also werden wir das umbenennen und es Shell
nennen Und wir werden wieder zu Three D
wechseln und wir werden wieder eine
Mesh-Instanz Three D hinzufügen. Und dieser wird ein Tube-Trail-Mesh
sein. Und der Grund, warum
wir
ein Tube-Trail-Mesh verwenden werden, ist, dass wir es
so manipulieren
können,
dass es wie
eine Muschel aussieht,
ohne etwas anderes zu tun. Also werden wir mit der linken Maustaste
auf das Mesh klicken, um es zu öffnen. Aber das Erste
, was wir
tun müssen ,
ist, es so zu drehen,
dass es nach vorne zeigt. Also gehen wir zurück nach unten, um es zu
transformieren, und wir werden es
entlang der X-Achse drehen , sodass
es jetzt nach vorne zeigt. Und weil wir können, erhöhen
wir die
radialen Stufen auf zehn, was bedeutet, dass es etwas runder wird Wir könnten das sogar noch weiter
erhöhen, wenn wir wollten Aber je mehr Polygone ein Objekt hat
, desto langsamer wird es Also drücken wir das einfach wieder um
acht nach unten. Auf lange Sicht wird es nicht wirklich
wichtig sein. Also, was den unteren Teil angeht, werden
wir ihn so ändern
, dass wir zur Seite zeigen, damit wir
sehen können, was wir tun Und für das
oberste Beispiel machen wir es von oben nach unten. Okay, jetzt können wir sehen,
was vor sich geht. Also werden wir
die Abschnitte auf zwei ändern, und wir werden den Radius
und die Länge des Abschnitts
ändern . Nun wollen wir, dass das in den Tank passt. Und eigentlich sollten wir uns die Arbeit
sparen und den Tank
reparieren, solange
ich daran denke. Und was meine ich
mit „Den Tank reparieren“? Nun,
das Erste, was wir tun
müssen , ist anzugeben, wo die Granate vom Panzer aus abgefeuert
werden soll. können entweder einen Knoten drei D hinzufügen, aber es gibt etwas, das für uns etwas nützlicher ist , und es heißt Markierung drei D. Und eine Markierung
drei D
ist, wie Sie sehen können, ein Kind von Knoten drei D, also ist es im Grunde nur
ein Knoten drei D.
Die Markierung drei D ist jedoch im Grunde ein Referenzpunkt. Von hier aus ist es ziemlich schwer
zu erkennen.
Lassen Sie mich sehen, ob ich
es etwas ausdehnen kann. Ja, nicht leicht zu erkennen. Aber eine Markierung
von drei D entspricht im Grunde einem Drei-D-Punkt. Und obwohl es
wegen der Gizmos ziemlich schwer ist, in diesen Fenstern etwas zu sehen, schwer ist, in diesen Fenstern etwas zu sehen,
lassen Sie mich sehen, ob ich
das kann. Da haben wir's Okay. Also, wenn ich die Auswahl aufgehoben habe, ist
es etwas einfacher zu erkennen Hier können Sie also sehen,
dass es sich im Grunde um ein Fadenkreuz handelt, das angibt, wo sich der Punkt
im Drei-D-Raum befindet Und das
taucht im Spiel nicht auf. Dies ist nur eine
Referenz, damit Sie feststellen
können, wo er
sich befindet, ohne ihn auswählen
zu müssen , denn normalerweise würde ich einen Knoten auswählen,
er hervorgehoben. Aber in diesem Fall zeigt dir der Marker
immer, wo er sich befindet. Also habe ich
die Markierung so abgewinkelt und positioniert , dass sie
sich in unserem Lauf befindet, was wir wollen, weil die Granate aus dem Inneren des Fasses
abgefeuert wird Das verursacht uns tatsächlich ein paar
leichte Komplikationen, aber auf lange Sicht sieht es besser
aus Ich meine, also könnten wir die Markierung hier
anbringen und dann würden
wir die Granate hier spawnen.
Und das ist völlig in Ordnung,
aber dann bedeutet es, dass die Granate
im Grunde vor dem Fass
erscheint
und dann nach außen abfeuert Und nur aus
Gründen des Realismus wollen
wir, dass
unsere Granate
im Inneren des Fasses erscheint und
dann nach außen abgefeuert Bei der Spieleentwicklung dreht sich also
alles um Kompromisse. Also, jetzt, wo wir einen Marker
haben und er bis zum Fass passt
und alles, können wir
wieder zu dem zurückkehren, was wir getan haben Gehen wir also zurück zu unserer Schale. Aber zuerst, bevor wir
das tun, müssen wir sehen, wie groß ein Fass eigentlich ist. Es hat also einen Radius von 0,1 und eine Querschnittslänge von 0,2.
Erinnern wir uns daran. Wir wollen also, dass der Radius
etwas kleiner ist. Also sagen wir 075. Und ich habe es schon vergessen.
Was war der Radius? Was war eher die Länge? Die Länge des Abschnitts betrug 0,2. Sagen wir, 0,175. Und wir können schnell herausfinden, ob das richtig ist
oder nicht, indem wir unsere Schale
nehmen und
sie in
unsere Hauptspielszene ziehen können sie in
unsere Hauptspielszene ziehen können Und wir könnten es hier hinstellen. Und, äh, und das
scheint ungefähr die richtige Größe zu haben. Perfekt. Okay, also löschen
wir das. Und wir werden
zu dem zurückkehren, was wir tun. Gehen wir also zurück
zur Schale, und wir werden ihr Material,
Standardmaterial, Albedo
ändern Standardmaterial, Albedo und sie
dunkelgrau machen Und wir werden eine
Kurve modifizieren. Was ist also eine Kurve? Eine Kurve ist eine gekrümmte
Linie, die sich
je nach Objekttyp auf das Objekt auswirkt. In diesem Fall
wird die Kurve also auf den Abschnitt
des
Zylinders angewendet , in dem wir uns befinden. Also
werden wir es auf zwei oder vielleicht einen reduzieren , sagen wir,
und jetzt sind wir hier, und wir können das ziehen
und dann klicken, dann klicken um einen weiteren Punkt hinzuzufügen, und diesen
dann nach unten ziehen Und jetzt können Sie
sehen, dass sich die Form des Zylinders tatsächlich
geändert hat, um der Kurve zu folgen Und lassen Sie uns hinzufügen, wir fügen
einen zweiten Abschnitt hinzu, und wir werden diesen tatsächlich ein wenig nach
außen verschieben, sodass die Schale etwas mehr
Woop ist, das ist zu viel Und dann klicken wir auf
diesen kleinen Griff hier sind Bezier-Kurven,
ich glaube, du Und dann passen wir
das ein bisschen an, und jetzt haben wir eine tatsächliche
Kugelform für unsere Schale, und sie zeigt in
die falsche Richtung, also müssen wir sie
in die richtige Also wollen wir
das Netz um drei D um 180
Grad entlang der Y-Achse drehen . Und jetzt zeigt es in
die richtige Richtung. Gut. Gut, die Schale
wird zwei Dinge benötigen Sie wird
eine Kollisionsform benötigen. Also wir haben schon einen von denen hier unten in unserer Geschichte. Lass uns darauf klicken. Gib
ihm eine Kollisionsform. Die Kollisionsform
wird
eine sein . Wir könnten
ihr entweder eine Kapsel oder einen Zylinder geben. Geben wir ihr einen
Zylinder, weil wir bisher sowieso Zylinder verwendet haben. Verwandeln. Wir müssen den Kerl
um 90 Grad drehen Und jetzt werden wir die
Größe so ändern, dass es passt,
genau wie wir es für
unsere anderen Objekte getan haben Und in diesem Fall spielt der
Winkel an der Vorderseite
der Schale im Hinblick auf die Kollision eigentlich keine
Rolle, also
lassen wir ihn einfach so, wie er ist Und schließlich
wird die Shell ein Skript benötigen. Und wir werden sicherstellen, dass
es in unserem Skriptordner gespeichert wird. Und wir werden
die Klasse Shell nennen. Nun
muss Shell zwei Dinge tun. Sie wird alle
Kollisionen
verfolgen müssen , die sie hat Und wenn wir das
verdammte Ding erst einmal
abgefeuert haben,
wollen wir, dass es in
die Richtung
seiner Flugbahn schaut die Richtung
seiner Flugbahn Und das ist
eigentlich ganz einfach. können wir jetzt machen. In unserer physikalischen Prozessmethode wollen
wir also einfach
die Funktion Look at verwenden. Die Look-at-Funktion verwendet ein Ziel und
benötigt auch die Up-Funktion. Was ist also das Ziel? Nun, das Ziel ist der Ort sich
die Granate bewegt,
und wo sich die Granate an einem bestimmten Punkt
bewegt ist die globale Position der Granate, ein Vektor, der angibt,
wo sie sich auf der Welt befindet, plus die lineare Geschwindigkeit. Und die lineare
Geschwindigkeit ist der Vektor , der angibt,
in welche Richtung sich
die Schale bewegt und wie schnell. Wenn Sie diese
beiden zusammenzählen, erhalten
Sie die Richtung, in
die sich der Vektor bewegt. Das wird also jeden Frame ausführen. Und im Grunde
aktualisiert
die Granate bei jedem Frame ihre Position oder Drehung und im Grunde
ihre Winkelausrichtung ,
sodass sie in
die Richtung schaut, in die sie abfeuert. Auf diese Weise bewegt sich die
Granate zusammen mit ihrer Bewegungsbahn
in einem
Bogen, anstatt
einfach überall
hin zusammen mit ihrer Bewegungsbahn
in einem
Bogen, anstatt und her zu springen, wie es bei einem normalen
physikalischen Objekt der Fall wäre Wenn Sie das nicht tun würden, würde
die Granate tatsächlich in die Richtung zeigen, in die sie abgefeuert wurde denn wir sind dabei,
sie so auszurichten, dass sie das tut Aber sie wird sich im Flug nicht
wirklich nach unten wölben. Es wird einfach,
es wird einfach geradeaus fliegen
und dann landen Und das ist ein bisschen langweilig. Das wollen wir nicht. Und wir werden auch Kollisionen im Auge
behalten müssen Also tun wir das, indem wir ein
sogenanntes Signal anschließen. Nun, ein Signal ist eine Nachricht
, die jedes Gado-Objekt
aussenden kann , und jedes andere GA Do-Objekt kann sich mit diesem
Signal verbinden und darauf warten Und wenn das Signal ausgegeben
wird, ruft alles, was auf
das Signal wartet eine Methode auf, die Sie angeben
werden In diesem Fall wollen wir also
die Kollisionsform. Nein, wir
wollen die Kollisionsform eigentlich nicht. Wir wollen die Schale. Wir
müssen ein paar Dinge tun. Als Erstes müssen
wir der Granate mitteilen, dass sie
nach Kollisionen
Ausschau halten wird Kollisionen
Ausschau halten Und das tun wir, indem wir
die Solver-Gruppe erweitern und auf Kontaktmonitor
klicken. Dann müssen wir angeben, dass Max. Kontakte größer als Null
sein muss Max Contacts ist ein
Parameter, der angibt, wie vielen Kollisionen wird dieses Objekt
suchen, bevor es
sich einfach nicht mehr darum kümmert Und wir wollen, dass es mindestens eine
hat. Sie können diesen
Wert erhöhen, wenn Sie wollen, aber Ihre Granate wird wirklich immer
nur ein
Ziel treffen und dann explodieren, also wird es in diesem speziellen Fall keine
Rolle spielen Sobald wir das
alles eingerichtet haben, können
wir auf die Shell klicken und dann vom Inspektor
zum Knoten gehen Und der Knoten
zeigt Ihnen alle Signale, die dieser spezielle Knoten
aussenden kann. Und weil es sich um einen starren
Drei-D-Körper mit einer korrekt eingestellten
Kollisionsform handelt, wird
die Schale diese Signale
aussenden,
und der Körper, an dem wir
interessiert sind, ist der Körper, der eingetreten ist. Wenn also irgendein
anderer
physikalischer Körper in die Kollision
dieses starren Körpers gerät, löst
er diese
Methode aus, wenn wir ihn verbinden. Also gehen wir
hier runter zum Connect-Button. Es wird uns sagen, dass es uns fragen
wird,
auf welches Objekt wir die Funktion setzen
wollen die Funktion setzen
wollen und wie die
Funktion aufgerufen werden soll. Und diese beiden Standardwerte sind Ordnung, also klicken wir einfach auf Verbinden Und jetzt, wann immer die Shell auf
ein anderes Objekt trifft , das
sie
treffen kann ,
wird diese Methode aufgerufen Und wir werden
diese Methode ein wenig näher erläutern. Aber wir
müssen auch sicherstellen, dass unsere Kollisionsebenen für die Granate festgelegt
sind und dass die Granate nicht Teil einer der
Ebenen sein
wird, die wir bereits
definiert haben, weil sie
weder ein Spieler noch ein
Feind noch ein Hindernis ist . Wir können also alle
diese Markierungen
deaktivieren , sodass sie nicht als
Teil einer Ebene betrachtet wird Weil die Granate sowohl
von den Spielern
als auch von den Feinden abgefeuert
wird sowohl
von den Spielern
als auch von den Feinden Wir wollen also, dass sie mit dem Spieler
kollidieren kann, und es wird für alle
dieselbe Granate sein Wir wollen also, dass es mit dem Spieler
kollidieren kann. Wir wollen, dass es mit Hindernissen
kollidieren kann, und wir wollen, dass es mit Feinden
kollidieren kann Und eine Sache, die
ich vergessen habe, ist, dass ich
vergessen habe , der Arena
irgendeine Art von Kollision zu verpassen Die Granate wird also durch den Boden
fallen,
wenn wir das nicht tun. Lass uns wieder hierher gehen. Gehen wir zu unserer Mesh Instance Three D, und wir müssen
das auch ändern,
naja, wir müssen eigentlich wir müssen einen statischen Körper drei D
hinzufügen, und wir werden ihn Ground
nennen. Und wir werden
die Mesh-Instanz drei D hinzufügen , die der Boden ist, und dann werden wir dem Boden
eine Kollisionsform hinzufügen . Andernfalls würde die Schale durch die Welt
fallen,
und das wäre schlimm. Also kastenförmig. Wir , es wird schwer sein, die
zu kriegen. Hier. Und wir wollen nur, dass diese Form mit Projektilen
kollidiert Also Bodenkollision. Geben wir ihm eine eigene Ebene. Das ist also die Bodenschicht, und sie kollidiert nur Also, eigentlich
sieht es so aus, als
würden wir eine projektive Schicht brauchen, oder? Okay, also sie. Okay, die Schale ist eine Schale und sie kollidiert mit allem Und wir werden nur
überprüfen, ob unsere Mutter Okay. Ja, denn
manchmal, wenn man die
Kollisionsmasken verschiedener Objekte ändert es nicht
richtig macht, kann das zu
allerlei albernem Verhalten führen allerlei albernem Verhalten Also stellen wir einfach sicher, dass wir immer noch damit klarkommen, dass sich
unser Panzer bewegt Boop, ja, alles ist gut. Okay, gehen wir zurück
zu unserem Spielskript und wir werden hier
unseren Control-Handler modifizieren Und wir wollen nach
einem anderen Spielobjekt suchen, und dieses Spielobjekt
ist außer der Benutzeroberfläche, was sowohl der
Enter-Taste als auch der Leertaste zugeordnet ist Und wir werden
die
Methode „Ich gedrückt“ verwenden , weil sie nur in dem Frame
ausgelöst wird , in dem die
Taste gedrückt wurde Wenn Sie die Taste weiterhin
gedrückt halten
, wird diese Aktion nicht
weiter ausgelöst. Dadurch wird sichergestellt, dass pro gedrückter Taste eine Granate abgefeuert wird. Wenn also die Eingabe eine Aktion ist, die
gerade gedrückt wurde,
akzeptiere ich , dass der Spieler Shell abfeuert. Und wir haben die Fire-Shell-Methode
noch nicht wirklich erstellt, also machen wir das jetzt. Oh. Um eine Granate abzufeuern, brauchen
wir einen
Verweis auf die Granate. Zurück in unserem Tank werden
wir also einige weitere Exportvariablen bereitstellen. Und lassen Sie uns eine Exportgruppe gründen ,
damit wir diese Dinge
organisieren können. Wir haben einen Turm für die
Exportgruppe. Wir haben also eine gute
Rückseite zum Panzer. Da haben wir's. In Ordnung. Also das Erste, was
wir brauchen, um exportieren zu
können, ist das, was
wir ein Fertighaus nennen Und das ist im Grunde ein Link zu der Szene, die wir jedes Mal
instanziieren werden, wenn
wir eine Granate abfeuern,
was unsere Shell-Szene ist Und da wir den Typ dieser Szene nicht
definieren müssen, ist
es okay, wenn Sie dieses Feld leer
lassen, aber es ist gut zu wissen, dass der Typ einer Szene
als gepackte Szene bezeichnet wird Also, wenn ich will, kann
ich meine
Shell-Szene einfach hierher ziehen. Es wird automatisch
geladen und in
dieser Variablen zwischengespeichert , wenn der Panzer als Teil des
Spiels
instanziiert wird , was er Wenn wir jetzt also eine Granate abfeuern, werden
wir
ein neues dieser Shell-Objekte erstellen Wir haben also var shell, das vom Typ shell ist dem
Shell-Prefab-Punkt instantiate entspricht Und wenn wir das getan
haben, brauchen wir hier
oben noch eine Sache , die ziemlich wichtig ist, obwohl es okay ist, wenn wir sie etwas
später
implementieren, aber wir werden es Wir werden
ein Signal definieren, dass der Panzer immer dann
feuert, wenn er eine Granate abfeuert. Und der Grund, warum
wir das tun werden, ist
, dass wir vom Panzer aus keinen direkten
Zugang zur Welt haben weil der Panzer ein
Kind der Welt ist. Wir können es bekommen, indem wir
den Panzer als übergeordnetes Eigentum bezeichnen, was eine eingebaute
Eigenschaft eines Knotens drei D ist, aber
das hängt davon ab , dass wir wissen,
was diese Hierarchie ist, und wir wissen, dass der Spieler der Lage sein
würde,
das Elternteil zu bekommen , was das Spiel ist,
und dann könnten
wir in der Lage sein
würde,
das Elternteil zu bekommen, was das Spiel ist,
und dann könnten
wir Ana
aus dem Spiel holen. Aber es gibt eine ganze
Reihe von Möglichkeiten, wie wir diese Hierarchie
während der Produktion durchbrechen
könnten. Also das ist
eigentlich keine gute Idee. Wir möchten, dass die Dinge
so gut wie möglich zusammengefasst sind, was bedeutet, dass sie
nichts anderes
als sich
selbst kennen müssen nichts anderes
als sich
selbst Wir sagen
dem Panzer also nur, dass er ein Signal abfeuern soll, und wir
geben ihm einen Hinweis
auf die abgefeuerte Granate Das heißt, nachdem wir unsere
Granate instanziiert
haben, senden wir dieses Signal aus
und geben ihr die Granate weiter, die wir gerade Und im Moment passiert nichts. Dieses Signal
geht einfach in den Äther und verschwindet und existiert bis zur Hitzetiefe
des Universums, oder du beendest dein Spiel,
je nachdem, was zuerst eintritt Was wir also tun müssen, ist, dass das Spiel auf dieses Signal hört Und es gibt ein paar
Möglichkeiten, das zu tun. Wir können
es entweder genauso verbinden, wie wir mit der
Kollisionsform in der Schale
gemacht haben, aber ich habe mich immer noch nicht
wirklich entschieden, ob der Panzer immer existieren
soll oder nicht. Definieren wir also einfach
eine fertige Funktion. Jetzt wird ready immer dann aufgerufen, wenn ein Knoten den Szenenbaum betritt. Es ist also in jeder
Hinsicht
die Funktion, die Sie aufrufen, wenn der Knoten bereit ist,
und Sie möchten, dass er eine ganze Reihe von
Dingen erledigt, bevor er tatsächlich
anfängt, Dinge zu
tun bevor er tatsächlich
anfängt, Dinge zu
tun In diesem Fall wollen wir also, dass die Spieler ein Signal
abgefeuert haben, und wir wollen
es mit einer Methode verbinden , die wir auf Shell Fred
aufrufen Und natürlich ist Gott O
mürrisch, weil wir diese Methode noch nicht definiert haben,
also machen wir sie glücklich Funk auf Granate abgefeuert. Da diese Methode als Antwort auf das von uns definierte
Signal
aufgerufen wird , benötigt
sie dieselben
Parameter wie das Signal. Und da das Signal
einen Objektparameter
vom Typ Shell verwendet, müssen
wir
diesen ebenfalls als Teil unseres
Signal-Handlers definieren . Jetzt haben wir also, dass
diese Methode
aufgerufen wird , wenn sie
das Signal empfängt , dass die
Shell abgefeuert wurde. Und alles, was das Spiel
tun muss, ist die untergeordnete Shell hinzuzufügen, weil wir wollen, dass das Spiel
die Shell zusammen mit
all den anderen Objekten zu
seinem Szenengraphen hinzufügt . Wenn du also
das Spiel während des Spiels überwachst und wir das gleich sehen können, dann wird es hier erscheinen. Also lass uns das machen.
Lass uns unser Spiel ausführen. Und du kannst überwachen , was dein Spiel macht,
während das Spiel läuft. Und das ist etwas einfacher , wenn sich das Spiel
im Fenstermodus befindet. Deshalb habe ich
es nicht aus dem Fenstermodus genommen Wenn wir also
zu unserem Editor zurückkehren und zum Szenengraph
gehen
und auf Remote klicken, ist das das eigentliche
Szenengraph Ihres laufenden Spiels Lokal ist das, mit dem Sie im Editor
arbeiten. Remote ist die
, die im Spiel enthalten ist. Wenn ich jetzt
zu meinem Spielfenster zurückkehre und die Leertaste drücke, kannst
du sehen, dass
wir eine Shell haben. Sie wurde der Spielwelt hinzugefügt
. Und wenn ich jetzt ein Backup mache, können
wir es tatsächlich sehen. Es ist genau hier. Und das liegt daran, dass wir ihm noch
keine Kräfte oder
ähnliches gegeben haben . Das alles ist also passiert und man kann es
aus diesem Kamerawinkel nicht wirklich sehen. Alles, was passiert
ist, ist, dass es einfach heruntergefallen ist und auf den Boden gefallen ist, und jetzt macht es allerlei
verrückten Unsinn, weil es mit dem Boden
kollidiert Wir können uns das etwas
leichter vorstellen , wenn wir
zur Shell gehen und auf Lock zugreifen
und auf lineares Y klicken. Das bedeutet, dass die Shell
nicht rauf oder runter geht, egal welche Art von Physik auf sie angewendet wurde Wenn ich jetzt also eine
Granate abfeuere und mich wegbewege, können
Sie tatsächlich
sehen, wo sie sich befindet Und das
liegt wahrscheinlich daran, dass ich nicht wirklich
weiß, warum das so ist, aber wir werden das reparieren,
weil das sowieso nicht wirklich das ist,
was wir wollen. Gehen wir also zurück zu Shell
und lassen wir das lineare Y vorerst
gesperrt, und lassen wir das lineare Y weil
wir in der Lage sein wollen, dort zu debuggen, wo unsere Shell erscheint, wenn wir sie zum
ersten Mal spawnen Okay, eine Sache, die wir korrigieren müssen bevor wir weitermachen, ist, dass ich
vergessen habe, den Aufwärtsvektor
für unsere Lookat-Funktion anzugeben Wann immer Sie sich das ansehen, und es gibt auch eine Reihe anderer Funktionen, die einen Referenzvektor
benötigen, normalerweise den
Aufwärtsvektor, müssen
Sie im Grunde nur den
Vektor mit drei Punkten nach oben angeben, was ein konstanter Vektor ist, der nach oben in Y-Richtung
anzeigt. Und Godot verwendet das
für alle Arten von Berechnungen, um sicherzustellen , dass alles richtig
ausgerichtet ist Okay. Also das Erste, was
wir tun müssen, um unsere Granate richtig abzufeuern
, ist sie dort zu platzieren, wo sie
sein soll. Denn im Moment
habe ich das Gefühl, dass, wenn
wir die Schale spawnen, sie einfach um 00 in der Welt
spawnt Also werden wir das ändern.
Und um das zu ändern, brauchen
wir einen Verweis
auf den Feuerpunkt, das ist Markierung drei D. Also var
Granatenfeuerpunktmarkierung drei B. Also
ziehen wir das einfach hierher und wir haben einen Verweis
auf den Schusspunkt. Außerdem
müssen wir
eine Mündungsgeschwindigkeit für die
Granate definieren . Also lass uns das machen Danke, so
schnell oder wie viel Geschwindigkeit werden wir auf die Granate anwenden
, wenn sie abgefeuert wird, und wir können sie zu einem Int machen. Wir können es auf 20 setzen, und dann können Sie diesen Wert
später ändern, dann können Sie diesen Wert
später ändern, wenn Sie entscheiden, dass es entweder zu schnell oder zu langsam ist. Und bevor wir tatsächlich anfangen, die
Muschel auf der Welt zu platzieren, gibt es noch eine andere
Sache, die wir tun sollten. Und das heißt, wir sollten hier
einen Wert namens
Ignore Layer angeben , der eine Ganzzahl ist. Und warum werden wir das tun? Nun, weil, wie ich
bereits erwähnt habe, jede Granate
entweder vom Spieler
oder von feindlichen Panzern abgefeuert wird , und wir wollen nicht, dass die Granate sozusagen mit ihrem eigenen
Team
kollidiert Für den Spieler bedeutet das, dass
wir nicht wollen, dass eine
vom Spieler abgefeuerte Granate auf Kollisionen
mit dem Spieler getestet wird , zumal wir die Granate im Lauf
der Waffe
des Spielers spawnen Granate im Lauf
der Waffe
des Spielers Wir werden
etwas mehr Logik für
die Gegner benötigen , denn wenn
wir einfach die Kollision
einer feindlichen Granate
mit anderen Feinden deaktivieren , bedeutet
das, dass sich die
Feinde gegenseitig durchschießen können gegenseitig durchschießen Wenn wir also an dem Punkt
angelangt sind, an dem
wir KI einsetzen, werden wir die Panzer im Grunde
nicht
schießen lassen wir KI einsetzen, werden wir die Panzer im Grunde
nicht , wenn sie keine klare Sichtlinie
zum Spieler haben und
andere Panzer in der Nähe sind. Es gibt andere Möglichkeiten, dieses Problem
zu lösen, aber so werden
wir es machen. Das bedeutet, dass
wir
den Layer-Index der
Kollision angeben müssen , die wir
deaktivieren wollen , wenn eine
Granate abgefeuert wird, weil die gleiche
Methode der Feuergranate sowohl von Spielern
als auch von feindlichen Panzern
verwendet wird . Im Fall des Spielers wird
es also Ebene eins sein,
weil, wie Sie sich erinnern, die Werte der
Ebenen bei eins beginnen,
obwohl dort steht, dass
es Bit Null ist, was ziemlich unausstehlich ist. Also haben wir die
Feuerschale gleich eins, und dann werden
wir innerhalb des Panzers der Granate sagen, dass sie
ihren Wert für
die Kollisionsmaske
gleich der Ignorieren-Ebene setzen soll, und wir werden sie auf Falsch
setzen Das heißt,
wenn ein Spieler
eine Granate abfeuert und wir
eine Granate als Ignorierschicht übergeben, geht
sie zur Granate über. Und es wird die Kollisionsebene
oder
die Kollisionsebene festlegen , habe ich sie erzeugt oder
habe ich sie maskiert? Kollisionsmaske. Das ist richtig. Ich möchte sichergehen, dass
es das Richtige ist. Also wird es zur Kollisionsmaske gehen
. Es wird Ebene
eins auf False setzen, was bedeutet, dass sie ausgeschaltet
wird. Das bedeutet, dass eine vom Spieler
abgefeuerte Granate nicht mit dem Spieler kollidiert,
was wir wollen Und wir können diesen
Fehler ignorieren, weil wir diese Funktion nicht gespeichert haben, bevor
wir sie hier eingefügt haben Es war also mürrisch
, dass die Signaturen nicht übereinstimmten, und
jetzt sind sie gut Sobald wir das getan haben, können
wir tatsächlich
damit beginnen, die Schale zu positionieren und
auszurichten Nun wollen wir nichts
an der Position oder
Rotation der Granate ändern, bevor sie der Welt hinzugefügt
wurde Andernfalls erhalten wir
eine Fehlermeldung der Art
von Is
inside trees is equal to false. Und obwohl es nicht wirklich
eine große Sache ist, wollen
wir nicht, dass Godot
uns Fehler vorwirft Also die globale Position der Granate. Entspricht der globalen Position der Shell Fire
Points. Und jetzt, wenn wir zu unserem Spiel gehen und es
etwas leichter zu sehen machen, drehen
wir unseren Lauf. Und wir feuern, da ist unsere Schale. Jetzt zeigt es natürlich
in die falsche Richtung und es bewegt sich nicht
oder so. Und das werden wir
als Nächstes beheben. Das Ausrichten der Schale ist
etwas schwieriger. Tatsächlich habe
ich vor dem Dreh ein paar Stunden
gebraucht , um es herauszufinden, sodass Sie
von all meinen Schmerzen profitieren Es fehlt uns also
etwas an Begriffen. Okay, also habe ich
es Turmscharnier genannt. Sollte ein
Turmgelenk sein, aber was auch immer. Boop. Ist das besser? Das ist besser. Okay. Um die Schale zu
drehen, müssen
wir also in X-Richtung die Z-Drehung
des Turms
berücksichtigen Z-Drehung
des Turms Das ergibt nicht
viel Sinn. Schauen wir es uns an. Also, wenn wir zurück
zum Tank gehen, Boop. Also, schauen wir
es uns von oben an. Also der Fassankerpunkt
, den wir im Drehbuch als
Turmscharnier bezeichnet
haben , ist genau hier. Und weil der Panzer
nach vorne zeigt, also in
die
positive Z-Richtung, drehen
wir das Scharnier
mit der X-Drehung Aber weil der Tank in seinem
lokalen Raum
tatsächlich um 90 Grad gedreht wird , drehen
wir
ihn tatsächlich in Z-Richtung. Also das ist einfach nervig
, wenn alle rauskommen. Also die Z-Drehung
ist in diesem Fall die Auf-Ab-Rotation, denn als wir den
Tank ursprünglich nach rechts gerichtet
hatten, hat ihn das nach oben oder unten
bewegt. Dadurch wird die Schale
in die richtige Richtung geneigt. Wir
müssen die Schale jedoch
so abwinkeln , dass sie nach oben zeigt, und aus irgendeinem Grund müssen wir die Drehung
umkehren. Ich weiß nicht, warum
das so ist, aber es ist so. Dann müssen
wir die Drehung
des Turms
in Y-Richtung berücksichtigen Drehung
des Turms
in Y-Richtung Weil sich das Turmscharnier nicht wirklich
in Y-Richtung dreht Der Turm dreht sich. Und das werden wir uns noch
einmal ansehen. Gehen wir zurück zu drei
D. Also das Scharnier, das genau hier
ist dreht sich nicht, wenn sich
der Turm dreht Damit die Granate also in die Richtung zeigt,
in die sie
abgefeuert wird, müssen
wir die Drehung
der Geschütztürme berücksichtigen Sobald wir das alles gemacht haben, wird
die Granate in der
richtigen Ausrichtung
ausgerichtet sein in der
richtigen Ausrichtung
ausgerichtet Also lass uns rüber gehen und wir feuern. Und es wird einen
Narren aus mir machen, nicht wahr? Ordnung? Mal sehen,
was das Problem ist Nun, das Debuggen hat Spaß gemacht. Okay, aus irgendeinem Grund macht
das Master-Projekt, bei dem ich das
gestern mit den
exakt gleichen Zahlen zum Laufen gebracht habe, nicht dasselbe wie diese Version des Projekts mit den
exakt gleichen Zahlen Yay. Ich konnte das also beheben, indem ich ein paar Dinge getan Zuerst gingen wir
zurück zur Schale und stellten sicher, dass die Ausrichtung
etwas anders erfolgte. Sie haben vielleicht bemerkt
, dass wir uns zunächst von der X-Achse aus
gedreht haben, und ich bin mir nicht sicher warum wir das getan haben. Wir hätten es überhaupt nicht
tun sollen. Aber ich habe die Drehung zurückgesetzt und sie so
geändert, dass
wir
sie in Y verschoben haben, so gedreht haben , dass die Schale
nach vorne zeigt und in Z-Richtung, dass
die Schale nach vorne zeigt? Was passiert, wenn ich
das wieder auf Null ändere? Seltsam. Ich denke, die Grundausrichtung
des Netzes erforderte dies. Ich bin mir nicht sicher, warum das so ist. Und ich habe auch noch einmal überprüft, ob die Ausrichtung der Panzer korrekt
war, und ich habe den
Turm unter der Karosserie angeordnet, anstatt direkt
unter dem Ich bin mir nicht ganz sicher,
warum sich das darauf ausgewirkt hat.
Das hätte es wirklich nicht tun sollen. Aber ja. Sobald das
alles erledigt ist, können
wir die
Drehung um den ursprünglichen
Faktor für Z bewirken , der der negative Wert der Drehung
der Turmscharniere nach
oben und unten war negative Wert der Drehung
der , was in Ordnung ist Aber damit die
Y-Drehung korrekt funktioniert, mussten
wir die Drehung der Geschütztürme zur
Rotation der Panzer hinzufügen Andernfalls wäre sie nur dann richtig ausgerichtet
gewesen wenn der Panzer gerade nach oben oder
gerade
vorwärts oder rückwärts gerichtet gewesen oben oder
gerade
vorwärts oder rückwärts Also, wenn wir
so fahren und hier hoch fahren und
dann die Leertaste drücken, dann bewegen wir das Fass
weg, damit ihr es sehen könnt Jetzt haben wir eine Schale, die
perfekt ausgerichtet ist. Und wenn ich den
Panzer ausrichte, das Gleiche. Die Moral von der
Geschichte ist also, dass
man manchmal einfach
mit den Zahlen spielen muss, um
sicherzugehen , dass
alles richtig ausgerichtet ist, denn visuell
gesehen funktionieren viele
dieser Orientierungen, während sie
mathematisch gesehen nicht funktionieren Und das ist schlecht. Das
nächste, was wir tun
müssen, ist, einen sogenannten Impuls zu geben
. Und ein Impuls
ist in der Physik eine einmalige Kraft, die auf einen Körper
ausgeübt wird. Wenn wir also wollten, dass sich die Schale für immer
und ewig
ständig bewegt, würden
wir eine
Kraft anwenden, aber das tun wir nicht. Wir wollen nur, dass sie
anfänglich explodiert, damit sie angetrieben wird und dann Schwerkraft
und Geschwindigkeit die Oberhand gewinnen Und das nennt man Impuls. Ein Impuls ist also ein Vektor drei. Und in diesem Fall, und ich bin mir nicht ganz sicher,
warum es so gemacht wird. Sie würden denken, dass es in die andere Richtung gehen würde
, aber das ist es nicht, und es ist mir
auch egal. Wir beginnen mit dem hinteren Vektor
, der sich auf der
Rückseite der Schale befindet, und wir werden
diesen mit unserer Mündungsgeschwindigkeit multiplizieren Und wenn wir das
getan haben, können wir
diesen Impuls auf unsere Schale anwenden diesen Impuls auf unsere Schale Leider ist das noch nicht
alles, denn Vector Back ist ein
normalisierter Vektor, was bedeutet, dass er nur eins in
negativer Z-Richtung
sein wird eins in
negativer Z-Richtung
sein Und es wird nicht
korrekt
an der Ausrichtung des
Panzers ausgerichtet sein korrekt
an der Ausrichtung des
Panzers Es wird also grundsätzlich so sein, dass wir, um es auf den Punkt zu
bringen,
diesen Impuls mit der Ausrichtung der
Panzer rotieren müssen . Also können wir das
gleich hier unten machen. Wenn wir also unseren
Anfangsimpuls nehmen
, der ein gerader Rückvektor ist multipliziert mit unserer
Muskelgeschwindigkeit, schauen wir uns das in
unserer Schale an, so dass
17. Umwelt: Weltbeleuchtung und die globale Sonne: Willkommen zurück. In diesem kurzen, aber nicht weniger
interessanten Kapitel werden
wir uns ansehen, wie
das Erscheinungsbild der Umgebung mithilfe
der Weltumgebung
und
der gerichteten Lichtknoten verändert Umgebung mithilfe
der Weltumgebung
und
der werden kann. Wie Sie
hier sehen können, habe ich
das gerichtete Licht gelöscht , das wir in den
letzten Lektionen als
temporäre Sonne verwendet haben, und ich habe auch
die
Hintergrundfarbe so geändert , dass sie ein bisschen
wie ein Sonnenuntergang
aussieht. Nun, das ist nur eine
Vorschauversion. Wenn ich
das Spiel starten würde , kannst du sehen
, dass wir Nodite haben und der Himmel grau ist und überhaupt
nicht wie
der Sonnenuntergang aussieht, den wir geschaffen haben Und das liegt daran, dass
es sich um reine Vorschauen und sie über
diese beiden Schaltflächen hier gesteuert werden Wir haben die Vorschau-Umgebung
, in der, wenn wir sie ausschalten, der Sonnenuntergang stattfindet, der den Boden, den
Horizont und den Himmel
bedeckt Und dann haben wir auch
eine Vorschau des Sonnenlichts. Wenn wir das also ausschalten, geht
unser Sonnenlicht weg. Und wenn wir beide ausschalten,
können wir nicht viel sehen. dienen
also dazu, dass du
deine Umgebungseinstellungen anpassen und sie korrigieren kannst, bevor
du sie zu deiner Spielwelt hinzufügst, denn in früheren
Versionen von Gadot musstest
du die Einstellungen manuell anpassen
und dann
das
Spiel jedes Mal starten, musstest
du die Einstellungen manuell anpassen
und dann
das wenn du sehen
wolltest, wie
unterschiedlich sie aussahen, und das war für alle nur ein Problem
. Klicken wir auf diese drei Punkte und wir erhalten
diese Einstellungen
sowohl für die Vorschauumgebung als auch für die
Vorschausonne Und wir können hier all
die Dinge ändern , die
wir ändern wollen. So können
wir zum Beispiel für die Sonne ihren Winkel ändern. Wir können ihren Azimut ändern,
was auch immer das bedeutet. Wir können die Sonne richtig
heiß machen , wenn wir
zum
Beispiel tätowieren wollen, und den
Abstand der Schatten ändern Und sobald wir
eine Sonne haben, die uns gefällt,
machen wir ein paar lange Schatten Sobald wir eine Sonne haben, die wir mögen, setze ich sie wieder auf eine. Wir können es dann der
Szene als gerichtetes Licht hinzufügen. werden
wir uns In einer zukünftigen Lektion werden
wir uns
eingehender mit der
Beleuchtung befassen, aber Sonnenlicht wird
durch gerichtetes
Licht simuliert . Also hier ist einer Und dann stelle ich fest, dass ich,
seit ich der Szene ein gerichtetes
Licht hinzugefügt
habe, nicht mehr mit
der Sonne im Vorschaufenster herumspielen kann weil die Szene bereits ein
gerichtetes Licht mit drei D
enthält, Sie die Vorschaueinstellungen nicht
mehr
verwenden können , da
die Einstellungen von dem verwendet werden, was
bereits in der Szene vorhanden ist. Und das Gleiche können wir
für die Umwelt tun. Wie Sie sehen können, ändere ich
die Himmelsfarbe auf Orange. Ich kann es noch dunkler
orange machen, wenn ich möchte. Oder wenn wir
auf einem fremden Planeten sein wollen , können
wir ihn grün machen. Und hier gibt es eine kleine
Einschränkung Obwohl Sie den Boden gut
ändern können, können
Sie hier die
Grundfarbe ändern. Wenn Sie wollten, könnten
Sie tatsächlich den sogenannten Horizont
ändern,
das ist dieser kleine leuchtende Streifen
in der Mitte zwischen
Himmel und Boden,
aber Sie können das nicht
über die Sonnenvorschau tun Lassen Sie uns also entscheiden, dass
diese hellgrüne Sonne
genau das ist , was wir haben, und dann klicken wir auf
Umgebung zur Szene hinzufügen und wir erhalten einen
Weltumgebungsknoten Nun, der
Weltumgebungsknoten hat eine Reihe von Optionen, aber eine davon ist,
dass wir
die Umgebungseinstellungen ändern können , mit
denen wir hier oben gespielt haben und die sich in der
Umweltressource befinden. Wenn wir also darauf klicken, öffnen
wir ihn, und der Himmel, mit dem wir
gespielt haben, ist der Himmel. Wenn Sie also den Himmel öffnen und dann das Himmelsmaterial öffnen, ist
das Himmelsmaterial
ein prozeduraler Himmel. Jetzt können wir auch
Skyboxen und so verwenden, und das werden wir uns in einer späteren
Lektion ebenfalls ansehen das werden wir uns in einer späteren
Lektion ebenfalls Wenn wir den Himmel erweitern, musst
du wirklich
tief in diesen eindringen Und wenn du dann
endlich runtergehst und die
Himmelseinstellungen selbst
öffnest, hier sind
die Einstellungen, die wir geändert haben, und wenn wir jetzt
den Horizont ändern wollen, können wir das tun. Jetzt siehst du, dass ich da hinten eher einen
orangefarbenen Horizont habe. Und du kannst auch den Boden
ändern, also ändere ich den Boden
und ich mache ihn rot. Jetzt haben wir also einen wahrhaft fremden Planeten
, mit dem wir herumspielen Und Sie können hier auch
den Winkel der Sonne ändern ,
wenn Sie möchten Und das ist sehr tief drin. Es gibt auch eine
Reihe anderer Einstellungen, ähnlich denen für die Materialien,
die wir uns zuvor
für Bildschirmfläche,
Umgebungsverdeckung sowie Nebel und volumetrischen
Nebel
angesehen haben Und diese sind ziemlich schwierig richtig zu machen. Aber weißt du, wenn du willst, wenn du in einem
Schneesturm kämpfen
willst, dann hast du es Nun, diese Umgebung wird sich
tatsächlich auf das gesamte Spiel auswirken denn wenn du ins Spiel gehst, da diese Umgebung Teil der Arena
ist und die Arena Teil des Spiels ist, dann werden wir es sehen, wenn
wir ins Spiel gehen , und es
sieht ziemlich verrückt aus Aber du kannst
das auch überschreiben oder zumindest etwas hinzufügen, indem du deiner Kamera eine
Umgebung hinzufügst. Und tatsächlich war das früher
die einzige Möglichkeit, das in Gudo
zu tun, also ist
es nett, dass du dich
nicht mehr
damit auseinandersetzen musst . Aber
es ist immer noch verfügbar. Nehmen wir an,
gehen wir zurück in unsere Arena. Gehen wir zurück zur
Weltumwelt. Und habe ich den Nebel ausgeschaltet? Ja, es sieht so aus, als hätte ich den Nebel
ausgeschaltet. Okay. Nehmen wir an,
wir wollen, dass unsere Welt, Ermangelung eines besseren
Wortes, normal ist, in
Ermangelung eines besseren
Wortes, normal ist,
aber auf einer bestimmten Ebene oder
durch eine bestimmte Kamera wollen
wir eine Nebeleinstellung. Wir können also eine Umgebung
direkt zur Kamera hinzufügen, und das gibt uns alle
die gleichen Einstellungen. Jetzt können wir uns einfach im
Nebel bewegen und das aktivieren. Und wenn ich das Spiel jetzt starte, sollte
es beides kombinieren, und das tut es auch. Eigentlich sieht es ziemlich
gut aus. Alles in Betracht gezogen? Also ja, auf der
grundlegendsten Ebene verändert ihr die Umgebung und die
Beleuchtung in euren Szenen. Und wieder werden wir uns in einer zukünftigen Lektion mit
Richtungslichtern und
dergleichen befassen, aber das gibt
Ihnen die Grundlagen. Wir sehen uns in der nächsten Lektion wo wir wieder mit dem Programmieren beginnen.
18. Gameplay: Hinzufügen feindlicher Panzer über geerbte Szenen: Willkommen zurück. In dieser Lektion werden
wir uns mit der Erstellung von vererbten Szenen befassen, sodass wir unseren Panzer in
Unterklassen unterteilen und einen neuen Panzer mit
zusätzlichen Funktionen
bereitstellen können unseren Panzer in
Unterklassen unterteilen und einen neuen Panzer mit
zusätzlichen Funktionen
bereitstellen Schauen wir uns also unseren Panzer an. Es ist ein ziemlich cooler
Panzer und wir
haben Drehbücher, die Dinge machen,
und er wird ausgelöst, und er wird
sich bewegen und all das gute Zeug. Aber für einen feindlichen Panzer benötigen
wir
zusätzliche Informationen. Wir wollen, dass der
feindliche Panzer eine andere Farbe hat. Ich werde dafür sorgen, dass die
feindlichen Panzer langsamer nachladen. Außerdem müssen sie
von einer
KI-Zustandsmaschine
gesteuert werden , die wir in
der nächsten Lektion entwickeln werden, möchte ich sagen Wenn nicht, dann bestimmt nicht weniger als zwei
Lektionen später. Wahrscheinlich der nächste. Aber wie dem auch sei, kurz gesagt, wir wollen diesem Panzer ein zusätzliches
KI-Modul hinzufügen. Jetzt könnten wir einfach
die bestehende Panzerszene kopieren die bestehende Panzerszene und ihr dann unsere neuen
Informationen hinzufügen. Da es sich aber um eine
völlig separate Datei handelt, würden Änderungen,
die wir am ursprünglichen Panzer vornehmen, nicht
auf den neuen Panzer übertragen, und wir möchten, dass sie das tun Also werden wir eine so
genannte vererbte Szene verwenden. Wir gehen also von Szene aus,
statt von neuer Szene, sagen
wir neue und
geerbte Szene, und es wird uns fragen, von welcher Szene wir erben wollen Also lasst uns vom Tank erben. Jetzt haben wir eine neue Szene
und es ist unser Panzer Der Name ist weiß, was bedeutet, dass er einzigartig ist. Aber all diese gelben Namen, das sind die ursprünglichen
Knoten des Panzers, aber sie sind
gelb eingefärbt, um zu zeigen, dass sie
von der anderen Szene übernommen wurden. Wenn wir nun die andere Szene
ändern würden, würden
die Informationen in dieser
Szene aktualisiert. Lassen Sie uns das zum Beispiel als
Erstes speichern und
wir nennen es feindlichen Panzer. Wenn ich jetzt zum Panzer gehe und zum Nachlade-Timer gehe und die Gewichtungszeit auf
fünf
ändere , dann speichere ich sie Wenn wir jetzt zum feindlichen Panzer gehen, ist
der Nachlade-Timer jetzt fünf weil er
vom ursprünglichen Panzer übernommen Also lasst uns das wieder auf zwei setzen. Es ist jedoch möglich
, dieses Zeug
unabhängig von der
ursprünglichen Klasse
oder der Originalszene zu ändern unabhängig von der
ursprünglichen Klasse . Wenn wir also zu Feindpanzer zurückkehren, werden
wir
ihn in Feindlicher Panzer umbenennen. Und wir werden
es richtig buchstabieren. Los geht's. Außerdem können wir die Daten in diesen Werten tatsächlich ändern, wodurch aus dem ursprünglichen Tank außer Kraft gesetzt werden. ursprünglichen Panzer beträgt
der Nachlade-Timer also zwei, aber beim Nachlade-Timer des Feindes werden
wir ihn auf
drei ändern Jetzt drücken wir auf Speichern, und wenn wir zum ursprünglichen Panzer
zurückkehren, ist
der Gewichtstimer immer noch zwei, aber beim feindlichen
Panzer sind es drei Und wir werden das Gleiche tun, wir werden
die Farbe leicht ändern, und das ist der falsche
Tab. Da haben wir's. Wenn wir also zu der Leiche gehen, werden
wir auswählen,
dass es nicht die richtige ist. Wo ist es? Welcher
ist es? Da ist es. Wir werden die Farbe ändern. Nun, wir können die
Farbe des ursprünglichen Netzes ändern. Wie ich bereits erwähnt habe, wird
das jedoch szenenübergreifend gespeichert, und es ist etwas kompliziert, sodass wir es für diese Szene
einzigartig machen müssten. Und das
wollen wir nicht wirklich tun. Schauen wir uns also ein neues Feature an, oder zumindest neu in dem Sinne, dass wir es noch nicht
betrachtet haben, nämlich das Oberflächenmaterial. Damit können Sie hier ein völlig
neues Material
bereitstellen, und es wird
dieses Material außer Kraft setzen. Jetzt haben wir unser
Standardweiß, gehen runter zu Albito und ändern
es in Dunkelgrau Und wir werden sparen. Und jetzt, nur für die feindlichen Panzer, haben
sie einen grauen Karosseriestreifen. Und jetzt können
wir sie voneinander unterscheiden. Wenn wir jetzt ins Spiel gehen einen in unsere Szene ziehen wollen, was wir tun,
nehmen wir den feindlichen Panzer, wir ziehen ihn hierher, und dann benutzen wir das
Ding, um ihn zu bewegen, und
wir platzieren ihn hier und ändern seine Ausrichtung. Und jetzt haben
wir in unserer Szene einen feindlichen Panzer. Und wenn wir ihn uns ansehen, hat
er Informationen, die wir nicht sehen
können, weil
sie nicht exportiert wurden. Also klicken wir einfach darauf, um es zu
öffnen. Und da haben wir es. Wir sind wieder bei unserem feindlichen Panzer
und können überprüfen, ob seine Informationen so sind, wie
sie sein sollten. Timer neu laden Ist. Wenn Sie nun Informationen von hier aus
ändern möchten, können
Sie mit der rechten Maustaste darauf klicken und bearbeitbare Kinder
auswählen Das würde euch ermöglichen, diese Informationen hier zu
ändern, und sie würden dann in dieser speziellen
Instanz des Panzers gespeichert dieser speziellen
Instanz des Panzers Wir könnten also die Farben
der Panzer direkt
von hier aus ändern Farben
der Panzer direkt und
sie individualisieren lassen, obwohl sie sozusagen alle
im selben Team Okay, das ist also das
Ende dieser Lektion. Begleite mich in der nächsten Lektion, und wir werden
mit weiteren coolen Sachen weitermachen.
19. Zerstörung der Panzer: Willkommen zurück. In dieser Lektion werden
wir
lernen, wie man
die feindlichen Panzer so aufstellt , dass sie
vom Spieler zerstört werden können. Und das Erste, was
wir
tun werden, ist,
den feindlichen Panzer so zu bewegen , dass er den Spieler etwas besser
sichtbar
ist. Auf diese Weise
müssen wir nicht jedes Mal, wenn wir
das Spiel starten, nach
dem Typen suchen jedes Mal, wenn wir
das Spiel starten, nach
dem Typen . Okay, viel besser Als Erstes
müssen wir also
einige zusätzliche Daten
über den Panzer ändern, die wir einige zusätzliche Daten
über den Panzer ändern, die vom Spieler
geerbt haben und
die wir nicht mehr benötigen. Wenn wir also den
Panzer erweitern,
nein, wir sollten das
von der Panzerszene aus tun ,
sodass sich das auf
alle Panzer auswirkt. Als Erstes müssen wir also zur Kamera
gehen
und Sie werden feststellen, dass die
Kamera auf Aktuell eingestellt ist. Das ist schlecht, weil wir nur wollen, dass die Kamera des Spielers
aktuell ist, also deaktivieren wir das Andernfalls würden wir das Spiel aus der Sicht
des gegnerischen Panzers
betrachten und, weißt du, wir haben zwar gleiche
Rechte für Panzer und so, wir wollen nur, dass der Spieler sehen kann,
was er tut Außerdem ist der Panzer derzeit auf dieselbe
Kollisionsebene eingestellt wie der Spieler. Also müssen wir das Häkchen und wir müssen es so ankreuzen , dass es sich auf der Ebene des Feindes befindet Und wir wollen nicht, dass es passiert Nun, wir wollen, dass es
mit anderen Feinden kollidiert weil wir nicht wollen, dass sich Panzer
gegenseitig durchdringen,
aber wir wollen auch, dass es mit dem Spieler
kollidiert Und das sollte uns abdecken. Nun, das andere Problem ist
, dass der Tank gerade erbt oder der
Tank derzeit im Skript als Tank
festgelegt ist im Skript als Tank
festgelegt Und wie wir
im vorherigen Kapitel erwähnt haben, wird
der Panzer
einige zusätzliche Informationen haben , die er im Skript
verarbeiten muss Also gehen wir rüber
zum Inspektor und wir werden
ganz nach unten gehen , wo
es heißt: Drehbuch. Und das zeigt das
Drehbuch, das
derzeit dem feindlichen Panzer
beigefügt ist. Und ich war angenehm
überrascht, herausfand, dass sie das
kürzlich aktualisiert haben. Wenn ich also hierher gehe und „Skript erweitern
“ auswähle, was genau das ist, was wir wollen, generiert
es automatisch ein neues, von Tank
erbenes Skript namens Enemy Tank, was genau
das ist, was wir wollen, außer dass wir es
im Scripts-Ordner haben wollen Okay, jetzt erstellen wir
das. Und wir sind gut. In früheren Versionen von Gadot mussten
Sie das Skript manuell trennen und erneut anhängen oder
das Skript zumindest manuell erstellen und dann den
Klassennamen
festlegen und ihn dann im Inspektor
anhängen Und es ist jetzt einfach optimierter
. Ich muss
Open-Source-Software lieben. Also werden wir
dieses neue Panzer-Skript,
falls wir
es jemals richtig buchstabieren können, KI Tank nennen . Und wir werden auch
etwas an Panzern im
Allgemeinen ändern , denn im Moment ist
es möglich, dass eine Granate
nicht nur einen Panzer trifft, sondern auch die Hindernisse
oder den Boden der Arena. Aber das Einzige, was
wir zerstören
wollen , ist ein Panzer. Und es gibt verschiedene
Arten anzuzeigen, dass nur
Panzer zerstört werden können. Wir werden uns
eine der
einfachsten Methoden ansehen , und das sind Gruppen. Wenn wir also zu
unserem Panzer-Skript zurückkehren oder wenn wir zu unserem
Panzerobjekt zurückkehren und unter den Knoten gehen, sehen
wir sowohl Signale als auch Gruppen. Wenn wir also
zum Gruppen-Tab wechseln, werdet ihr sehen, dass wir keine Gruppen haben. Also werden wir eine neue Gruppe erstellen
und sie sllable nennen. Jetzt wird sie automatisch
den Szenengruppen zugeordnet,
was bedeutet, dass sie nur für Objekte
innerhalb dieser Szene
gültig ist und außerhalb der
Szene nicht
erkennbar ist . Das wollen wir nicht. Also
klicken wir mit der rechten Maustaste darauf und konvertieren es in eine globale Gruppe. Das bedeutet, dass jede Szene
im gesamten Spiel für diese Gruppe
verfügbar ist Wenn wir jetzt auf Speichern klicken und
zu unserem feindlichen Panzer gehen, können
wir sehen, dass der gegnerische Panzer, weil er
ein abgeleiteter Panzer ist, automatisch in
der Kategorie verkaufbar Unter Shell,
unserem Shell-Skript, haben
wir also ursprünglich diese
Methode, die am Körper eingegeben wurde, verwendet,
mit der wir
seit einigen Kapiteln
oder Lektionen nichts mehr gemacht mit der wir
seit einigen Kapiteln
oder Lektionen Das erste, was wir tun
wollen, ist, den Typ des
Körpers, der reinkommt, zu definieren,
und wir wollen, dass es ein Physikkörper
drei D ist und wir wollen, dass es ein Physikkörper . Und das wird
im Grunde
versuchen, jedes Objekt, das in
diese versuchen, jedes Objekt Methode übergeben wird
, in einen
Physikkörper drei D umzuwandeln,
und das wird funktionieren, weil das einzige, womit
die Schale kollidieren
kann, ein anderer
Physikkörper ist.
drei Ds, denen statische Körper,
starre Körper und
Charakterkörper gehören starre Körper und
Charakterkörper Also wollen wir immer noch, dass die
Schale verschwindet. Aber jetzt, und
wenn wir das nicht getan haben, ist das
teilweise der Bequemlichkeit halber. Teilweise ist es auch so, dass der Zugriff auf
Variablen, deren Typen spezifisch definiert deren Typen spezifisch definiert
sind,
für Gadot etwas effizienter Aber wenn wir hier
eine Wenn-Dann-Anweisung erstellen würden
und wir den Text eingeben
und dann auf einen Punkt klicken, nun ja, wir haben keine automatische Vervollständigung,
weil Gadot
nicht weiß, was für eine
Variable Wenn wir es also einem
physikalischen Körper mit drei D aufzwingen, dann gehen wir jetzt
hier runter und treffen auf den Punkt, haben
wir jetzt die haben
wir jetzt Und die Methode, die wir
wollen, heißt in der Gruppe I. Und ich frage mich, ob
du das ziehen kannst. Nein, das kannst du nicht. Also müssen
wir
es manuell eingeben. Also, wenn der Körper, den wir übergeben, zur
Gruppe Shellable gehört, dann wollen wir den Körper
zerstören, und das können wir mit
der Methode der drei Körper tun Wenn wir jetzt unser Spiel beenden, sollten
wir in der Lage sein, den feindlichen Panzer in die Luft zu jagen. Immer noch neblig. Bum. Versuch es nochmal. Bum. Nein. Bum. Okay, ich bin mir nicht sicher, ob ich
den Tank treffe oder ich einen
Fehler in meinem Drehbuch habe Da haben wir's. Direkter Treffer. Vielleicht möchtest du es
etwas einfacher machen, den Panzer zu treffen und zu experimentieren oder
uns zur Untersuchung zu inspizieren. Das ist das Wort, nach dem ich
suche. Wir sollten vielleicht untersuchen, warum das
passiert ist. Aber ja. Also das ist alles für diese Lektion. Und in der nächsten Lektion werden
wir unseren
feindlichen Panzern einige Fähigkeiten geben
, damit sie auf
den Spieler schießen und
versuchen können , ihn zurückzuschießen, denn sonst wäre
das Spiel weder fair noch unterhaltsam, oder In Ordnung, wir sehen uns dort.
20. KI: Staatsmaschinen: Willkommen zurück. In dieser Lektion werden
wir lernen, wie man eine Zustandsmaschine
baut, die
wir in der nächsten Lektion an unseren feindlichen Panzern
befestigen sodass sie herumfahren,
nach dem Spieler suchen
und dann auf ihn schießen können , und dann haben wir
tatsächlich ein Spiel. Was ist also eine Staatsmaschine? Eine Zustandsmaschine ist eine Klasse oder
ein Objekt oder was auch immer. In Godos Fall kann
es ein Knoten sein, und wir werden daraus einen Knoten
machen Aber unabhängig davon
überwacht eine
Zustandsmaschine grundsätzlich einen Zustand.
Und was ist ein Staat? Ein Staat ist gut, es ist wirklich ein Seinszustand. So
kann zum Beispiel ein feindlicher Panzer zahlreiche Zustände haben. Es kann nach einem Spieler
suchen. Es kann den Spieler angreifen. Es kann tot sein. Im Grunde ist
ein Zustand eine Methode, um zu beschreiben, was der Panzer bestimmten
Zeitpunkt tun oder tun sollte. Und wir können auf der Grundlage verschiedener Faktoren
von einem Zustand zum
nächsten übergehen . Wenn der Panzer den Spieler zum Beispiel nicht gesehen
hat, könnte
er sich im
Suchmodus befinden, was bedeutet, dass er sich auf der Karte bewegen
wird. Und sobald er den Spieler
entdeckt hat, kann
er in den
Angriffsmodus wechseln, was bedeutet,
dass er den Spieler angreift, und dann so weiter und so fort. Wir werden dies jedoch intelligent
tun. Wir werden eine
in sich geschlossene Zustandsmaschine entwickeln, die
theoretisch mit jedem Zustand umgehen kann
,
ohne dass sie speziell
für den feindlichen Panzer codiert
werden muss Auf diese Weise könnten wir, wenn wir unseren
Bäumen
eine Zustandsmaschine hinzufügen wollten , um sie wachsen zu lassen,
Feuer zu fangen oder
etwas Ähnliches um sie wachsen zu lassen,
Feuer zu
fangen oder
etwas Ähnliches, sehr einfach Das erste
, was wir tun werden ist,
in unserem Ressourcenordner eine neue Szene zu
erstellen, und diese Szene
wird ein Knoten sein. Und wir werden die
Szene State Machine nennen. Und das ist im Grunde genommen, ich
kann ums Verrecken nicht buchstabieren. Dies ist im Grunde nur eine Möglichkeit das manuelle Erstellen
einer Szene
im Szenenbaum zu umgehen manuelle Erstellen
einer Szene
im Szenenbaum Wir hätten es
hier oben leicht machen können , indem wir zu einer neuen Szene gegangen wären, aber das ist nicht wirklich wichtig Also klicken wir auf Okay. Und
jetzt haben wir eine Zustandsmaschine. Wenn wir also doppelklicken,
können wir die Zustandsmaschine öffnen, und wie Sie sehen, ist es ein leerer Knoten, an den
absolut nichts angehängt ist. Und das ist langweilig. Also werden wir unserer Zustandsmaschine ein
Skript hinzufügen, und es wird State Machine
heißen. Wir werden sicherstellen, dass es in den Scripts-Ordner
kommt. Und jetzt, und wir werden in der nächsten Lektion
sehen, wie Sie
diese Zustandsmaschine per Drag-and-Drop auf ein
beliebiges Objekt ziehen können . Das Erste, was
wir tun werden, ist ihr einen
eigenen Klassennamen zu geben. Und was muss eine
Zustandsmaschine tun? Nun, die Zustandsmaschine muss den Zustand
überwachen, in dem sie sich
gerade befindet, und dann feststellen , wann es Zeit ist, den Zustand zu
ändern. Und glücklicherweise hängt
das meiste davon
vom Zustand selbst ab. Unsere Zustandsmaschine
muss also
lediglich verfolgen, in welchem
Zustand sie sich gerade befindet. Und das habe ich wahrscheinlich gerade gesagt, aber ich werde
alt. Für unseren Staat? Nun,
bevor wir das tun, müssen
wir tatsächlich eine staatliche Klasse
erstellen. Gehen wir also unter Skripte. Wir werden einen neuen Ordner
speziell für
unseren State Machine hinzufügen . Wir werden das
State-Machine-Skript
hineinziehen , und glücklicherweise ist
Gudo intelligent genug, um zu erkennen, dass wir unsere Ressource
verschoben haben, sodass wir nicht wirklich ändern
müssen, wo wir
eigentlich keine Dateipfade oder so ändern müssen. Nichts wird kaputt gehen.
Es ist herrlich. Also dann werden wir ein neues Drehbuch
erstellen und es wird erben. Nun, es wird von nichts
erben Also sollten wir es wirklich
so machen? Ja, warum nicht? können wir jederzeit löschen.
State Machine, neues Skript. Zugeben und dann erstellen. Nun, ein Zustand
wird kein Knoten sein, und das liegt daran, dass sich
die Zustände nicht unabhängig voneinander verarbeiten
müssen und
sich auch nicht im Szenenbaum befinden müssen
. Wir wollen einfach eine
eigenständige GD-Skriptklasse. Also werden wir sie
Name nennen, Klassenname. Acht. Nun, wir könnten es zu einem Knoten machen, aber wir werden immer nur einen von ihnen
zu einem bestimmten Zeitpunkt
für eine Zustandsmaschine
im Spiel haben , also könnten wir es genauso einfach
zu einer Klasse machen und innerhalb des Skripts
zuweisen,
was wir gleich tun werden. Im Grunde hat jeder
Knoten,
den Sie dem Szenenbaum hinzufügen ,
einen Verarbeitungsaufwand, sodass wir nicht
mehr Knoten haben wollen, als wir benötigen. Und bevor wir etwas anderes tun, können wir
jetzt zurückgehen und der Zustandsmaschine mitteilen , dass sie einen Status
vom Typ State hat. Diese Zustandsvariable ist also der Zustand, in dem sich die Zustandsmaschine zu einem bestimmten Zeitpunkt
befindet. Da die
Zustandsmaschine ein Knoten ist, können
wir ihr eine
Prozessfunktion geben, und das bedeutet, dass
GIDO diese Funktion alle 60 Sekunden oder
im Grunde so Spiel verarbeiten kann etwa
60 Sekunden oder
im Grunde so viele Sekunden
ausführt, wie das Sie ähnelt der physikalischen Prozessfunktion, die
wir uns zuvor angesehen haben, außer dass das
Physiksystem garantiert immer mit 60 Frames pro
Sekunde läuft Die Prozessfunktion ist es nicht. GIDO versucht, sie mit 60 Bildern pro
Sekunde auszuführen, aber wenn Ihr Computer langsamer wird, ist
die Prozessfunktion
normalerweise die erste, die fehlschlägt Also werden wir es dem Brunnen sagen, wir
werden es zuerst überprüfen Also im Grunde wollen
wir der Staat
bereit ist, sich zu ändern? Wenn ja, ändere es. Wenn nicht, verarbeite es. Ja, wir werden
dort einen Fehler haben , das sind alles Kommentare. Zum Glück wird das alles innerhalb der
staatlichen Klasse selbst
erledigt. Wir werden also definieren, dass eine Funktion namens bereit ist, den Status zu ändern. Und es wird ein Bleion
zurückgeben. Und unsere Landesklasse wird
einfach ein Stummel sein. Es wird
eine abstrakte Klasse sein. Und GAdo erzwingt keine abstrakten Klassen, es sei denn, Sie arbeiten in C Sharp,
was wir nicht tun Aber Sie
werden die State-Klasse niemals von selbst
instanziieren State-Klasse niemals von selbst
instanziieren Wir
werden sie in
untergeordneten Klassen immer durch
objektorientierte Programmierung
und Vererbung überschreiben untergeordneten Klassen immer durch objektorientierte Programmierung Und das werde ich gleich erklären
. Wir haben es technisch gesehen die ganze Zeit
benutzt, aber ich werde es
genauer erklären, sobald wir es tun. Und dieser wird standardmäßig False
zurückgeben. Weil ein völlig leerer Status den Status niemals ändern wird. Dann benötigen wir
natürlich eine Prozessfunktion. Und dieses Mal setze ich
den Unterstrich nicht davor
, weil
ich eigentlich nicht weiß, warum Godot
Unterstriche für einige seiner
internen Funktionen wie diese verwendet ,
aber das werden wir nicht tun, hauptsächlich nur, weil
Sie
dann auf den ersten Blick denken könnten, dass es sich um hauptsächlich nur, weil
Sie
dann auf den ersten Blick denken könnten, einen
Knotenprozess handelt, und das ist es Und eine
Sache, die wir auch brauchen
werden, ist, dass
wir die Zustandsmaschine
an jede dieser Methoden übergeben müssen. Wir könnten tatsächlich, sobald
wir den Zustand erstellt haben, einfach einen Verweis auf
die Zustandsmaschine selbst angeben. Eigentlich nein, wir
müssen die Zustandsmaschine nicht übergeben. Was wir
übergeben müssen, ist das
sogenannte überwachbare Objekt Und das ist nicht einfach zu sagen. Also nennen wir es einfach
Monitor Monitorable Object. Und für das überwachbare Objekt werden
wir keinen Typ
definieren
, weil es buchstäblich alles sein kann Der Prozess muss also nicht
unbedingt irgendetwas tun. Und dann werden
wir eine andere Methode haben , die
im Grunde ein Event-Handler sein wird, also den Status ändern. Und wieder benötigen wir
das überwachbare Objekt. Ein unveränderter Status
wird immer dann
aufgerufen, wenn wir unseren Status
ändern Lassen Sie uns also etwas mehr über
dieses Monitortabellenobjekt sprechen, und ich werde es so oft wie möglich vermeiden
, dieses Wort zu sagen ,
weil es nicht einfach zu sagen ist. Und weißt du eigentlich was? Wir können es einfach ändern,
anstatt die Wanne zu überwachen, was, wissen Sie, impliziert, dass es etwas
Besonderes an sich hat. Nun, wir nennen es überwacht,
weil es das ist, was es ist. Und es ist auch einfacher zu sagen:
Überwachtes Objekt. Da hast du's. Was ist ein überwachtes Objekt? Die Zustandsmaschine
wird also alles überwachen, woran sie angeschlossen ist. In diesem Fall wird
es der feindliche Panzer sein. Und das Objekt, das die
Staatsmaschine selbst und damit die Staaten überwachen,
bestimmt, ob sich die Zustände ändern oder nicht. Wenn
wir also zum Beispiel den feindlichen Panzer überwachen, möchten
wir vielleicht vom
Suchstatus zum
Angriffsstatus wechseln , je nachdem, ob
der Panzer den Spieler gesehen hat. Das bedeutet also, dass
die Zustandsmaschine Lage sein
muss, ein Objekt zu
überwachen. Standardmäßig überwacht unsere Zustandsmaschine ihren übergeordneten Computer, da der Zustandsmaschine immer
direkt an das Objekt angehängt wird , das er überwacht. Also werden wir eine Variable
namens überwachter Knoten erstellen, und wir werden eine Funktion erstellen, eine fertige Funktion für
unsere Zustandsmaschine. Und innerhalb der Zustandsmaschine wird
der überwachte Knoten
sofort dem übergeordneten Knoten
der Zustandsmaschine zugewiesen. Wenn wir also unsere
Zustandsmaschine zum feindlichen Panzer hinzufügen würden, was verderben würden, oder wir werden
es in der nächsten Lektion tun. Wenn wir es gleich hier hinzufügen würden, würde
die Methode get parent den Panzer zurückgeben, was genau das ist, was wir wollen. Und dann werden wir den überwachten Knoten an
die Zustandsfunktionen übergeben . Also lass uns das machen.
Jetzt, wo wir im Prozess sind oder jetzt können wir den Prozess
ausfüllen. Wenn der aktuelle Status bereit
ist, den
Status basierend auf dem Status
des überwachten Knotens zu ändern , dann
wird der neue Status gleich sein wie, nun,
das wissen wir noch nicht, oder? Nun ja,
haben wir den Status
definiert? Nein, haben wir nicht. Okay. Es gibt also noch eine weitere Methode , die der Status definieren
muss, und die heißt
Determine Next state. Jeder Staat wird also
wissen , in
welche Staaten er übergehen kann. Und wir werden eine Zeichenfolge
zurückgeben. Und die Zeichenfolge
wird der Name
des neuen Zustands sein , in den wir wechseln
wollen. Und welches Format wird
das sein? Nun, wir werden es gleich sehen. Also ein Standard oder besser gesagt
ein abstrakter Zustand, den
wir nie wirklich instanziieren werden, wird instanziieren standardmäßig die Zeichenfolge
default
zurückgeben,
weil ein Teil des Designs
meiner Zustandsmaschine im Allgemeinen
darin besteht, weil ein Teil des Designs dass ich möchte, dass sie
einen Standardstatus hat , der der Anfangszustand ist
, in
dem sich die Zustandsmaschine
befindet,
wenn sie zum ersten Mal gestartet wird Anfangszustand ist
, in
dem sich die Zustandsmaschine
befindet, wenn sie zum ersten Mal gestartet Und das werden wir in Kürze definieren. Aber jetzt, wo wir
festgelegt haben, dass der nächste Staat definiert , können
wir sagen: Nun , das
haben wir
eigentlich noch nicht. Okay. Also
das bekommen wir gleich. Pass. Andernfalls, wenn der Status nicht bereit
ist, den Status zu ändern,
wird der Status des Prozesses
auf der Grundlage des überwachten Knotens festgelegt. In Ordnung, also was machen wir hier? Nun, wir benötigen eine Liste der Staaten, die die
Zustandsmaschine unterstützt, sowie deren Namen Um das zu tun, werden
wir ein Wörterbuch
exportieren. Und wenn Sie noch nie
ein Wörterbuch benutzt haben, ist
ein Wörterbuch eine Liste von Einträgen, und ich werde Ihnen gleich zeigen
, wie das funktioniert. Im Grunde ist es eine Liste
von Schlüssel-Wert-Paaren, und ein Schlüssel ist keinem bestimmten Wert zugeordnet , sodass
Sie sie nachschlagen können. Die beste Art, es zu beschreiben, ist
wie ein Telefonbuch, oder? Ich zeige mein Alter. Telefonbücher gibt es
wahrscheinlich nicht mehr. Aber nehmen wir an,
Sie haben ein Buch allen
Telefonnummern in Amerika, und der Schlüssel könnte
der Name der Person sein, und dann wäre der Wert
ihre tatsächliche Telefonnummer. Wenn Sie also ihren Namen wüssten, könnten
Sie sie anhand ihres Namens
nachschlagen, und Sie würden die
Telefonnummer zurückbekommen. In diesem speziellen Fall
wird
das Wörterbuch also leer sein, aber sobald wir im
nächsten Kapitel
eine neue Zustandsmaschine erstellt im
nächsten Kapitel
eine neue Zustandsmaschine haben,
können wir diese ausfüllen. Aber im Moment wollen wir
das jetzt durch die Syntax für
den Zugriff auf
eine Zeichenfolge oder den Zugriff auf einen
Wert im Wörterbuch ersetzen die Syntax für
den Zugriff auf . Der Status wird
also den Staaten entsprechen, und Sie greifen auf den Wert
eines Schlüssels mit der Klammernotation wie Sie es bei einem Array tun würden. Staaten bestimmen tatsächlich,
nein, es sind keine Staaten. Es ist Staat. Deshalb
bekommen wir jede automatische Vervollständigung. Ermitteln Sie den nächsten Status. Und wenn ich mich richtig erinnere,
ja, in Ordnung, sollten wir ihm
das überwachte Objekt geben Das überwachte Objekt
wird fast immer notwendig sein.
Bestimme die nächsten Staaten. Weil wir es so
einfallsreich machen wollen, dass der Zustand anhand
verschiedener Zustände des Objekts bestimmt wird. Und wir bekommen hier einen Fehler, aber jetzt, wo wir ihn gespeichert haben
, sollte er verschwinden.
Es wird nicht verschwinden. Da haben wir's. Okay, leider können
wir das noch nicht ausführen,
aber es gibt noch eine
Sache, die wir tun
müssen, bevor wir zum nächsten Kapitel übergehen , damit ich das
tatsächlich implementieren und Ihnen
zeigen kann , wie das alles funktioniert Und das heißt, wir müssen dem Staat
einen Setter hinzufügen. Zuallererst, was ist ein Setter? Ein Setter ist eine Funktion
, die Gadot aufruft,
falls sie existiert, um zu definieren, ob einer bestimmten Variablen ein Wert zugewiesen werden
soll Wenn ich also zum Beispiel eine Setter-Funktion
definiere hier eine Setter-Funktion
definiere und sie immer dieselbe Signatur
haben, nimmt
sie immer den nimmt
sie immer Immer wenn ich versuche, so
etwas zu tun und sage, dass state gleich dem ist, was auch immer
das sein wird, ruft
Gadot
diese Funktion auf und übergibt, was auch immer das sein
wird, als Wert Das Einzige, was wir in
unserem Setter
immer tun wollen , ist die
Variable dem Wert zuzuweisen In diesem Fall wollen wir aber auch den
State-Handler aufrufen. Also sagen wir jetzt Status bei Änderung des Status bei einem
überwachten Objekt. Wann immer wir das tun, wird es das
automatisch tun. Nun, wenn wir den Setter hier nicht
definieren würden, könnten
wir ihn einfach hier platzieren Aber wie Sie sehen können, werden
wir den Standardstatus bereit zuweisen
wollen, was ich genauso
gut jetzt tun könnte, Status entspricht Status Und da ich es auch
hier einstelle, ich daran denken
, es hier zu platzieren,
wenn
ich das nicht
im Setter machen würde Wenn es also
Standardcode gibt, den Sie jedes
Mal ausführen
müssten, wenn Sie den Wert einer
Variablen ändern, sind
Setter von unschätzbarem Wert , und wir werden
sie häufig verwenden, wenn wir uns Benutzeroberflächen
ansehen denn jedes Mal, wenn
wir einen Wert festlegen, möchten
wir ein Signal
auslösen, um
die Benutzeroberfläche darüber zu informieren , dass sich die Variable geändert
hat, sodass wir
können Wie dem auch sei, das ist jetzt erledigt, aber da wir keine Bundesstaaten
haben, wird
es uns
nichts nützen, also kann ich es tatsächlich ausführen
und Ihnen zeigen, wie es funktioniert. Aber wir können jetzt zur
nächsten Lektion übergehen und die
Zustandsmaschine
für den feindlichen Panzer
einrichten, und ich werde das
schnell beheben. Sehen wir uns dort?
21. Hinzufügen eines Zustandsrechners zum gegnerischen Panzer über ECS: Willkommen zurück. Wir werden jetzt unserem feindlichen Panzer unsere
Zustandsmaschine hinzufügen und
einen Standardstatus einrichten , sodass der
Panzer seinen Status verarbeiten kann, obwohl er technisch gesehen
nichts tut. Und wenn wir dann
das ganze Framework eingerichtet haben, können wir damit beginnen
,
die eigentliche künstliche
Intelligenz zu entwickeln die eigentliche künstliche
Intelligenz , die den Panzer zum Laufen bringt. Schauen wir uns also unseren Panzer an. Und das Erste
, was wir
tun werden, ist, einfach unsere Zustandsmaschine auf
unseren Tank zu ziehen . Boop, und da ist es Technisch gesehen ist das, was wir hier
tun, eine Form des Programmiermusters,
das als Entity-Component-System bekannt das als Entity-Component-System Und Godot gibt in
seiner allgemeinen Architektur
quasi Lippenbekenntnisse dazu ab, in seiner allgemeinen Architektur
quasi Lippenbekenntnisse dazu ab, in dem Sinne, dass der feindliche Panzer als Einheit betrachtet
wird
und alles, was sich darunter
befindet dem Sinne, dass der feindliche Panzer als Einheit betrachtet
wird
und alles, was sich darunter
befindet, als Komponenten betrachtet wird Wenn Sie mit Unity vertraut sind, ist
es in
Unity solider strukturiert , wo Sie
ein Spielobjekt haben , dem Sie verschiedene Komponenten
hinzufügen können Und die Philosophie ist, dass die Komponenten von nichts wissen
müssen nichts wissen
müssen Sie können einfach
mit sich selbst umgehen, und das wird das Ende sein. Und die Entität ist
gewissermaßen dafür verantwortlich, sie ihr Ding
machen zu lassen und auch darauf zu
reagieren, was sie tun In diesem Fall ist
die Staatsmaschine
also ein Bestandteil der Entität,
die der feindliche Panzer ist Und abgesehen von der Tatsache
, dass sie Dinge aus den Panzerdaten
liest, muss sich
die Zustandsmaschine eigentlich nicht
darum kümmern , was der Panzer
tut, auch wenn sich das ändern kann. Wer weiß? Wir
werden das im Laufe der Zeit entwerfen. Kurz gesagt,
wenn Sie Artikel haben, die an ein Master-Objekt
angehängt sind, und diese Elemente sind ziemlich
gut abgesaugt oder isoliert, isoliert Sie können das als ein System mit Entitätskomponenten betrachten. Auf diese Weise müssen
wir nicht, wie ich in
unserem letzten Kapitel gesagt habe, die Zustandsmaschine viel darüber
weiß, woran viel darüber
weiß sie
angeschlossen
ist, denn ihr einziger Zweck besteht darin, Staaten zu
überwachen. Lassen Sie uns also einige
Staaten erstellen, damit sie sie überwachen kann. Wir werden in den Status Machine wechseln und ein neues Skript erstellen, und es wird von State
erben und es wird den Status
Idle Okay. Und dann werden wir darauf
doppelklicken, um es zu öffnen. Nun, was wird dieser
Ruhezustand bewirken? Es wird keine
verdammte Sache bewirken. Es ist ein reiner
Platzhalterstatus, damit ich Ihnen
zeigen kann , wie diese
Architektur funktioniert Jetzt, da die
Zustandsmaschine existiert und wir unser
States-Wörterbuch
bereits definiert haben, können
wir dieses Ding ausfüllen Also, wir werden darauf klicken
und jetzt können Sie sehen, dass es mich
nach einem neuen Schlüssel
und einem neuen Wert fragt. Also klicke ich hier auf den
kleinen Stift und der Schlüssel wird
eine Schnur sein. Und da wir es bereits verwendet haben, müssen
wir
die Standardzeichenfolge definieren. Nun, was wird der
Wert sein? Nun, Wörterbücher in Godot sind großartig, weil ihre Werte buchstäblich alles sein
können In diesem Fall möchten wir also, dass unser Wert
das Idle-State-Skript ist
, das wir Aber bevor wir das tun,
lassen Sie uns noch eine andere Sache tun. Unser inaktiver Zustand wird
etwas brauchen. Wenn Sie sich erinnern, haben wir eine
Methode namens nchange state. Wir möchten also, dass unser Idle-Status die Tatsache
meldet, dass es
sich jetzt um den aktuellen Status handelt Im unveränderten Zustand werden
wir also eine
Print-Anweisung hinzufügen, einfach der Status Idle steht. Wenn wir also in den Status wechseln, wird das auf der Konsole
ausgedruckt
und wir wissen, dass das
gesamte System, das wir
zusammengestellt haben, tatsächlich funktioniert. Unser neuer Wert wird
also ein neues Objekt sein. Zum Glück für uns werden
in Godot Skripte,
auch Skripte , die nicht
instanziiert oder
in Knoten oder so umgewandelt wurden , nur die Skripte selbst als
Objekte betrachtet Genauer gesagt, wenn
ich mich richtig erinnere, werden sie Was wir
hier also tun müssen, ist leider, die einzige Option, die wir
haben, ein neues GD-Skript ist, und das wollen wir nicht,
weil es buchstäblich von einem neuen
leeren Skript
ausgehen wird . Also wollen wir hier ganz nach unten scrollen und zum Laden gehen. Jetzt kann ich auch schnell
laden, weil ich das schon einmal
gemacht habe, aber Sie haben nicht, wir werden
den gesamten Prozess durchgehen. Es wird
uns also bitten, eine Datei zu öffnen. Wenn wir jetzt zu Skripten übergehen, State Machine, haben wir Z nichts. Und das liegt daran, dass
seltsamerweise eine GD-Skriptdatei
kein anerkannter Dateityp
für solche Dinge ist kein anerkannter Dateityp
für solche Dinge Also wollen wir
ganz nach unten gehen und alle Dateien auswählen, und dann können wir
unseren Ruhezustand auswählen Und als letztes müssen
wir auf Schlüsselwertpaar
hinzufügen klicken. Jetzt ist unser Leerlauf-Skript der Zeichenfolge
default in unserer Statusliste zugewiesen. Und das bedeutet, dass wir noch
eine Sache in
unserer Zustandsmaschine tun müssen . In unserer Ready-Funktion müssen
wir tatsächlich den Punkt Nu
hinzufügen, müssen
wir tatsächlich den Punkt Nu
hinzufügen denn da das GD-Skript im Grunde eine Klassenressource
ist, müssen
wir
eine neue in unserem Status instanziieren, weil unser Zustandsobjekt
ein Status und
keine Skriptressource ist keine Skriptressource Wenn wir das tun, jetzt, wo wir eine Zustandsmaschine
auf unserem feindlichen Panzer
haben, bedeutet das, dass der feindliche Panzer,
wenn er zu Beginn des Spiels den Szenenbaum
betritt ,
seine Bereitschaftsfunktion aufruft, und er wird die Liste
der Knoten darin
durchgehen und ihre Bereitschaftsfunktion
aufrufen. Und wenn es
die Zustandsmaschine erreicht, wird die Zustandsmaschine das übergeordnete Element übernehmen, was natürlich der
Tank als überwachter Knoten ist. Dann wird es den Status auf den
Status setzen
, den wir standardmäßig in unserem
Wörterbuch definiert haben. Und in diesem Fall ist
es der Ruhezustand, also holen
wir uns das zurück, und dann rufen wir
dort new auf, und das gibt
uns ein neues Zustandsobjekt. Und nur bis und tatsächlich müssen
wir es dort nicht einmal drucken, denn sobald es zugewiesen ist, wird
es Change State aufrufen,
was bedeutet, dass wir das Wort
Idle State in unserer Konsole sehen
sollten . Schauen wir uns also an, ob das funktioniert. Und da ist er, der Ruhezustand. Okay, jetzt, wo wir dieses Framework eingerichtet haben, können
wir tatsächlich
damit beginnen, Zustände für
den feindlichen Panzer zu
erstellen , sodass er tatsächlich Dinge tun
kann Wir werden
einige zusätzliche Komponenten hinzufügen müssen. Da ist wieder dieses Wort
für unsere Panzereinheit, und sobald wir
das getan haben, können wir
mit ihnen innerhalb des Staates arbeiten .
Also lass uns anfangen. Aber bevor wir das tun,
eine kurze Anmerkung: Der Idle-Status und die anderen Zustände
, mit denen wir arbeiten
werden, nutzen stark Vererbung
des objektorientierten
Programmierparadigmas, von dem Godot sozusagen ein großer
Nutznießer ist Das bedeutet also, dass wir,
wenn wir eine Basisklasse erstellen, was wir
hier mit einem Zustand gemacht haben, und dann eine untergeordnete
Klasse erstellen, die diese Klasse erweitert, allein aufgrund der
Erweiterung der Klasse, wir alles
innerhalb der Klasse erhalten. Wenn ich
diese Funktion also nicht definiert hätte, würde
der Ruhezustand all
diese Funktionen
kostenlos erhalten , und das tut er immer noch. Aber wenn wir dann
unsere Change-State-Methode neu definieren, was wir getan haben, wird das, was so
genannt wird, dadurch außer Kraft gesetzt Wenn wir das also nicht getan hätten
und einfach die
bestehende Methode namens existing on
change state verwendet bestehende Methode namens existing on hätten,
wäre nichts passiert Wir werden also eine Reihe
von
untergeordneten Klassen erstellen, um die State-Klasse zu
überschreiben, und dann die Basisfunktionalität mit
der geerbten untergeordneten
Funktionalität überschreiben Basisfunktionalität mit
der geerbten untergeordneten
Funktionalität der geerbten untergeordneten
Funktionalität Und wir können immer noch auf die
Funktionen der Superklasse
oder der übergeordneten Klassen
zugreifen Funktionen der Superklasse
oder der übergeordneten Klassen indem wir das Schlüsselwort super verwenden Wenn
ich also zum Beispiel
die Base-Change-State-Methode aufrufen möchte, könnte ich einfach
Super on Change State sagen. Natürlich müsste ich an dem überwachten Objekt
vorbeigehen. Also werden wir
das vielleicht in einigen Fällen tun, aber höchstwahrscheinlich
werden wir es wahrscheinlich nicht tun, aber diese Funktionalität
steht uns zur Verfügung. Okay, genug Theorie.
Lass uns loslegen. Bevor wir beginnen, eine kurze Notiz. Sie erinnern sich vielleicht, dass
ich in
der vorherigen Lektion einen kleinen Fehler behoben
habe, bei dem ich den Punkt Nu zur
Statuskonfiguration
hinzufügen musste . Ich musste das auch bei
der Prozessmethode tun , wenn wir den Status
geändert haben , weil dieser
ursprünglich fehlte, und wenn wir
den Status einmal geändert hatten,
hätte das den Absturz verursacht. Aber
in unserer vorherigen Lektion hat es keinen Absturz verursacht weil wir den Status nie wirklich geändert haben, aber
jetzt sind wir dabei, es zu tun. Letztlich
wird unser Panzer also zwei Zustände haben. Entweder
bewegt er sich auf der Karte und
sucht nach dem Spieler, was als Jagdzustand bezeichnet
wird, oder er wird
auf den Spieler schießen, was als Feuerzustand bezeichnet
wird. Eines der ersten
Dinge, die wir
tun müssen, ist also , diese Staaten zu
schaffen. Also erstellen wir ein neues Skript und sie erben von state, und es wird Firing State
heißen Und wir machen das Ding auf. Und dann machen wir
genauso 40 Hunting State. Nun, es gibt ein paar Dinge , die wir tun
müssen um den Grundstein
dafür zu legen , dass das
alles funktioniert, und wir werden all das tun und dann werden wir den
Code für die Staaten erstellen Das allererste, was
wir tun müssen, ist, diese beiden Staaten
zu unserer Zustandsmaschine
hinzuzufügen Wenn wir also mit der linken Maustaste
auf die Zustandsmaschine klicken, werden
Sie sehen, dass wir hier unseren
Standard-Ruhezustand hatten. Jetzt fügen wir also einen neuen Status oder eine neue Zeichenfolge für ein
Schlüssel-Wert-Paar hinzu, und das
wird als Auslösen bezeichnet. Und natürlich
wird der Wert ein Objekt sein, und dann ziehen wir
den Auslösezustand
hinein und klicken dann, um
das neue Schlüssel-Wert-Paar hinzuzufügen. Und dann werden wir
dasselbe für unseren Jagdstaat tun . Also nennen wir es Jagd. Und das werden wir hinzufügen. Und jetzt kann
unsere Staatsmaschine alle unsere Staaten
erkennen. Um also mit
dem Jagdstatus zurecht
zu kommen, werden
wir eigentlich
zuerst den Feuerzustand machen , weil er
von beiden einfacher zu implementieren ist, aber es gibt eine Sache,
die wir schaffen müssen,
um den Jagdzustand zu erstellen. Pathfinding ist also ein extrem
kompliziertes Thema, und Godot hat seine eigene eingebaute
Pfadfindungsnavigation, aber wir werden sie nicht verwenden
, weil angesichts der Tatsache , dass wir
die Art und Weise, wie sich der Panzer bewegt, manuell handhaben, es
viel mehr Code produzieren wird, als ich Ihnen mitteilen möchte , was vor sich geht. Also werde ich eine einfachere
Version von Pathfinding machen, ist Dann können Sie
sich entweder in Godot-Navigationsnetzen befassen Ihrer Freizeit mit
Godot-Navigationsnetzen befassen oder einfach nur die
Pfadfindung im Allgemeinen erforschen Aber ich werde
Ihnen zeigen, wie das geht,
ist, dass es definitiv einer
der Industriestandards ist, auch wenn
wir eine sehr,
sehr
abgespeckte Version davon sehen sehr
abgespeckte Also
das Erste, was wir
tun werden , ist, in unsere Arena
zurückzukehren Und wie Sie hier sehen können, hat
die Arena eine Menge
verschiedener Hindernisse und so weiter. Also werden wir
eine neue Art von Knoten
für die Arena erstellen eine neue Art von Knoten
für die Arena Das Erste, was wir tun
werden, ist einen neuen Knoten drei
D hinzuzufügen . Und der Grund, warum
wir das tun werden,
ist, dass wir, nur um zu verhindern, dass
alles
unübersichtlich wird, alle Knoten, die
wir
hinzufügen werden, unter diesem Knoten drei D gruppieren wollen alle Knoten, die
wir
hinzufügen werden, unter diesem Knoten . Also lasst uns
ihn in Path-Knoten umbenennen Und warum mache ich das?
Das liegt daran dass
ich
eine neue Art von Knoten erstellen werde
, der NAPoint genannt und wir werden in etwa 2 Sekunden sehen, wie
das geht Und was
passieren wird, ist, dass ich die Karte
mit diesen NavPoints
und den Panzern übersäen
werde .
Die feindlichen Panzer werden
diesen NavPoints folgen, um sich auf der Karte zu
bewegen Und das ist eine der
ursprünglichen Standardmethoden KI in vielen Ego-Shootern
und ähnlichen Spielen Es ist viel einfacher
als zu versuchen, ein einzelnes Navigationsnetz zu verwenden, was Sie mit Godot auch
einrichten können Im Grunde sind es viel
weniger Punkte, mit denen man sich befassen muss. Und wir werden es so machen, weil
Sie
so eine Vorstellung davon bekommen, was eine kompliziertere
Lösung beinhalten würde. Und es gibt uns auch eine
kleine Chance,
unsere aufkeimenden Fähigkeiten in der
Vektormathematik unter Beweis zu unsere aufkeimenden Fähigkeiten in der
Vektormathematik unter Beweis anstatt
alles dem Godot zu überlassen Lassen Sie uns also eine neue Szene erstellen, und wir werden
daraus eine Drei-D-Szene machen,
und wir werden den Typ
der Szene in einen
statischen Körper mit drei D ändern .
Und wir werden
diese drei D in Nav Point umbenennen Und wie schon zuvor werden wir diesem AV-Punkt eine
Mesh-Instanz Three
D hinzufügen ,
damit wir ihn sehen können Und wir werden daraus
ein Kapselnetz machen , denn warum nicht? Und wir werden
das Material so verändern, dass das
Navigationsnetz tatsächlich
sichtbar ist , ziemlich gut sichtbar Wir geben ihm die
Albedofarbe Gelb. Und wir werden auch expandieren. Okay, das Netz ist in Ordnung. Wir ändern die
Höhe auf 1 Meter, was daraus eine Kugel macht. Interessant. Und dann
reduzieren wir die Anzahl der Klingeltöne, weil ich meine, letztendlich werden
wir es tatsächlich in ein paar Minuten
verstecken. Es muss also nicht fantastisch aussehen. Dann fügen wir natürlich
eine Kollisionsform drei D hinzu, und das wird eine Kugel
sein, weil wir sowieso ein
sphärisches Objekt geschaffen haben. Ordnung, wir haben sie
und wir können sie etwas nach
oben verschieben
, sodass sie nicht sofort
auf dem Boden liegen Und wir müssen dem in
keiner Weise ein Skript
beifügen . Aber wir werden es speichern. Jetzt werden wir ein paar
Dinge
ändern , die wir vorher nicht
wirklich geändert haben. Das Erste,
was wir tun werden, ist natürlich, die Kollision einzustellen. Wir werden die Maske deaktivieren, weil
der NavPoint selbst nicht nach
Kollisionen mit irgendetwas suchen
muss Und wir werden
eine neue Ebene hinzufügen und sie NAV
Points nennen Und wir werden natürlich die
NavPoints-Kollisionsebene in NavPoints ändern NavPoints-Kollisionsebene in NavPoints Und dann gehen
wir zur Mesh Instance Three D und wir gehen runter
zu den visuellen Instanzebenen, und wir werden eins
deaktivieren und Und wir werden
die Ebenennamen so ändern , dass
Ebene zwei NavPoints ist Und warum habe ich das getan? Nun, die visuellen Ebenen ähneln den
Kollisionsebenen darin, dass man sie
gruppieren kann , und es ist Gruppen auch
insofern
ähnlich , als man Dinge
gruppieren und sie dann aussortieren kann Also, was wir tun werden, ist,
zum Tank
rüber zu gehen und wir werden zu Kamera drei D gehen
. Und jetzt hat Kamera drei D
diese Keulmaske hier Und im Grunde wird jede Ebene, die
markiert ist und
alle
standardmäßig aktiviert sind , von der Kamera angezeigt Nun, wir wollen nicht, dass diese Navigationsprobleme im Spiel
auftauchen, und die einzige Kamera,
die wir
verwenden werden, ist die Kamera auf dem Spieler oder im Grunde
die, die
an einem der Panzer befestigt Also gehen wir einfach
hier
zur NavPoints-Ebene und Und jetzt
werden unsere NavPoints nicht
von der Kamera des Spielers gerendert Nun, da
wir einen NavPoint haben, fügen
wir unserer Szene einige hinzu Wir werden sie hinzufügen und
sie auf
den Knoten der Pfadknoten ziehen den Knoten der Pfadknoten ,
sodass sie ihm als übergeordnetes Element
zugewiesen werden Und stellen wir sicher, dass
es gerade rauf und runter geht. Wir werden ein
bisschen rauszoomen. Und wir werden im Grunde diese Punkte setzen, und ich werde sie einfach
mit Control V oder Control D duplizieren, und dann platzieren wir
sie in verschiedenen wir platzieren genug davon,
damit Sie eine Vorstellung davon haben. Was wir tun werden, ist dass sich
unser Panzer
von Punkt zu Punkt bewegt. Er wird nach allen Punkten
suchen , die sich
innerhalb seines Bewegungsbereichs befinden. Es wählt
zufällig einen aus und
dreht sich dann, bis es auf diesen Punkt
zeigt, und dann
bewegt es sich auf diesen Punkt zu. Im Grunde
wollen wir hier nur Punkte oder einen Haufen, einen Haufen von NAB-Punkten
erstellen, um dem Panzer einen Ort
zu geben, an den er sich bewegen kann Wenn wir nun
die NavPoints so eingerichtet haben,
dass sich
zwischen ihnen entlang des Pfades ein Hindernis befindet, wird
der Panzer natürlich dass sich
zwischen ihnen entlang des Pfades ein Hindernis befindet, wird
der mit dem Hindernis
kollidieren Wir wollen sie also
weit genug voneinander entfernt platzieren, damit der Panzer sie finden kann , wenn er
nach neuen Punkten
sucht, zu denen er fahren kann,
aber nicht so, dass es tatsächlich möglich
wäre, sie zu erreichen Wenn sich der
Panzer zum Beispiel von diesem
Punkt bis zu diesem Punkt bewegt, wollen
wir sicherstellen,
dass die Linie zwischen ihnen diesen Felsen nicht einschließt. Also werden wir das ein
bisschen anpassen , und das werden wir tun. Okay. Und das ist genug für das ist
genug für die Arena. Wie Sie sehen können, können Sie die NavPoints hier
tatsächlich sehen Aber wenn wir
das Spiel starten würden, was ich tun werde, lassen Sie uns noch
einmal überprüfen, wo wir zum Spiel zurückkehren Okay? Also der
Panzer des Spielers ist genau hier. Wenn wir jetzt das Spiel starten würden
, siehst
du, dass keiner der
NavPoints im Viewport
des Spielers angezeigt wird, weil die Kamera sie
heraussucht, aber sie sind Okay, jetzt, wo das eingerichtet ist, werden
wir
unseren feindlichen Panzer so modifizieren , dass er den Spieler erkennen
und dann versuchen kann, auf ihn zu schießen Das Erste, was
wir tun müssen, ist
natürlich zum feindlichen Panzer
zu gehen. Aber was wir jetzt
tun wollen, ist einen sogenannten
Area-Three-D-Knoten
hinzuzufügen. Also gehen wir zum feindlichen Panzer. Wir fügen einen untergeordneten Knoten und fügen einen Bereich drei D hinzu. Und ein Bereich drei D erfordert eine Kollisionsform, genau wie unsere Kollisionsform wie unsere Kollisionsform
drei D. Tatsächlich sind sie
im Grunde dasselbe. Also fügen wir hier einen untergeordneten Knoten hinzu, bei dem es sich natürlich um
eine Kollisionsform handelt. Und uns interessieren nur Dinge innerhalb eines XY-Radius des Panzers. Also können wir einfach einen Zylinder machen. Das könnte nun auch
geschehen, indem
die Entfernung zwischen den globalen
Positionen der beiden Panzer überprüft wird. Aber es ist weniger Code, das auf diese Weise
zu tun, und außerdem gibt es
alles an die Physik-Engine weiter, was effizienter ist. Also die
Kollisionsform wird, ähm, nun ja, zunächst werden
wir sie ein bisschen
wiederverwenden. Es spielt keine
Rolle, wie hoch sie ist, aber nur um die
visuelle Konsistenz zu wahren, machen
wir sie ungefähr so
hoch wie der Tank. Und dann müssen wir
seinen Radius auf den Radius ändern seinen Radius auf den Radius , in dem der Panzer den Spieler sehen
kann. Also ziehen wir den Kerl
raus, bis es etwa, sagen
wir, 15 ist. Also, das ist völlig willkürlich Es ist nur ein Radius, in dem ich
entschieden habe , dass der Panzer den Spieler
erkennen kann Ihr könntet leicht zehn oder 20 draus
machen. Ich würde es nicht kleiner machen
als die Entfernung, die Panzergranate abfeuern wird , denn du kannst sie vergrößern,
du kannst sie vergrößern. Es ist völlig in Ordnung, wenn
der Panzer
den Spieler vor den
Spielern in Reichweite sehen kann . Aber weißt du, wir werden
sehen, wie das funktioniert. Also im Moment
belassen wir es bei 15 und wir werden
den Bereich drei D ändern und
ihn Zielgebiet nennen. Und es gibt einen Bug mit Godot dem ein Bereich drei D Dinge, die statisch sind, nicht erkennt es sei denn, sowohl die Überwachung als auch die
Überwachbarkeit sind aktiviert,
was ziemlich unausstehlich ist Weil normalerweise
nur die Überwachung
überprüft werden soll , um zu sehen, ob Deshalb deaktivieren wir für diesen Fall die
Option Überwachbar, aber wir werden etwas
Ähnliches für Bewegungen tun Und ich denke, ich werde diese Diskussion noch einmal aufgreifen wenn wir zur
Bewegung kommen Ich übertreffe mich
hier irgendwie selbst. Aber jetzt, wo wir
unser Zielgebiet haben, wollen wir zunächst die Zielbereichskollision der gegnerischen Panzer auf
gut
ändern, Zielbereichskollision der gegnerischen Panzer auf
gut
ändern, wir können sie entweder
für eine Sache ausschalten oder wir können ihre
Ebenen für eine Sache ausschalten. Es muss sich nicht wirklich
auf einer Ebene befinden, aber wir wollen nur, dass es
mit der Spielerebene kollidiert, was nicht nur reimt, sondern auch bedeutet, dass es den Bereich nur interessiert, wenn
der Spieler ihn betritt. Gehen wir jetzt also zu Knoten
und zu Bereich drei D, und natürlich wollen wir, dass der Körper
eingegeben und der Körper eingegeben und der Körper Also werden wir sie mit dem
feindlichen Panzer verbinden. Und aus irgendeinem Grund will
der Connect-Button nicht kooperieren. Nur um zu beweisen , dass das tatsächlich funktioniert, werden
wir zwei Dinge tun. Wir werden den Namen
des Körpers
drucken , wenn er das
Gebiet betritt, und dann drucken wir den Namen des Körpers, wenn er das Gebiet
verlässt. Und Sie denken
jetzt vielleicht, nun, wie kann ich mir all das vorstellen
, was passiert? Ich meine, woher wissen wir das
Ausmaß unserer Würfe und
unserer Kollisionsbereiche und so während wir unser Spiel debuggen Ich glaube, ich habe
dir das schon einmal gezeigt, aber wenn nicht,
zeige ich es dir noch einmal Wenn Sie auf Debug klicken und
wir sichtbare Kollisionsformen erstellen, können
wir die
Kollisionsformen all unserer Objekte sehen Wenn ich jetzt das Spiel starte, kannst du sehen, dass du alle
Kollisionsformen
sehen kannst , die wir festgelegt haben Und hier ist die
Zielreichweite für den feindlichen Panzer, und hier ist die Kollisionsform eines der Navigationsknoten. Wenn ich jetzt mit
meinem Panzer vorwärts fahre, bin ich in die Zielzone des feindlichen
Panzers gegangen, also steht dort Spielerpanzer, und wenn ich mich jetzt aus
der Zielzone zurückziehe, wird die andere Methode ausgelöst
und es wird auch Spielerpanzer angezeigt. Wir haben also ein kleines
Problem darin, dass der Körper nur im Rahmen dieser Methode
gültig
ist und daher gültig ist. Wir müssen
außerhalb dieser Methode auf
alles zugreifen können , worauf der Tank abzielt. Das bedeutet natürlich, dass
wir eine Variable benötigen, und wir werden sie Ziel nennen, und es wird vom Typ Charakterkörper
drei D sein , weil das der
Typ unseres Spielerpanzers ist. Ziel ist also gleich Körper. Und wenn der Körper den
Zielbereich
verlassen hat, ist Ziel gleich Null. Wenn
wir also zu irgendeinem Zeitpunkt außerhalb
des Panzer-Skripts auf einen Verweis
auf den Spieler zugreifen müssen, während er sich in der Zielzone befindet,
können wir diese Variable verwenden. Und tatsächlich werden wir es in unserer Zustandsmaschine
verwenden. Lassen Sie uns also in
unseren Feuerzustand übergehen. Als Erstes
werden
wir ihm einen Namen geben. Und solange ich darüber nachdenke, lass uns dasselbe für
den Jagdstaat tun. Und wir müssen
zu unserer Zustandsmaschine zurückkehren und
ihren Standardstatus von
diesem dummen Ruhezustand, den wir
erstellt haben, in den Jagdzustand ändern diesem dummen Ruhezustand, den wir
erstellt haben, in den Jagdzustand Und wenn wir einmal da sind, müssen
wir ein paar Dinge definieren Wenn Sie sich erinnern, hatten
wir eine Reihe von Hilfsmethoden
im Bundesstaat Das Erste ist also, dass wir unsere Methode „Sollte den Status
ändern“
benötigen Im Jagdzustand wollen
wir also den Jagdstatus verlassen wenn der Panzer einen Gegner
gefunden hat. Also was wir hier tun können, ist das Ergebnis
einer Goldbarrenprüfung
zurückzugeben Und das Erste, was
wir tun werden. Und das ist also tatsächlich gültig. Wenn Sie eine Methode überschreiben, wir sie
in
einer untergeordneten Klasse definieren,
obwohl
wir keinen Variablentyp für
einen Eingabeparameter können wir sie
in
einer untergeordneten Klasse definieren,
obwohl
wir keinen Variablentyp für
einen Eingabeparameter definiert haben. Und in diesem Fall wollen wir
das tun, um unsere automatische Vervollständigung zu unterstützen. Wir werden das überwachte
Objekt gezielt auf einen KI-Panzer
werfen. Jetzt geben wir das Ergebnis
zurück,
dass das Ziel des überwachten Objekts gleich Null ist. Wenn also das überwachte
Objektziel nicht Null ist, bedeutet das, dass
wir vom Jagdstatus in
den Feuerzustand wechseln sollten Jagdstatus in
den Feuerzustand , weil
wir ein Ziel gefunden haben. Umgekehrt wollen wir im Feuermodus genau das Gegenteil
tun. Wir sollten also
den Feuerzustand verlassen , wenn das
Ziel gleich Null ist Und dann müssen
wir in der Lage sein, für jeden unserer Staaten
anzugeben, welcher der nächste Status
ist. Was den Jagdstaat angeht, wird er also immer in
den Feuerzustand übergehen. Und für den Feuerzustand wird
es immer den Übergang in
den Jagdzustand geben. Und nur um uns
beim Debuggen zu helfen, geben
wir Echo weil wir bei beiden sowieso
den Status
ändern überschreiben werden beiden sowieso
den Status
ändern Also,
wenn wir es definieren, werden
wir
den Zustand wiedergeben, in dem wir uns befinden Also im Jagdstaat werden
wir nur Jagdstaat drucken. Und dann im Feuermodus,
hoppla , wir brauchen
die ganze Methode Im Feuerzustand
gehen wir in den Zustand Echo Firing über. Und jetzt können wir überprüfen
, ob beide funktionieren, wenn wir
wieder in unser Spiel zurückkehren. Wenn ich jetzt zum Panzer
manövriere, haben
wir ein Problem.
Was ist unser Problem Okay, ungültiger Zugang zum
Grundstück, Schlüssel, um die
Puppe abzufeuern. Okay. Habe ich die nicht richtig
eingerichtet?
Lass uns einen Blick darauf werfen. Ah, ich habe das Wort Staat nicht benutzt. Also, wie Sie sehen können, ist
der Fehler hier, dass ich das Wort
zurückgebe, nun, dieses Wort wurde von vornherein nicht
richtig buchstabiert, aber es sollte nur feuern
statt feuern sein. Also lass uns so gehen. Und dann ändern
wir den Jagdstatus auf Jagd.
Und das sollte funktionieren. Also, wie Sie sehen können, da
wir
unsere Zustandsmaschine bereits so eingerichtet haben , dass sie in den Standardstatus
übergeht, die Tatsache, dass wir
unseren Standardstatus auf bedeutet
die Tatsache, dass wir
unseren Standardstatus auf
den Jagdstatus gesetzt haben, dass
Godot,
sobald er eingerichtet und geändert ist, das Jagdwort hier wiederholt, um zu zeigen, dass wir standardmäßig da
drin sind Wenn ich jetzt gehe, ist
es wieder kaputt. Was habe ich dieses Mal gemacht?
Okay, es ist nicht an dem Ding. Warum sind diese
Jagdstaaten Hunt Aha als Nächstes
bestimmt. Oh, ich habe die falschen geändert. Pfui. Okay. Ermitteln Sie den nächsten Bundesstaat. Zustand des Feuers. Ermitteln Sie
den nächsten Status. Jagen. Ordnung. Noch einmal mit
Gefühl. Da haben wir's. Da ich in
die Zielzone gegangen bin, wurde sie in
den Feuermodus umgeschaltet. Wenn ich jetzt wieder ausziehe,
geht es zurück in den Jagdstaat, was genau das ist, was wir wollen. Okay, jetzt, wo wir unser Ziel
haben und zwischen
den Feuerzuständen und
den Jagdstaaten hin und her
wechseln können zwischen
den Feuerzuständen und
den Jagdstaaten hin und her
wechseln , was wollen wir als Nächstes tun? Nun, wie wir bereits gesehen haben, haben
wir eine Prozessmethode Und in unserer Zustandsmaschine im
Grunde genommen in ihrer
Prozessmethode, überprüfen
wir im
Grunde genommen in ihrer
Prozessmethode, ob wir den Status ändern
sollten, und wenn nicht, sollten wir den Zustand
verarbeiten, in dem
wir uns gerade befinden. Also müssen wir
die Prozessmethode
für jeden dieser Zustände überschreiben . Und da wir gerade
am Feuerzustand arbeiten, wird
das
der erste sein, den wir machen. Lassen Sie uns also zunächst sicherstellen, all diese
Signaturen so
geändert werden, dass sie das Objekt
spezifisch umformen, denn genau das wollen
wir tun. Und natürlich
werden wir irgendwann auch den
Prozess im
Jagdstaat außer Kraft setzen müssen. also im Feuermodus Wenn wir also im Feuermodus ein Ziel haben,
nämlich den Spieler, wollen
wir Turm des gegnerischen Panzers in Richtung des Spielers
drehen,
überprüfen, ob er
eine klare Sichtlinie hat, und dann auf den Spieler schießen Und um
das zu tun, müssen wir unserem feindlichen Panzer
ein paar zusätzliche Knoten
hinzufügen unserem feindlichen Panzer
ein paar zusätzliche Knoten
hinzufügen Der erste Knoten, den
wir
unserem Panzer hinzufügen werden , heißt Cast Three
D. Ein Cast ist im Grunde ein Pfeil, der
auf
eine Zielposition innerhalb
der Welt zeigt auf
eine Zielposition innerhalb , die
in lokalen Koordinaten festgelegt ist, was bedeutet, dass er denselben
Koordinatenraum wie der Panzer verwendet . Und wir werden
dieser einen Sichtlinie einen Spitznamen geben. Und wir müssen dafür sorgen, dass
der feindliche Panzer ihn modifizieren und von seinem eigenen Skript
aus darauf zugreifen kann. Also werden wir eine Variable
namens Sightline exportieren, was natürlich eine Neufassung
von drei
D ist natürlich eine Neufassung
von drei . Und dann
ziehen wir das hier her Ein Wurf ist also im Grunde eine Linie, und er wird sich von seinem Ausgangspunkt
bis zu dem Ziel,
das Sie ihm geben, zurückverfolgen ,
und er wird in der Lage sein, über das Erste zu berichten ,
auf das
er auf diesem Pfad trifft Also für unsere Sichtlinie, wenn wir eine Linie von
unserem feindlichen Panzer
zum Spielerpanzer verfolgen unserem feindlichen Panzer
zum Spielerpanzer und wir hier für eine Sekunde zum
Spiel zurückkehren. Wenn wir also eine Linie verfolgen, ist das unser
Sichtlinien-Raycast Wenn wir eine Linie
vom feindlichen
Panzer zum Spielerpanzer verfolgen , wenn nichts im Weg ist, wenn wir sagen: Hey, was ist der feindliche Panzer oder womit
kollidiert der Strahlwurf, kommen
wir zurück zu unserem Ziel Wenn zum Beispiel
ein Baum im Weg wäre, würde die Sichtlinie melden, würde die Sichtlinie melden dass
das Erste, was sie
trifft, der Baum ist, was bedeutet, dass wir keine
Sichtlinie zum Panzer unseres Spielers
haben Sichtlinie zum Panzer unseres Spielers Im Grunde wollen wir also
vergleichen, worauf der Strahl in der
Sichtlinie zeigt, und wenn es das Ziel ist,
dann wissen wir, dass wir
eine klare Sichtlinie haben .
Also, wie machen wir das? Als Erstes kehren wir zu unserem feindlichen Panzer zurück und
gehen zur Sichtlinie, und wir wollen, dass unser
Strahlwurf nicht
nur mit dem Spieler kollidiert,
sondern auch mit Hindernissen
und feindlichen Panzern,
und nicht mit dem Boden, nicht mit
Granaten oder Nav-Punkten Auf diese Weise kann es
erkennen, ob ein feindlicher Panzer oder ein
Baum im Weg befindet, oder es kann unseren
Spieler finden, wenn wir ihn finden Wir werden das
alles innerhalb
des Feuerzustands tun , weil der Feuerzustand
die Logik beinhaltet , die bestimmt, ob der Panzer auf seinen Gegner
schießen soll
oder nicht. Und der Grund, warum wir
das hier tun, ist, dass wir,
wenn der Panzer den Spieler aus den
Augen verliert ,
den Feuerzustand verlassen und in den Jagdzustand
zurückkehren wollen . Und diese Information
ist falsch. Gehen wir zurück zum feindlichen Panzer und wir finden die richtige Zeile, den richtigen Code. Ah, okay. Das ist es nicht. Das ist es. Okay. Also, was machen diese beiden
Codezeilen? Die erste nimmt unser überwachtes Objekt, bei
dem es sich natürlich unseren feindlichen Panzer
handelt, um
unseren feindlichen Panzer
handelt, also die Entität, an die unsere
Zustandsmaschine angeschlossen ist, um
unseren feindlichen Panzer
handelt, also die Entität, an die unsere
Zustandsmaschine angeschlossen ist,
und aktualisiert seine Sichtlinie, die abgeworfene Sichtlinie, seine Zielpositions-Eigenschaft, die hier diese Variable ist, und setzt sie gleich der Position
des Ziels, in dem das überwachte Objekt
befindet zeigt derzeit auf. Wie ihr euch erinnert,
haben wir vor
ein paar Minuten das Ziel so gesetzt, dass es dem Spielerpanzer
entspricht ,
falls er in den
Let's go back here geht. Es hat den Zielwert so festgelegt, dass er
dem Panzer des Spielers entspricht , wenn er das Zielgebiet
betritt. Und wir müssen uns keine Gedanken
darüber machen, nach Nullwerten oder
so zu suchen , weil
der Panzer
erst im Feuerzustand ist,
wenn er ein Ziel hat. Und wir brauchen diese Methode lokal
, weil die
Zielposition des überwachten Objekts lokal in seinem eigenen Raum
ist. Also müssen wir sie in
den Koordinatenraum
des überwachten Objekts umrechnen . Andernfalls
wäre es im globalen Raum und die Werte wären falsch. Dann rufen wir die
Force-Cast-Aktualisierungsmethode auf der Sichtlinie auf,
um Godot anzuweisen , die Besetzung sofort zu aktualisieren denn wenn nicht, würde
Godot die
Besetzung beim nächsten Bild aktualisieren, sodass wir um ein Bild daneben wären Wir wollen, dass es
sofort passiert
, damit wir nach dem Richtigen
suchen Wenn ich das Spiel jetzt starte, da wir immer noch unsere
Kollisionsvariablen oder unsere
Kollisionsformen festgelegt haben, bekommen
wir hier eigentlich nichts. Es gibt eine Möglichkeit, diese Dinge
einzuschalten. Lass mich sehen, ob ich es einstellen kann. Okay, ich habe herausgefunden,
was schief gelaufen ist. Die Sichtlinie
war ursprünglich auf den Boden des Panzers gerichtet
, weil sie dort auf
Null fällt . Ich habe ursprünglich
bei einem negativen Y angefangen, das war hier unten, also mussten wir ihn
tatsächlich nach oben bewegen,
sodass man ihn tatsächlich
sehen konnte, wenn er auf das gegnerische Ziel
zeigte. Also gehen wir jetzt zu Nat
und lassen unser Spiel laufen. Jetzt könnt ihr sehen, wie
der gegnerische Panzer
direkt auf unseren Panzer geworfen wurde. Und als Nächstes müssen wir überprüfen, ob
es sich bei dem Objekt, dem die Besetzung mit dem die Besetzung
kollidiert, um
das Ziel handelt oder nicht Wir tun das, indem wir sagen, ich habe Objekt und Sichtlinie überwacht und die Methode
heißt Get Wenn wir also Get Collider
auf der Sichtlinie aufrufen, müssen wir sehen, ob es dem Ziel des überwachten Objekts
entspricht,
das natürlich unser Spielerpanzer ist Und bevor
wir das überhaupt
tun, können wir einfach
so vorgehen und dann kommentieren
wir das Wir drucken einfach aus, womit
es kollidiert. Und so werden wir es nicht machen.
Wir werden es überwacht machen. Wir werden es richtig buchstabieren, Objekt. Siteline Punkt Holen Sie sich den
Collider. Name des Punktes Jetzt fahren wir hierher,
du kannst sehen, dass es
mit dem Spielerpanzer kollidiert Aber wenn ich hier
hinter diesen Hügel gehe, kollidiert
der Strahlwurf jetzt mit dem Weil der Strahlwurf den
Grenzrahmen
des Hügels durchquert , bevor er uns trifft Das bedeutet, dass der feindliche Panzer keine
Sichtverbindung zum Spieler Also lass uns das loswerden,
also gehen wir wieder hierher zurück. Wenn also der gegnerische Panzer eine
Sichtlinie zum Spieler
hat, wollen
wir den Turm drehen,
bis er dem Spieler zugewandt ist Und um das zu tun, benötigen wir tatsächlich einen zweiten Strahlwurf. Lassen Sie uns das klären, lassen Sie uns das wieder
kommentieren. Also, wo werden wir
diesen Strahlguss hinstellen? Dieser Strahlwurf
wird tatsächlich auf den Turm gerichtet sein, und er wird in die gleiche Richtung zeigen
wie das Fass, weil wir
sehen wollen , worauf der
Turm zeigt Fügen Sie hier also einen weiteren untergeordneten Knoten hinzu, und das wird wieder
ein Raycast sein Und diese wird die Ziellinie
sein, und sie wird nur mit dem Spieler
kollidieren, und sie wird so lang sein
wie unser Zielbereich
oder Zielbereich Wie groß war also unser
Zielgebiet? Unser Zielgebiet ist
ein Radius von 15 Metern. Das bedeutet, dass die
Ziellinie 15 sein muss. Aber da der Panzer
selbst gedreht ist, bedeutet
das, dass wir auch
die Ziellinie drehen müssen. Wie ihr sehen könnt, haben wir jetzt eine Linie, die sich
von unserem Turm
bis zum
Zielradius erstreckt . Und das werden wir
leicht ändern, weil wir nicht wollen
, dass leicht ändern, weil wir nicht wollen es so ist, wie es ist, bevor wir gehen Okay. Wenn wir jetzt
zu unserem Drehbuch zurückkehren und das wieder auskommentieren
können, benötigen
wir natürlich
einen Verweis auf unsere
Targeting-Neufassung Feindlicher Panzer,
Ziellinie, Ziellinie.
22. Hinzufügen einer Staatsmaschine zum gegnerischen Panzer über ECS Pt. 2. : Mmm, das erste, was wir tun müssen, ist, ein paar Bewegungsvariablen zu erzwingen Im Änderungsstatus
für unseren Feuerzustand, der aufgerufen wird
, wenn wir in den Feuerzustand
übergehen, wollen
wir, dass der Panzer sich nicht mehr bewegt und dass er sich
dreht und was auch immer er
sonst noch tut Also setzen wir die Umdrehungsgeschwindigkeit und die
Vorwärtsgeschwindigkeit auf Null. Das heißt, sobald
der Panzer ein Ziel entdeckt, stoppt
er alles
und sucht
dann sofort nach seinem Ziel. Und das Gleiche werden wir
für den Jagdstaat tun. Und was ist dieses brachliegende Grundstück? Dies ist eine Variable, die wir unserem feindlichen Panzer hinzufügen
müssen. Und es ist ein boolescher Wert. Und es zeigt an,
ob sich der Panzer gerade von einem
Navigationspunkt zum anderen bewegt von einem
Navigationspunkt zum Wenn der Tank inaktiv ist,
wollen wir im Grunde , dass er
einen anderen Navigationspunkt findet und sich darauf zubewegt, weil wir niemals wollen, dass die Panzer völlig ungenutzt stehen. Obwohl, ich meine, vielleicht tust du es. Wenn ihr euch nach
Abschluss dieser Lektion abenteuerlustig
fühlt, könnt ihr die
Panzer
vielleicht so modifizieren, dass sie regelmäßig anhalten und, ihr
wisst schon, vielleicht einfach umschauen Aber vorerst werden sie sich
immer bewegen und patrouillieren und
nach dem Spieler suchen In unserem Jagdzustand werden
wir also wieder, wenn wir uns im Status ändern befinden, den Panzer in den Leerlauf zwingen,
was bedeutet, dass
er bei seinem
ersten Verarbeitungsdurchgang eine neue
Position findet, um sich auf ihn zuzubewegen Und wir werden eine
Liste dieser Positionen benötigen, und ich überhole
mich selbst. Gehen wir also zurück
zur Panzerszene selbst, und wir werden einen anderen Bereich
benötigen. Und dieser wird unser Bewegungsbereich
sein. Und das ist der Bereich, der sowohl überwachbar als auch
überwachbar sein muss
, denn wenn
wir die Option überwachbar deaktivieren,
was
selbst für einen
englischen Muttersprachler sehr
schwierig zu sagen ist, werden
unsere statischen
Navigationspunkte aus irgendeinem Grund nicht erkannt,
was wenig
Sinn macht, denn überwachbar bedeutet,
dass dieser Bereich von anderen überwachbar sein muss
, denn wenn
wir die Option überwachbar deaktivieren, was
selbst für einen
englischen Muttersprachler sehr
schwierig zu sagen ist, selbst für einen
englischen Muttersprachler werden
unsere statischen
Navigationspunkte aus irgendeinem Grund nicht erkannt ,
was wenig
Sinn macht, denn überwachbar bedeutet,
dass dieser Bereich von denn überwachbar bedeutet dass dieser Bereich aber wir wollen nicht, dass er von anderen Kollisionsformen erkannt werden kann. Also logischerweise
würden wir das ausschalten. Aber es gibt einen Bug und
Gadot. Wenn wir das ausschalten, statische
Objekte nicht erkannt. Also lassen wir es Und bei der Kollision wollen
wir den Layer ausschalten
und wir wollen, dass er
Navigationspunkte erkennt. Also werden wir das ändern und eine
Kollisionsform hinzufügen. Diese Form ist natürlich
ein Zylinder. Und wir bewegen den Zylinder ein wenig nach
oben und
ändern natürlich seinen Durchmesser. Wir
brauchen keinen Tight, ändern natürlich seinen Durchmesser. Wir
brauchen keinen um
so hoch zu sein, wie er ist, und wir ändern
seinen Radius auf 20. Ally, lass uns 25 draus machen. Und das ist irgendwie willkürlich. Im Grunde ist dies
der Radius, in dem nach
Navigationspunkten gesucht
wird,
und wir möchten, dass er größer ist in dem nach
Navigationspunkten gesucht
wird, als der Zielbereich, nur weil wir die Karte nicht mit Punkten füllen
müssen . Wir
wollen, dass sie relativ weit voneinander
entfernt Dies ist jedoch vollständig
einstellbar. Was wir jetzt brauchen, ist dieser Bewegungsbereich dass
dieser Bewegungsbereich Funktionen
am feindlichen Panzer auslösen kann. Also werden wir
wieder eine Verbindung herstellen, der Körper ist eingedrungen. Und der Körper hat Methoden verlassen
, sodass er einige
Funktionen für uns aktiviert, und ich weiß nicht, warum er die Verbindung
immer wieder unterbricht, aber da ist er. Bum. Und jetzt können wir wieder
hierher gehen und
ein Array definieren , das als Nav-Punkte
in der Nähe bezeichnet wird. Und es wird ein
Array von Knoten drei D sein, obwohl wir es nicht
wirklich feinkörnig
bestimmen oder deklarieren müssen es nicht
wirklich feinkörnig
bestimmen oder deklarieren Wir können einfach sagen, und es ist
ein Array, oder wir können es komplett entfernen und es einfach
so aussehen lassen Aber im
Allgemeinen möchten Sie die Typen Ihrer
Variablen
definieren, wenn Sie können. Wenn sich der Panzer also so
nahe an einem
Navigationspunkt befindet nahe an einem
Navigationspunkt , dass er sich innerhalb
des Bewegungsbereichs befindet, löst
er
diese Funktion aus. Und wenn das
passiert, wollen wir den Körper an unsere
nahegelegenen NAV-Punkte
anhängen Und wenn es diesen
Bereich überschreitet, wollen wir es löschen. Vom nahegelegenen Nav-Punkt. Diese Variable wird also
immer eine Liste der
richtigen Knoten enthalten. Nun gibt es auch eine
Methode namens get
overlapping nodes, die wir auch verwenden
könnten, aber das ist für
Lehrzwecke etwas
übersichtlicher für
Lehrzwecke etwas
übersichtlicher Jetzt, wo wir das haben, können
wir in unseren
Jagdstaat gehen Und im Grunde wollen wir wenn das überwachte
Objekt inaktiv ist, einige
Dinge tun, aber bevor wir das tun, muss
unser feindlicher Panzer in der Lage sein, seinen nächsten
Navigationspunkt zu verfolgen In beiden Fällen auch als
Ziel-Nav-Punkt bekannt. Und tatsächlich
sind die NAPoints statische Form von drei Ds. Aber auch hier müssen Sie bei der Definition nicht so feinkörnig sein Aber hier, das hier, solltest
du wahrscheinlich tun. Ordnung. Lass mich
zurück nach Hunting State Also, wenn das überwachte
Objekt inaktiv ist, dann wollen wir
ihm einen NavPoint in der Nähe geben Der nächstgelegene NavPoint
entspricht also dem überwachten Objekt Holen Sie sich zufällige Ausgangspunkte. Und wir haben
diese Methode noch nicht definiert. Also lass uns das tun. Zumindest in einem Stummel. Wir werden
all diese Methoden heraussuchen und dann schauen, wie wir sie tatsächlich implementieren
können Äh, hm. Viel besser In Ordnung, zurück zu Hunting State. Und sobald wir einen
Navigationspunkt eingerichtet haben, wollen wir eigentlich sagen,
dass er nicht mehr ungenutzt ist Idle ist jetzt also gleich False. Und im nächsten Bild werden
wir überprüfen, ob das überwachte Objekt oder. Hat sein Ziel erreicht. Nun, wir werden nachsehen , ob es sein Ziel nicht
erreicht hat. Wenn nicht,
werden wir ein paar Sachen machen, und ich werde die
Sachen gleich reinlegen. Aber wenn ja, dann wollen wir es wieder auf Leerlauf
setzen
, damit ich einen neuen
Navigationspunkt wählen kann Okay, also wenn es sein Ziel nicht
erreicht hat, dann wollen wir sehen, ob es gerade vor
seinem Ziel steht Und wenn es
seinem Ziel nicht zugewandt ist, dann wollen wir es rotieren lassen,
bis es irgendwann soweit sein wird. Also
wird es bei jedem Bild überprüfen, ob es
auf
sein Ziel gerichtet ist,
und wenn nicht, dann haben wir gesagt, es ist Objekt mit
Drehgeschwindigkeit. Und wir haben
hier das gleiche Problem wie mit dem Turm, also
stellen wir die Wendegeschwindigkeit einfach auf eins ein, sodass er
sich immer positiv dreht Und wenn es sich
seinem Ziel nähert, dann wollen wir, dass es sich seinem Ziel
nähert Also überwachtes Objekt
Stellen Sie die Bewegungsgeschwindigkeit eins so ein, dass es sich
vorwärts in Richtung seines
Ziels bewegt . Okay. Also, sobald wir diese Methoden
implementiert haben, werden
wir einen fahrenden Panzer haben. Und natürlich
müssen wir auch sicherstellen, dass wir die entsprechend ausschalten Bewegungsgeschwindigkeit und
die Rotationsgeschwindigkeit
entsprechend ausschalten. Wenn es also sein Ziel nicht erreicht hat und
seinem Ziel
nicht zugewandt ist, müssen wir
seine Wendegeschwindigkeit einstellen, aber wenn es
seinem Ziel zugewandt ist, wollen wir, dass es aufhört zu rotieren
und seine Bewegungsgeschwindigkeit einstellen. Und wenn es dann sein Ziel erreicht
hat, setzen
wir seine
Bewegungsgeschwindigkeit natürlich auf Null. Oh, lassen Sie uns nun diese Methoden
implementieren. Wir haben also unser Ziel
erreicht. Rich
gibt natürlich einen Goldbarren zurück. Und vorerst
kann es falsch zurückgeben. Dann haben wir Is
Facing Destination. Und waren es nur die beiden? Hat sein Gesicht erreicht und bekommt dann einen zufälligen Nav-Punkt. Nun, das haben wir schon gemacht, das haben wir
schon gemacht. Und ich denke, ich sollte die
Namenskonventionen konsistent
halten. Told, ich finde das furchtbar. Gut , also wie bekommen wir einen zufälligen
Navigationspunkt Bum. Also was wir
tun, ist was ist das? Es ist wahrscheinlich das falsche
. Navi Points in der Nähe. Ordnung. Ah. Der Name ist
etwas anders Nav-Points in der Nähe. Richtig? Was übersehe ich? Los geht's. Okay, jetzt stimmt alles
mit meinen Notizen überein. Bei dieser Methode deklarieren wir also deklarieren wir einen NavPoint und setzen
ihn auf Null,
und wir überprüfen, ob unser nahegelegenes NavPoints-Array,
das wir hier verwalten, ob die Größe
größer als Null ist Wenn ja, bedeutet das, dass
wir NavPoints in der Nähe haben. Und es sollte immer NavPoints in der Nähe
geben. Wenn nicht, dann haben wir etwas falsch
gemacht. Aber es ist nur der Plausibilitätstest. Wir durchlaufen also die
NAV-Punkte, wir machen eine Schleife, und im Grunde
überprüfen wir, ob der NavPoint, wir ausgewählt haben, dem nächstgelegenen NAV-Punkt entspricht
,
oder wenn er Null ist , bedeutet das, dass
wir einen neuen brauchen, weil wir nicht
versuchen wollen, zu demselben
NavPoint zu gehen, an dem wir gerade waren Im Grunde wird es
so lange
versuchen,
einen neuen Navigationspunkt nach dem
Zufallsprinzip auszuwählen , bis es einen erhält , der
nicht der ist, von
dem wir
gerade gekommen sind, oder sozusagen beim
ersten Mal beim ersten Mal durch die Schleife , denn wenn die
Funktion zum ersten Mal aufgerufen wird, wird
der Navigationspunkt gleich Null sein. Also zumindest wird
dieser ausgelöst. Also setzen wir den
Navigationspunkt auf einen Wert aus den nahegelegenen
NavPoints, was
natürlich ein Array ist , und
verwenden die Randy-Range-Funktion Randy Range verwendet also zwei Werte, den unteren Bereich und den oberen
Bereich, der Also müssen wir es tatsächlich um einen negativen Wert
reduzieren. Wir wollen also bei Null beginnen, was der niedrigste
Index unseres Arrays ist, und der höchste Index
des Arrays entspricht natürlich der Größe
der Array-Größe
des Arrays minus eins. Äh, also im Grunde
wollen wir eine Zufallszahl zwischen Null und dem letzten
Element des Arrays. Sobald wir unserem NavPoint ein zufälliges
Array-Element zugewiesen haben, überprüfen wir im Grunde
wieder, ob es der NavPoint
ist, den wir bereits haben
, oder ob er überhaupt existiert? Sobald wir diesen Wert haben, geben
wir ihn zurück und dann haben wir einen zufälligen
Navigationspunkt Es ist sehr einfach zu überprüfen,
ob wir unseren
Navigationspunkt erreicht haben, denn wir
müssen lediglich
die globale Position des Navigationspunkts überprüfen die globale Position des , auf
den
wir zusteuern, wenn die Entfernung zwischen
der globalen Position
unseres Panzers und der
globalen Position
des Navigationspunkts weniger als 1,1
beträgt. Und 1.1 ist ein beliebiger Wert. Ich habe ihn berechnet, indem ich
die globale Position
des Panzers in jedem Frame überwacht die globale Position
des habe,
während er aktualisiert Die Mindestanzahl von
Einheiten, die der Panzer mit der von uns
festgelegten
Geschwindigkeit bewegt wird. Die Mindestanzahl von
Einheiten, die der Panzer mit der von uns
festgelegten
Geschwindigkeit bewegt, ist
etwas mehr als eins. Es ist etwa 1,08 oder
so ähnlich. Also 1,1, wenn es weniger als 1,1 ist, dann deckt das diesen Bereich Prüfen Sie also, ob wir
die Methode Distance Two verwenden ,
was natürlich
eine Methode ist, die
innerhalb eines Vektors definiert ist, und natürlich ist die globale
Position eines Knotens ein Vektor. Also überprüfen wir die Entfernung
zwischen unserer globalen Position und dem
Navigationspunktziel, zu dem wir fahren. Und wenn wir nahe genug dran sind , dass wir weniger als einen
Frame bewegt haben, dann haben wir
unser Ziel erreicht. Und schließlich der
komplexeste von allen. Steht vor dem Ziel. Was wir hier also tun müssen, ist
den Vektor
dazwischen zu finden , der den Winkel
darstellt , dem wir zuschauen wollen. Lassen Sie mich also zum Spiel zurückkehren, und wir werden das hier einstellen. Nun müssen
wir
den Vektor finden, der diese Linie
repräsentiert, die Linie, die vom
Panzer zum feindlichen Panzer führt, vom Spielerpanzer
zum feindlichen Panzer. Und der Weg, diesen
Vektor zu erhalten, besteht darin,
die Position des Panzers von der Position des feindlichen Panzers
zu subtrahieren , und das ergibt
uns diesen Und wir wollen, dass es
von hier nach hier zeigt. Also subtrahieren wir das oder wir
subtrahieren das davon. Und das ist Ups. Und das haben wir hier.
Also der nächste NAV-Punkt. Also gut, ich muss mich ein wenig
korrigieren. Also ist es nicht der Spieler. Es ist der
Navigationspunkt, zu dem wir gehen. Nehmen wir an, der feindliche Panzer würde von hier nach hier fliegen. Wir müssen den Vektor ermitteln
, der diesen Pfad darstellt. Das bekommen Sie also,
indem Sie den Ursprung, der natürlich der Tank ist
, vom Ziel,
dem
NAV-Punkt,
subtrahieren natürlich der Tank ist
, vom Ziel,
dem NAV-Punkt, Also die NAV-Punkte, die
globale Position abzüglich der globalen Position des Panzers, und wir normalisieren Und das zu normalisieren
bedeutet, dass wir
die Länge des Vektors
so verkürzen , dass die Länge eins ist, was bedeutet, dass
er viel kürzer sein
wird , weil uns wirklich nur der Winkel
interessiert Und sobald wir diesen
normalisierten Vektor haben, berechnen
wir den
Winkel mit der Methode Winkel zwei für die
Transformationspunktbasis Z. Und wir haben uns die Transformation
schon einmal angesehen , als wir unseren Panzer
bewegt haben Die Z-Komponente der Transformation stellt die
Vorderseite des Tanks Wenn wir also
den Winkel von hier
bis zur Ausrichtung des Tanks berechnen , erhalten
wir den Winkel
zwischen diesen beiden Vektoren. Und wenn wir uns
dem Navigationspunkt zubewegen
, wird dieser Wert immer
kleiner und kleiner. Und wenn der Winkel
zwischen den beiden Vektoren letztendlich weniger als ein Grad
beträgt, kann
man mit ziemlicher Sicherheit sagen, dass wir auf
das Ziel zeigen. Wir nehmen also den
Winkel zwischen diesen beiden,
zwischen der Z-Komponente
unserer Basis und dem gegenüberliegenden
Vektor, den wir gerade erhalten haben. Und der Einfachheit halber verwende
ich
die
Methode Grad im Bogenmaß, weil ich
gerne in Grad denke und nicht
weiß, was das
Äquivalent im Bogenmaß Also sagen wir Grad zu
Radiant ein Grad, und das berechnet
die richtige Anzahl von
Radiant, weil der Winkel zwei Radiant zurückgibt Radiant, weil der Winkel zwei Radiant zurückgibt Also überprüfen
wir erneut, ob der Winkel zwischen diesen beiden Objekten weniger als ein
Grad beträgt, und wenn ja,
dann ist es seinem Ziel zugewandt Also das alles sollte
einfach perfekt funktionieren. Lass uns unser Spiel starten. Und wir irren uns. Rotate Turret ist also wahrscheinlich der falsche Name
der Funktion. Kein feindlicher Panzer Äh, ja, es ist der Rotate
Underscore-Turm. In Ordnung. Hoffentlich ist das
der einzige, den ich auf diese Weise kaputt gemacht habe. Da haben wir's. Jetzt dreht sich der Panzer hoffentlich in Richtung eines
der Navigationspunkte,
und los geht's. Und jetzt natürlich, ja. Also habe ich nicht, ich habe diese
Funktionsnamen nicht wieder richtig
gesetzt Also, was haben wir? Wir
haben die Vorwärtsgeschwindigkeit und die
Drehzahl auf Null eingestellt. Also, ja, es heißt
Drehturm auf Null drehen. Und stellen Sie die Bewegungsgeschwindigkeit ein. Was
dort tatsächlich passiert , ist das, weil,
wie Sie sehen können, hier die Kollision,
die Kollisionssphäre des Navigationspunkts. Der Panzer
dreht sich also, bis er ihn trifft, und dann fährt er
direkt darauf zu. Aber jetzt bin ich nah genug
, dass der Panzer mich gesehen hat, also wird er aufhören, sich zu bewegen, und jetzt wird er versuchen, sich
zu drehen,
wie wir es zuvor gesehen haben, und
dann auf mich schießen. Mal sehen, ob das
tatsächlich funktioniert. Und es funktioniert
wahrscheinlich nicht, weil ich außerhalb der Reichweite bin. Das erfordert aber wahrscheinlich nur ein bisschen mehr Feinabstimmung
der Werte Aber ja, also werde ich
diese Lektion hier lassen , weil
sie schon viel zu lang ist Wenn Sie
das Projekt für dieses Kapitel verfolgen , könnte
es eine gute Herausforderung
für Sie sein , zu versuchen, diese Fehler
zu beheben. Wenn du kannst, dann wirst du die Konzepte, die ich dir beibringe,
definitiv gemeistert haben Konzepte, die ich dir beibringe,
definitiv gemeistert , weil du in der
Lage bist, Fehler zu beheben. Aber wahrscheinlich
werden die Radien der
Area Three Ds und der Güsse buchstäblich angepasst Nun, das war eine große Sache.
Nehmen Sie an der nächsten Lektion und wir werden
mit weiteren coolen Sachen weitermachen.
23. SFX: 3D-Audio: Willkommen zurück. Wir werden uns
das positionelle Audio ansehen Aber bevor wir das tun, müssen
wir einige geringfügige Anpassungen
an unserem Panzer und unserer Zustandsmaschine , damit
das Audio tatsächlich richtig funktioniert Als Erstes
müssen wir also zu
unserem ursprünglichen Tank Dot GD-Skript zurückkehren unserem ursprünglichen Tank Dot GD-Skript und eine
Variable namens destroyed hinzufügen. Und das wird ein Bool sein. Und wenn Sie sich erinnern, wenn wir unsere feindlichen Panzer zerstören
oder wenn wir oder
wenn sie uns zerstören, geben wir einfach
den Knoten frei und löschen den
Panzer aus der Existenz Und das ist schlecht für den Ton denn wenn Sie versuchen
, zum Beispiel
eine Explosion abzuspielen, weil
sie zerstört wurde, die Tatsache, dass der Knoten
sofort angezeigt wird bedeutet
die Tatsache, dass der Knoten
sofort angezeigt wird
, dass Sie diesen Soundeffekt nicht hören
werden Anstatt den Panzer zu löschen,
setzen wir einfach seinen
Zerstörungswert auf „Wahr“ um und ignorieren dann alle weiteren Eingaben des Spielers ignorieren dann alle weiteren Eingaben Und was den Feind angeht, werden
wir ihn
in einen zerstörten Zustand versetzen
, den wir erstellen werden, bevor wir all die
positionellen Audiodaten machen. Fügen wir
hier also ganz unten
eine Funktion hinzu und nennen sie Hit Und im Moment wird Hit
nur ein Pass sein. Und
wenn es dann in der Shell auf ein Shell-Objekt trifft, statt es freizugeben, rufen
wir seine Trefferfunktion auf Und jetzt, im Hit,
setzen wir Destroyed einfach auf True um Und in unserem Spiel können wir hier ganz nach oben
gehen
und im Grunde sagen:
Ich habe einen Spieler zerstört, kehrt zurück. Das bedeutet, dass keiner
der
Tastatureingaben verarbeitet wird, wenn
der Spieler tot ist, was wirklich
für alle ein Nachteil ist. Und für den feindlichen
Panzer werden
wir, wie gesagt, einen neuen
Zustand benötigen, denn im Grunde wollen wir, dass der Panzer,
wenn er
zerstört wird, einen Zustand
übergeht, in dem er nicht mehr verarbeitet
werden kann. Also werden wir ein neues Skript erstellen. Es wird
von einem Staat erben, und
wir werden es Dead State nennen,
aber es ist technisch gesehen zerstört Öffne den Kerl und
gib ihm einen Klassennamen. Und natürlich geben wir ihm den Status, in dem er sich geändert hat, und auf diese Weise kann er über seinen aktuellen Status berichten Und dann müssen
wir natürlich in
der feindlichen Staatsmaschine der Maschine einen neuen
Zustand hinzufügen. Zeichenfolge zerstört. Der Wert ist natürlich ein Objekt, und dann ziehen wir unseren toten
Zustand hierher. Fügen Sie ein Schlüssel-Wert-Paar hinzu,
und jetzt sind wir fertig. Jetzt müssen wir unsere
bestehenden Staaten so ändern, dass sie in
diesen Zustand übergehen , falls die zerstörte
Flagge umgedreht wurde Und glücklicherweise
ist der Code für beide derselbe. Also gehen wir in den Feuerzustand und zwar in Bearbeitung, nein,
nicht in Bearbeitung. Ich habe den nächsten Status festgelegt, nein, äh, ich sollte den Status ändern ,
wir kehren zurück, wir
brauchen keinen zusätzlichen. Wir geben zurück, entweder
das überwachte Objekt ist gleich Null oder
das überwachte Objekt ist zerstört In beiden Fällen wollen wir
dann den Status ändern, und das müssen wir auch in
unserem Jagdstaat tun Im nächsten ermittelten
Zustand überprüfen
wir für beide, ob das überwachte
Objekt zerstört wurde, gehen
dann zum Zerstörten über. Andernfalls gehen wir zum Schießen über, zumindest im Fall
des Jagdstaates. Und dann wird
es im Feuerzustand entweder
zerstört oder gejagt. Und was macht der tote Staat? Nun, es macht absolut
nichts. Zu diesem Zeitpunkt. Nun, es
macht tatsächlich noch eine Sache. sich das
Objekt in diesem Zustand befindet, werden wir bedingungslos jegliche Rotation
und jede Bewegung
unterbrechen Sobald sich das
Objekt in diesem Zustand befindet, werden wir bedingungslos jegliche Rotation
und jede Bewegung
unterbrechen. Auf
diese Weise wird es wirklich aufgehört
haben, sich zu bewegen, und es wird tot sein Ordnung, also haben wir den Turm
drehen, wir haben die Bewegungsgeschwindigkeit eingestellt
und wir brauchen den rotierenden und wir Nun, ich habe sie beide schon. Okay. Drehen, drehen,
Geschwindigkeit bewegen. Es gibt noch einen. Wir brauchen Drehgeschwindigkeit. Das ist der eine. In Ordnung. Sobald alle drei
Werte auf Null gesetzt wurden, bewegt sich
der Panzer nicht mehr und es gibt keinen
Ausweg aus diesem Zustand Sobald der Panzer
tot ist, ist er tot, was für alle,
vor allem für die
Menschen im Tank, ein Problem darstellt. Okay, jetzt, wo das erledigt ist, können
wir
unsere Soundeffekte hinzufügen Aber lassen Sie uns einfach
sicherstellen, dass das funktioniert, bevor wir etwas anderes tun Also gehen wir rüber,
wir schießen auf den feindlichen Panzer und bumm, er wurde zerstört. Und wie Sie sehen können,
drehte es sich
und jetzt dreht es sich
nicht mehr. Es
macht nichts anderes mehr. Perfekt. Okay, lassen Sie uns ein paar Soundeffekte
hinzufügen Also kehren wir zu
unserem ursprünglichen Panzer zurück. Nun, eigentlich nein, wir werden auf einem etwas
höheren Level
beginnen. Nun, es gibt zwei Arten
von Sounds in Gadot. Es gibt
Positionsgeräusche und es gibt etwas, das man Umgebungsgeräusche
nennen könnte Umgebungsgeräusche, die du
von überall im Spiel hören kannst, werden normalerweise für
Dinge wie Hintergrundmusik verwendet In unserem Fall werden wir unserer Arena etwas
Umgebungsgeräusche
hinzufügen. Also fügen wir einen untergeordneten Knoten hinzu und verwenden den
Audio-Stream-Player-Knoten. Nun, der
Audio-Stream-Player, der
weder zwei D noch
drei D hat, ist
ein einfacher Soundplayer,
der den Sound immer mit weder zwei D noch
drei D hat, ist ein einfacher Soundplayer, der gleichen Lautstärke wiedergibt ,
egal wo Sie sich befinden. Also benennen wir ihn um und
nennen ihn Ambient. Und ich habe
Ihnen für dieses Projekt bereits
drei Soundeffekte zur Verfügung gestellt . Wenn Sie also das
Projekt für Lektion acht herunterladen, sollten
Sie diese
Sounds bereits importiert haben. Wenn Sie sie
erneut importieren oder Ihre eigenen Sounds
importieren möchten, um den Import
in ein GodObject zu üben Sie können einfach Ihre
eigenen Audiodateien abrufen, sofern sie entweder im
Wave-Og- oder MP3-Format vorliegen, und sie einfach in
Ihren Projektordner ziehen, und sie sollten sofort
importiert werden Also gehen wir zur Amazon
Jungle Night-Audiodatei und ziehen sie in den Stream. Und jetzt sind wir bereit, dorthin zu gehen, und wir wollen das Autoplay
überprüfen, was bedeutet, dass es startet, sobald der
Knoten den Baum betritt,
was bedeutet, dass es sofort funktioniert. Jetzt haben wir ein Problem, und das ist, dass wir in der Lage sein wollen, die verschiedenen Audiopegel
der verschiedenen
Soundtypen zu ändern der verschiedenen So wollen wir zum Beispiel
nicht, dass unsere
Dschungelgeräusche lauter sind als unsere Schüsse und unsere
Explosionen Und das erreichen wir mit dem
Audiobus. Und es gibt
mehrere Audiobusse. Nun, ich meine, wir setzen
einen standardmäßig auf Master,
was bedeutet, dass alle Audioleitungen über den Master-Bus laufen. Wenn wir zum Beispiel einen neuen
Bus hinzufügen und ihn Ambient nennen und dann zu unserem
Ambient Audio Stream Player zurückkehren. Wir können den
Bus auf Ambient umstellen. Und wenn wir hier
die Lautstärke verringern, wird
die Umgebung leiser, obwohl wir den Ton
oder die Lautstärke
unseres gesamten Spiels nicht
verringert haben oder die Lautstärke
unseres gesamten Spiels Also werden wir
einen weiteren Audiobus hinzufügen, und dieser wird für Soundeffekte vorgesehen
sein Und dieser
wird die normale Lautstärke haben. Wenn wir jetzt unser Spiel laden, klingt es wie
ein nebliger Dschungel in
der Nacht, in dem fast
keine Bäume Und lassen Sie uns
diese Kollisionsformen ausschalten. Wir brauchen sie
vorerst nicht. Okay, jetzt müssen sowohl der Spieler als auch die
gegnerischen Panzer in der Lage sein Feuergeräusche
zu machen, wenn sie
feuern , und explodieren,
wenn sie explodieren Also gehen wir zu unserer
Basispanzer-Szene und fügen zwei neue Knoten Wir werden den drei D-Node des
Audio-Stream-Players zweimal hinzufügen. Wir werden einen umbenennen und ihn Cannon nennen Und dann werden wir
die andere Explosion nennen. Wir müssen auch im Skript darauf
zugreifen können. Also kehren wir zu
unserem Tank-Skript zurück und exportieren
diese Variablen. Und ich werde eine neue Gruppe gründen
, nur weil wir die
Dinge organisieren wollen. Export ar Cannon
SFX Audio Stream Player drei D. Und wir brauchen noch einen
für die Explosion Und jetzt gehen wir zurück zu unserem Panzer und
wir erweitern einfach die Kategorie, und dann
ziehen wir sie einfach hierher, damit
wir Zugriff darauf haben Und jetzt, wo wir mit der
Methode „Granaten abfeuern“
beginnen, müssen wir nur
noch mit Kanonenpunkten spielen Und wenn wir sterben, spielen
Explosionspunkte. Und da es sich um Well handelt, müssen
wir sie uns besorgen. Wir müssen zuerst die richtigen
Namen finden. Es sind Cannon SFX
und Explosion SFX. Und da es sich um
drei D-Audioknoten handelt ,
sind sie positionell, was bedeutet, dass
sie sich an
die Entfernung
zum Audiohörer anpassen , der in diesem Fall standardmäßig Ihre Kamera ist.
Oh. Okay, das hat nicht
funktioniert. Und das liegt zum
Teil daran,
dass,
naja , sie
durch den Masterbus fahren, was wir nicht wollen Wir wollen eigentlich, dass sie den
SFX-Bus benutzen. Das ist ein bisschen groß.
Das ziehen wir runter. Berühren. Okay,
das sollte jetzt funktionieren. Und das tut es nicht. Mal
sehen, was ich kaputt gemacht habe. Ah, ich sehe, was ich kaputt gemacht habe. Offensichtlich habe ich die
Soundeffekte da nicht reingezogen. Ihr habt
das wahrscheinlich vor mir verstanden. In Ordnung, Explosionskanone. Okay. Jetzt, wo wir tatsächlich Audio haben, sollte
das funktionieren. Offensichtlich brauche ich eine Tasse Kaffee. Da haben wir's. Viel besser. Okay. Und da du das Getöse des
feindlichen Panzers hören kannst Und jetzt werde ich auch
näher ran, damit ihr hören könnt, wie
der feindliche Panzer auf mich feuert Und Sie können sehen,
dass es nicht mehr so
laut sein wird wie zuvor. Und da hast du es. Wir
haben positionelles Audio, Drei-D-Audio in Gado Und das ist das Ende
dieser Lektion. Ich habe dir gesagt, es wäre viel
schneller als das andere. Sie können also gerne
damit herumspielen, Ihre eigenen Sounds hinzuzufügen. Und wenn du möchtest,
nimm das, was wir
durch das Hinzufügen von NavPoints gelernt haben ,
und füge
deiner Arena vielleicht ein paar Kartenentitäten hinzu, die Sounds
abspielen und sie
wiederholen, wenn sie sich dir nähern Andernfalls
sehen wir uns in der nächsten Lektion.
24. Grundlegende Benutzeroberflächenebenen: Willkommen zurück. In dieser Lektion lernen
wir die
Grundlagen der Benutzeroberfläche kennen, ohne dass Programmieren erforderlich ist. Es ist also eher
ein Urlaub von der Menge an Arbeit wir in den
letzten Lektionen geleistet haben. Also, iGADO ist eines der
nützlichsten Dinge, die Sie tun
können,
zwei D- und drei D-Assets
in derselben Szene zu kombinieren zwei D- und drei D-Assets
in derselben Szene Und eine Möglichkeit, das
zu tun, ist
natürlich die
Verwendung von Kontrollknoten, die es Ihnen ermöglichen,
eine 2-D-Benutzeroberfläche über Ihrem
Spielfeld zu platzieren Also hier ist unsere 3-D-Ansicht. Außerdem haben wir hier einen weiteren
Tab für zwei D. Nun haben wir
natürlich noch
nichts mit zwei D gemacht , also wird er leer sein. Aber wenn Sie zu dieser
Registerkarte wechseln, werden
Sie sehen, dass Sie hier
einen Koordinatenraum
mit zwei D-Koordinaten haben einen Koordinatenraum
mit zwei D-Koordinaten , wobei sich der Ursprung hier in der oberen
linken Ecke befindet. Und dieses lila Rechteck wird die Grenzen
Ihres Bildschirms sein. Und Sie können die Größe
dieses Rechtecks ändern , indem Sie zu den
Projekteinstellungen gehen. Und dann Fenster, und es
ist speziell Breite
des Darstellungsfensters und die Höhe
des Darstellungsfensters Ihres Spielfensters
abgestimmt GAdo verwendet bei der Gestaltung seiner Benutzeroberflächen eins zu eins zwischen Koordinaten und Pixeln den
Maßstab
eins zu eins zwischen Koordinaten und Pixeln. Es ist aber auch möglich, sie für Ihr Fenster zu
skalieren. Aber das
werden wir nicht wirklich tun. Wir werden einfach unsere Ressourcen direkt
in unsere Benutzeroberfläche einfügen in unsere Benutzeroberfläche und von dort aus weitermachen.
Also lass uns das machen. Wir haben hier unsere Spielszene
und natürlich haben wir auch unsere
drei D-Ressourcen darin. Also werden wir jetzt eine Benutzeroberfläche
hinzufügen, indem einen untergeordneten Knoten und
ein Steuerelement hinzufügen. Ein Steuerelement ist der
grundlegendste Knoten von Benutzeroberflächen. Und weil es ein Steuerelement ist, wird
es immer über den drei D gerendert . Was wir hier also tun
wollen, ist
, dass
unser Steuerelement
am unteren
Bildschirmrand hier also tun
wollen, ist
, dass ausgerichtet wird. Also klicken wir auf
diese Anker-Voreinstellung und dann auf diese
, die sich am unteren Rand befindet. Es wird also die Ausrichtung
und Verankerung dieses Steuerelements am unteren
Bildschirmrand
erzwingen dieses Steuerelements am unteren
Bildschirmrand und es
über
den gesamten Bildschirm erstrecken Wir könnten nach diesen Griffen
greifen und sie nach oben
ziehen, um
sie größer oder kleiner zu machen Wir könnten
es sogar verschieben, weil ein Steuerelement an nichts
gebunden ist. Ein Steuerelement kann
beliebig groß sein und sich an jeder beliebigen
Position befinden. Es ist nur so, dass
Sie es in
vielen Fällen aus verschiedenen
Gründen tatsächlich an
den Ecken des Bildschirms verankern möchten . In der
Regel, damit Sie, wenn Sie Ihre Auflösung ändern, sei es im laufenden Betrieb oder wenn Sie verschiedene
Versionen Ihres Spiels erstellen, Probleme
damit haben könnten,
dass
die Benutzeroberfläche nicht richtig
skaliert wird verschiedene
Versionen Ihres Spiels erstellen, Probleme
damit haben könnten, Probleme
damit haben könnten . Also, wenn ich zum Beispiel die
Ankerpunkte
hier habe . Wenn ich sie so ändern würde
, dass sie so wären, und dann das
Steuerelement so einrichten würde, nun ja, es ist an
dieser bestimmten Stelle verankert Und wenn wir
den Bildschirm vergrößern würden, würde er möglicherweise nicht richtig
ausgerichtet werden Es könnte tatsächlich so sein , weil sich alles geändert hat. Also werden wir uns orientieren. Aber zum Glück müssen wir uns darüber vorerst keine Gedanken machen. Wir werden nur für eine Auflösung
bauen. Also werden wir es
wie folgt am unteren
Bildschirmrand neu ausrichten und
einen Knoten hinzufügen, der die Textur zerstört hat Und ein Textur-Wreck macht genau das,
was auf der Dose steht. Es enthält eine Textur. Und in diesem Projekt habe
ich Ihnen
eine einzigartige Textur und
Ihre Schriftarten zur Verfügung gestellt , die
wir verwenden werden, um unsere sehr einfache Benutzeroberfläche
zu erstellen Also
ziehen wir die PNG-Datei auf die Textur
und da ist sie Und jetzt, aufgrund der
Ausrichtung, die wir vorgenommen haben, sie sich tatsächlich außerhalb des
unteren Bildschirmrands. Mal sehen, ob wir das Ding nicht
richtig ausrichten können. Nein, du wirst
so sein, oder? Ordnung. Lass uns so gehen Eines der herrlichen Dinge an der Arbeit mit
Benutzeroberflächen in Gadot ist, dass man, obwohl es unendlich
einfacher zu bedienen ist als meisten anderen Spiele-Engines und viel weniger Macken
hat, die
man umgehen muss, die Macken, die es
hat, manchmal damit kämpfen hat. Du sagst, oh,
funktioniert das so, wie ich denke? Ja, nein, vielleicht. Ich weiß es nicht. Okay, lassen Sie uns das
Texturrechteck so ändern, und es sollte eigentlich funktionieren. Eigentlich das Okay,
ja, lass uns zurückgehen. Lass uns das anders versuchen.
Wir gehen die Kontrolle durch und das tun wir nicht. Wir machen lieber Vollbild
oder Vollfenster. Und dann das
Texturrechteck, wenn wir es auf die untere Breite setzen, wird
es jetzt richtig skaliert und sollte
so sein, wie wir es wollen. Und wir
müssen uns keine Gedanken über den
Erweiterungsmodus oder so machen, aber das werden wir ändern. Eigentlich nein, das
werden wir nicht ignorieren. Aber wenn wir die Größe dieser Textur oder die Größe
des Steuerelements
ändern würden , könnten
wir hier die
Texturskalierung ändern Und wir werden auch einen Margin-Container
verwenden
, der auf lange Sicht wahrscheinlich einer der nützlichsten Container
ist ,
die Ihnen für Benutzeroberflächen zur Verfügung stehen, zusammen mit den VBox- und
den HBox-Containern Panel-Container
sind auch unglaublich. Und was wir hier tun
werden, ist der Margencontainer komplett zerstört
wird Aber da ich den
Margin-Container als untergeordnetes Element der Textur Rect eingeordnet habe, wenn ich
für den Margin-Container sage ,
wird er das komplette
Wrack seines übergeordneten Containers sein Im Fall des Steuerelements,
als ich „vollständig zerstört“ sagte, war
sein übergeordnetes Element der Bildschirm,
also die volle
Größe des Aber der Randcontainer
wird die volle Größe
des Texturwracks Und ein Margin-Container ermöglicht
es uns, Ränder für
unsere Benutzeroberfläche
bereitzustellen Und das steht unter
Layout-Thema überschreibt Konstanten. Also nehmen wir
20 für links, 20 für rechts, zehn für
oben, zehn für unten Auch dies sind Pixelwerte. Jetzt
werden wir natürlich nichts mehr sehen, weil der Margin-Container
keine untergeordneten Objekte hat. Also werden wir
ihm eins geben. Wir werden ihm den VBox-Container geben VBox-Container nimmt, wie
das Symbol
zeigt, alle seine
untergeordneten Objekte und ordnet sie so an, dass sie
vertikal ausgerichtet sind Wenn ich also,
sagen wir, ein paar Labels hinzufügen würde, hätten
wir hier ein Label. Lass uns etwas Text eintragen. Und wenn ich das dann ein paar Mal
duplizieren würde, können
Sie sehen, dass
sie automatisch übereinander
gestapelt werden , was für das Layout unglaublich
nützlich ist. In unserem
VBox-Container werden
wir jedoch einen HBox-Container verwenden Und der HBox-Container macht genau dasselbe
wie
der VBox-Container, aber er tut es in Nun, auch ein Hinweis: Die meisten Container ändern
die Größe all
ihrer untergeordneten Objekte so
, dass sie den gesamten verfügbaren
Speicherplatz in ihnen einnehmen den gesamten verfügbaren
Speicherplatz Wie Sie sehen können, ist der
Randcontainer also so groß. Und als ich dann den
VBox-Container hineingelegt habe, hat er sich automatisch in der Größe angepasst,
sodass
er genauso viel Platz einnimmt wie die Größe des
Randcontainers abzüglich der Also hier ist unser 20-Pixel-Rand, und dieser Abstand von zehn Pixeln
gefällt mir nicht wirklich Ich glaube, ich werde
es gleich ändern. Aber hier ist unser 20-Pixel-Spielraum und hier ist unser Zehn-Pixel-Spielraum. Wenn wir diese Ränder nicht hätten, hätte
der VBox-Container die Größe des
Randcontainers Und wir könnten diese Größe nicht ändern. Wir könnten es nicht kleiner
machen , weil Container einfach
so funktionieren. Also werden wir zu unserem
Margencontainer zurückkehren und diese
Margen einfach so
erhöhen. Und jetzt werden
wir innerhalb des
HBox-Containers ein Etikett anbringen Und wie Sie sehen können, können
Sie auf dem Etikett eigentlich nichts
sehen, also
geben wir ihm etwas Text Wir werden hier
tatsächlich
einen Indikator erstellen,
den wir
in der nächsten Lektion mit dem Code verknüpfen
werden, der zeigt, ob
unser Panzer feuerbereit
ist oder nicht. Wir haben also den Status
und werden die Schriftfarbe und
all die anderen guten Dinge
ändern. Also wollen wir zu
Theme-Overrides und
Farben gehen und wir wollen die Schriftfarbe
so
ändern, dass sie schwarz ist, und wir werden die Schrift selbst
in die Schablonenschrift
ändern , die ich
Ihnen im Projekt zur Verfügung gestellt habe, weil sie nett und
militärisch Und dann gehen wir zu den Schriftgrößen und machen daraus 25. Und das ist nicht gut.
Machen wir daraus 45. Viel besser. Jetzt ist es links oben linksbündig, und wir wollen
es eigentlich rechts haben. Es gibt also zwei Möglichkeiten, das zu beheben. Die erste besteht darin, dass
wir
unserem HBox-Container sagen , dass er
sich bis zum Ende ausrichten soll, und das löst unser
Problem größtenteils Tatsächlich, ja,
es löst den Großteil unseres Problems, weil
unser Etikett dort
ist, wo wir es brauchen Und jetzt werden
wir, anstatt ein weiteres Label
hinzuzufügen, ein Rich-Text-Label hinzufügen Rich-Text-Label ist eine schicke Version des Labels , die viele
zusätzliche Funktionen bietet. Sie können sie fast
synonym verwenden. Die Verwendung des einen hat einige Vorteile gegenüber der
Verwendung des Der größte Nachteil, den ich bei der Verwendung des
Rich-Text-Labels
festgestellt habe der Verwendung des
Rich-Text-Labels
festgestellt ,
besteht darin, dass die
vertikale Größe nicht immer korrekt ist,
je nachdem, in
welcher Steuerungshierarchie Sie es verwenden. Aber wie wir gleich sehen werden, hat
es eine Menge anderer Fähigkeiten , die es einfach richtig cool machen. Das Erste, was wir tun
werden, ist Layout
und
zur Transformation überzugehen. Nein, das sind wir eigentlich nicht.
Wir gehen zum Layout. Und genau hier können Sie
die benutzerdefinierte Mindestgröße sehen. In den meisten Steuerelementen
ist dies jetzt standardmäßig auf 00 eingestellt. Gadot
beginnt mit dieser Mindestgröße. Es ist genau das, was
du vielleicht denkst. Im Moment ist die
Mindestgröße also Null. Somit wird
dieses Steuerelement sowohl in horizontaler
als auch in vertikaler Richtung als Null behandelt. Vertikal erstreckt es sich jedoch
tatsächlich bis zur Höhe
des
übergeordneten Containers, natürlich
des HBox-Controllers Aber vertikal oder horizontal,
hier ist nichts drin. also für horizontal
in X-Richtung an, Nehmen wir also für horizontal
in X-Richtung an, dass unser
Minimum 200 ist. Jetzt können Sie also sehen, es mindestens
auf 200 Pixel erweitert wurde. Und wir werden ein
bisschen schicker werden. Wir werden uns mit Theme-Overrides befassen, und wir haben viel mehr Optionen
für das Rich-Text-Label Und das, was wir wollen,
sind Stile, normal. In Ordnung, wir können es nicht überprüfen,
weil wir dort nichts haben. Aber wenn wir das erweitern, haben
wir die Möglichkeit, Style-Boxen
zu verwenden Also gehen wir
zum Style Box Flat über, und jetzt können Sie sehen, dass der Hintergrund des
Labels farbig ist. Diese
tolle Farbe wollen wir aber nicht. Ändern wir es auf Schwarz. Und lass uns hier etwas Text reinschreiben. Und natürlich hat dieser Text
die falsche Schrift und
die falsche Größe. Also als Erstes werden
wir ändern
, wo es ist? Schriften. Wir werden die normale Schrift
ändern. Und wieder können wir nicht darauf
klicken, weil wir keine Schrift darin
haben. Wir werden die LCD N-Schrift verwenden, die wirklich cool aussieht. Jetzt können Sie sehen, dass wir
eine gut aussehende LCD-Schrift haben. Wir werden
die Größe ändern, normal. Oh, ich benutze den falschen. Kein Wunder. Normale Schriftgröße, 24. Da haben wir's. Es ist ein bisschen
zu groß. Das ist gut. Nun, wir haben hier ein kleines
Problem, da
die Schablonenschrift in
vertikaler Richtung etwas aus dem Gleichgewicht gerät und die LCD-Schrift
perfekt zentriert ist Und wir können absolut
nichts dagegen tun. Also werden wir es einfach irgendwie tolerieren
müssen. wäre möglich,
wenn wir einfach ein
manuelles Layout verwenden würden , bei dem jedes Das wäre möglich,
wenn wir einfach ein
manuelles Layout verwenden würden, bei dem jedes
Steuerelement direkt
unter Kontrolle wäre, wir könnten das X
und das Y perfekt verschieben, aber ich möchte Ihnen in dieser Lektion zeigen, wie
Container interagieren Jetzt wollen wir unter Farben
gehen, und ich glaube,
die Standardfarbe soll Gelb sein Es ist also nett und sieht
computergesteuert aus. Und das ist jetzt die
Hauptstärke des Rich-Text-Labels. Wir haben den sogenannten BB-Code. Und wenn wir das überprüfen,
erlaubt uns der BB-Code , HTML-ähnliche
Formatierungen innerhalb unseres Labels zu verwenden. wir also zum Beispiel unsere Etikettenfarbe auf Gelb
setzen, Wenn wir also zum Beispiel unsere Etikettenfarbe auf Gelb
setzen, würde ich hier ein Paar
Farb-Tags platzieren, und sie verwenden Klammern und keine
spitzen Klammern wie HTML. Wenn Sie
das also versuchen, wird es nicht funktionieren. Also mach einfach damit weiter. Farbe Ich habe dort zwei davon.
Farbe entspricht Rot Und jetzt haben wir roten
Text. BB Code kann
eine Menge Formatierungen
vornehmen. Leider
kann ich nicht auf alles eingehen,
aber wenn Sie neugierig sind, können
Sie einfach
BB Code Gadot Four googeln, und Sie werden direkt zur Gado-Dokumentation weitergeleitet und Sie werden alle unterstützten Tags
angezeigt Der, den wir verwenden werden, wird unseren
Text innerhalb des Labels rechtfertigen Also
werden wir einfach sagen, richtig. Und jetzt ist das Nachladen
da, wo es sein muss. Zum Glück ist es irgendwie
am Rand des Dings
zusammengepfercht, also werde ich es mit ein
paar zusätzlichen Leerzeichen auffüllen Und das sieht jetzt ziemlich gut aus. Natürlich können wir unserer
Benutzeroberfläche eine ganze Reihe
anderer Indikatoren und Doodads
hinzufügen unserer
Benutzeroberfläche eine ganze Reihe
anderer Indikatoren und Doodads
hinzufügen Aber das ist genug, um uns
zum Laufen zu bringen. Wenn wir das Spiel jetzt starten, haben
wir eine Statusleiste. Und in der nächsten Lektion werde
ich Ihnen zeigen, wie Sie
die Statusleiste mit Code und Signale verwenden, um
ihre Werte zu aktualisieren. Sehen wir uns dort?
25. Ereignisse und Signale der Benutzeroberfläche – Bewertung: Mm hmm. Mm hmm. Willkommen zurück Bevor wir beginnen, werden wir den HBox-Container für
unsere Statusanzeige mit
Control D
duplizieren unsere Statusanzeige mit . Und der Grund
, warum wir das
tun werden , ist, dass
wir
einen zweiten Indikator
für unseren Killcount haben wollen einen zweiten Indikator
für unseren Killcount Auch wenn wir
momentan nur einen Panzer auf dem Board haben, werden
wir mehr haben Und jetzt, wo wir hier
mehrere HBox-Container haben , werden
wir sie umbenennen. Sie laden also den Status
und die Anzahl der Kills. Und es ist auch eine gute Idee, die Rich-Text-Labels
selbst
umzubenennen , weil
wir
sie als direkte Verweise verwenden werden . Wir müssen also wissen, was sie sind, um
den Unterschied zwischen ihnen erkennen zu können. Und die Benennungskonvention, die
ich normalerweise in einem
solchen Fall verwende , ist der Name
des Steuerelements und Werts, denn das
unterscheidet es von dem Label, das
wir verwenden, um das Ding
auch zu bezeichnen,
weil wir ein Label haben, aber wir haben auch Wie erkennen wir also den
Unterschied zwischen den beiden? Nun, dieser ist statisch
und dieser ist wertvoll. Und dann setzen wir natürlich
den Reloading-Text auf Null, und wir sollten auch
den Reloading-Status
des anderen Textes auf Bereit ,
weil wir damit beginnen
werden Es könnte zwar
etwas klüger sein, das
nachträglich
umzugestalten, sodass es auf den aktuellen Status oder
den Startstatus des Panzers
gesetzt wird, aber das werden wir nicht
tun Wir machen es
einfach fertig. Okay, jetzt, wo alles fertig ist, müssen
wir ein
paar Skripte hinzufügen, und dann können wir
all unsere Signale verbinden. Das erste Skript, das
wir hinzufügen werden,
ist also eines zum eigentlichen
Steuerelement, das natürlich umbenannt
werden sollte, jetzt wo ich darüber nachdenke,
weil es unsere Benutzeroberfläche ist. Und wir werden ein Skript anhängen, was natürlich von hier oder hier aus
gemacht werden kann. Und wir
müssen ihm nicht wirklich einen
eigenen Klassennamen geben , aber
wir werden es trotzdem tun. Und innerhalb der Benutzeroberfläche sollten
wir Verweise
auf die Werte erhalten , die
wir ändern werden. Welches ist ein Rich-Text-Label. Okay. Und dann werden
wir sie wie immer hierher schleppen. Wir benötigen diese Labels, um auf Signale von
zwei verschiedenen Orten zu reagieren. Der Wert für die Anzahl der getöteten Gegner
muss auf das Signal
eines beliebigen gegnerischen Panzers reagieren das Signal
eines beliebigen gegnerischen Panzers Zuallererst haben
wir hier nur einen
feindlichen Panzer, aber wir werden die Szene in
naher Zukunft so
umstrukturieren , dass die feindlichen Panzer an verschiedenen
Orten befinden. wird er nur unter einem
sekundären Knoten für Feinde oder
vielleicht den Spawner landen Höchstwahrscheinlich wird er nur unter einem
sekundären Knoten für Feinde oder
vielleicht den Spawner landen, wir werden die Brücke niederbrennen,
wenn wir darauf treffen Das Problem ist, wenn
wir unsere Hierarchie ändern,
dann kann sich die Art und Weise, wie wir unseren
feindlichen Panzer haben, ändern es sei denn, wir
beziehen uns auf
die Panzer im Spiel, wir wollen das nicht
wirklich tun Ebenso müssen wir
den Nachladestatus
vom Spieler erfahren ,
und dem Spieler, wo
er sich befindet, geht es gut, aber ihr wisst schon, trotzdem Wir werden
also ein sogenanntes automatisches Laden hinzufügen Also gehen wir
zu unserem Ordner Scripts und wir werden ein neues Skript
erstellen, und wir werden es Messenger
nennen. Und genau das
nenne ich all meine automatischen Ladevorgänge. Du kannst es nennen,
wie du willst. Also der Bote, da ist er. Der Messenger benötigt
keinen Klassennamen ,
weil wir zu den Projekteinstellungen gehen und dann
zu Globals gehen
und dann auf das Ordnersymbol klicken, den Messenger mit
Skripten hinzufügen, und dann auf die Anzeigenschaltfläche klicken Und was jetzt
passiert ist, ist, dass Gadot dieses Skript lädt und es als untergeordnetes Element der Rootszene im Spiel zusammen mit
der Szene,
die wir erstellt haben,
instanziiert Rootszene im Spiel zusammen mit
der Szene ,
die wir erstellt haben, Und der einfachste
Weg, das zu veranschaulichen , besteht darin, es gleich zu
tun Wenn wir also unser Spiel ausführen
und auf Remote umschalten, können
wir sehen, dass wir die Rootszene
haben. Hier ist unsere Spielszene, und jetzt haben wir auch
unseren Messenger. Das bedeutet, dass wir von
jedem Skript in unserem Spiel aus auf unseren Messenger
zugreifen können ,
indem wir nur seinen Namen verwenden. Also werden wir das tun. Bevor wir das tun, müssen
wir jedoch
einige Hilfsfunktionen
in unserer Benutzeroberfläche einrichten . Also, was wollen wir hier machen? Was wir tun wollen,
ist, dass die Benutzeroberfläche auf zwei
verschiedene Signale reagiert. Erstens, wenn sich der
Reload-Status des Spielers ändert,
und einmal, wenn sich der Wert der
Anzahl der Kills ändert müssen wir also zwei
Funktionen
bereitstellen Und mit dieser Methode
wollen wir nur den Status des Neuladens als Text ändern ,
der auf dem Statustext basiert, oder nicht, basierend auf dem Status. Der
Status ist ein boolescher Wenn es also wahr ist,
bedeutet das, dass wir neu laden. Wenn es falsch ist,
bedeutet das, dass wir es nicht sind. Und normalerweise könnten wir hier
einfach sagen, dass ich den Status habe, aber das ist eigentlich ein bisschen anschaulicher dafür,
worauf wir testen Tatsächlich könnten wir
das ändern, um den Status neu zu laden. Und das würde
es wirklich noch weiter verdeutlichen. Wenn also der Reload-Status gleich true ist, dann
hat der Wert für den Reloading-Status eine Eigenschaft namens text Und worauf wir das einstellen
wollen, wird etwas
kompliziert werden Gehen wir also, wählen wir es für eine Sekunde
wieder hier hoch. Also haben wir mehrere Zeichenketten
, die wir benötigen werden. Fangen wir
hier für eine Sekunde an. Entweder wird neu geladen
oder es wird fertig sein. Wie auch immer, wenn Sie sich erinnern, wir hatten BB-Code hier drin. Und wir
wollen
diesen BB-Code nicht jedes Mal eingeben müssen . Wir könnten
einfach so vorgehen, aber wir müssen das für beide Zeichenketten
tun, und es ist nur ein
bisschen irritierend Wir werden
also eine Konstante definieren Nun, Konstanten sind
wie Variablen, außer dass Sie
ihren Wert nicht ändern dürfen , nachdem
sie festgelegt wurden Und nur aus Gründen der Namenskonvention setze
ich meine
konstanten Namen immer gerne in Großbuchstaben Also
wird unsere Konstante neu geladen. Textformat. Und das ist
natürlich eine Zeichenfolge. Und was das sein wird, ist, dass es unser BB-Code sein wird. Die beiden Leerzeichen, die wir brauchen, um
sicherzustellen , dass alles den
richtigen Abstand hat und ein Prozent s. Und das ist ein Token, das wir für die Zeichenkettenformatierung verwenden werden, und wir werden gleich sehen
, wie das funktioniert Also haben wir es
richtig gemacht und das. Also, was wir
hier tun wollen, ist,
unseren Text auf diese
Reload-Formatzeichenfolge zu setzen , und dann verwenden wir das
Prozentzeichen, um zu sagen, dass wir diese Zeichenfolge
mit der Zeichenfolge
formatieren werden , die wir ihr geben Also haben wir das
Reload-Textformat
und dann ist es so, dass Godot automatisch dieses Symbol
sieht und dann die Prozentzahl s
durch das Wort Reloading ersetzt Das heißt, wir bekommen
diese Zeichenfolge als Ergebnis, und wir werden das
Gleiche hier unten tun Aber ehrlich gesagt, das ist auch so, dass das auch ein bisschen mehr
gequetscht werden könnte Ich meine, technisch gesehen
können wir es so machen. Aber jetzt müssen wir es nur noch einmal machen. Und dann werden wir das Gleiche
für unsere Anzahl an getöteten Spielern tun. In diesem speziellen Fall müssen
wir die neue Anzahl
der Kills nicht angeben. Wir könnten es einfach auf
den Player legen und den Wert dann hier als
Teil des Signals
weitergeben. Aber nur um die Dinge einfach zu halten, belassen
wir es als
Teil der Benutzeroberfläche selbst. Die Anzahl der getöteten Personen ist also eine Ganzzahl, sie entspricht Null. Und wenn sich dann die Anzahl der
Tötungen ändert, erhöhen
wir einfach unsere Variable um eins und legen dann den Wert für die Anzahl
der Tötungen fest Entspricht den
Reload-Textformaten, und wir ersetzen
die Anzahl der Kills. Und wir werden es
mit dem richtigen richtig machen . Da haben wir's. Okay, lassen Sie uns jetzt unsere Signale
verkabeln. Das erste Signal, das
wir verwenden werden,
ist das Signal, dass der feindliche Panzer
zerstört wurde. Also gehen wir zurück zu unserem
Messenger und definieren ein Signal das keine Parameter benötigt. Und wenn wir dann
zu unserem feindlichen Panzer gehen, dem feindlichen Panzer, wenn Sie sich erinnern, hat
unser Basispanzer eine
Funktion namens Treffer, und diese Funktion wird aufgerufen, wenn ein Panzer von einer Granate getroffen
wird . Sie zerstört ihn
und spielt den
Explosions-Soundeffekt ab. Wir wollen, dass auch der feindliche Panzer dieses Signal
aussendet. Hier nutzen wir also
Vererbung, weil
der feindliche Panzer, der Klasse KI
gehört, den Panzer erweitert, was bedeutet, dass seine Panzermethode bereits
definiert ist . müssen wir also nicht, wenn Das müssen wir also nicht, wenn
wir das nicht neu definieren
und es einfach so nennen, wird
der gegnerische Panzer diese Funktionalität
haben Aber wenn wir es neu definieren, können
wir jetzt unsere
eigene Funktionalität hinzufügen Was wir tun wollen, ist Funktionalität der Basisklassen Also verwenden wir das Schlüsselwort Super. Also sagen wir Super Dot Hit. Und dass wir die
Basisklassen Hit-Methode nennen werden. Außerdem wollen
wir, dass der Bote, der
feindliche Panzer, zerstört wird. Punkt emittieren. Jedes Mal, wenn ein feindlicher
Panzer zerstört wird, teilt
er der
Boten-Klasse mit, dass sie dieses Signal aussenden soll. Jetzt
kann unsere Benutzerschnittstelle
in ihrer eigenen, einsatzbereiten Methode eine Verbindung zu diesem
Signal herstellen, denn auch hier ist
diese Messenger-Klasse für
jede Klasse überall und zu jeder Zeit verfügbar . Also machen wir einfach Messenger,
Enemy Tank Destroyed, eine Verbindung her und wir stellen die Methode bereit, mit der wir uns verbinden
wollen. Und jetzt, was den Spieler angeht, wollen
wir zwei Dinge tun. Also können wir das tun Wir können
das an zwei Stellen tun. Wir möchten, dass der Spieler ein Signal
ausgibt, das darauf hinweist, dass sich sein
Nachladestatus geändert hat Der Spieler ist jedoch
ein Panzer, kein KI-Panzer. Wenn wir ihn also in einen Panzer
stecken würden, dann könnte er für jeden Panzer im Spiel verfügbar
sein, was eigentlich okay ist,
weil wir uns nur mit der Signalübertragung durch den Spieler verbinden müssen . Ich weiß nicht, warum sich mein Cap
Slock gerne von
selbst ausschaltet , wenn ich meinen
Unterstrich benutze, aber los geht's Jetzt wollen wir eine Verbindung
zu diesem Signal herstellen, und zwar im Spiel,
weil das Spiel Zugriff auf
alles hat, was wir brauchen Wir haben uns also bereits mit der Spieler-Shell
verbunden , die hier abgefeuert wurde. Wir werden uns jetzt mit
o verbinden . Ich weiß nicht warum es nicht automatisch
vervollständigt wird, aber was auch immer. Und mit welcher Methode wollen
wir es verbinden? Nun, wir brauchen unseren UI-Knoten, also werden wir das tun, was wir
hier getan haben, um den feindlichen Panzer zu bekommen. Wir könnten auch einen
Verweis auf die Benutzeroberfläche im Spiel bereitstellen. Und tatsächlich werden wir auch ein paar andere Dinge
mit der Benutzeroberfläche
machen. Also lass uns einfach einen Export machen. Und es ist eine Kontrolle. Ja, wir wissen, dass du gerade
kaputt bist. Okay, jetzt stellt der Player eine
Verbindung zu den Benutzeroberflächen her. Eigentlich ist das nicht richtig. Es sollte UI sein, weil wir
tatsächlich eine Klasse für UI haben. Ordnung. Beides
sollte in Ordnung sein, und jetzt können wir Auto Connect verwenden. Jetzt haben wir den
Reload-Status eines Spielers geändert. Und hier ist etwas, bei dem du vorsichtig sein
musst. Wann immer Sie
versuchen, einen Funktionsnamen in der Connect-Methode zu verwenden oder Gadot
die automatische Vervollständigung
eines Funktionsnamens durchführen
lassen , fügt
es
der Methode immer hilfreiche Aufrufklammern hinzu,
und das
wollen Sie nicht, weil dadurch Und wenn Sie dann versuchen, sie
zu löschen, löscht
Gadot alle Klammern Okay, jetzt sollten beide miteinander verbunden sein. Also, wenn wir mit unserem Spiel beginnen, können
Sie sehen, dass unser
Status bereit ist. Wenn ich schieße, passiert nichts. In Ordnung, das
müssen wir debuggen. Aber wenn ich auf den feindlichen
Panzer schieße, sollte ich mir einen Bausatz besorgen. Da ist es. Panzer zerstört. Wir müssen jetzt bis eins
töten. Ah huh, ich verstehe das Problem. Wir haben das Signal nie wirklich
gesendet. Also wir gehen zurück zum Tank, das
hätte das
Erste sein sollen, was ich getan habe. Dann gehen wir zu Fire Shell
und das allerletzte, was wir
tun, nachdem die Granate abgefeuert hat, ist einfach das Signal
mit dem Wert der
Reloading-Variablen auszugeben mit dem Wert der
Reloading-Variablen auszugeben Jetzt hätten wir das korrigieren sollen. Jep. Eigentlich nein,
nein, ich habe mich geirrt Ich wäre nicht das erste
Mal. Das Problem hier ist also, dass
wir, wenn der
Reload-Timer abgelaufen ist, eine Änderung vornehmen müssen. Wir müssen der Benutzeroberfläche
mitteilen, dass sich der
Status erneut geändert hat Und das ist ärgerlich, denn
jetzt müssten wir
überall im
Spiel hingehen , wo wir diese Variable
ändern
und dieses Signal ausgeben würden diese Variable
ändern
und dieses Signal ausgeben Also müssen wir es intelligent machen. Und deshalb brauchen
wir erneut eine Setter-Variable
oder eine Setter-Methode Also definieren wir einen Setter
für den Reloader. Und natürlich entspricht das Neuladen
dem Wert, und dann geben wir ein Signal aus, und jetzt sollte es großartig Perfekt. Wir haben jetzt eine voll
funktionsfähige Benutzeroberfläche. Als Nächstes werden wir uns ansehen
, wie man einige clevere Tricks
und Benutzeroberflächenkomponenten einsetzt,
um eine Minimap
zu erstellen
26. Erstellen einer Minimap: Willkommen zurück. In dieser Lektion werden
wir unserer Benutzeroberfläche im Spiel eine
Minimap hinzufügen, und sie ist viel einfacher,
als du vielleicht denkst Wir werden die
unglaublich nützlichen Gado-Knoten verwenden, die als Sub
Viewports bekannt Falls Sie mit
früheren Versionen von Gado vertraut sind, wurden
sie früher einfach Viewports
genannt,
aber ich glaube, ich habe zu viele Leute verwirrt Das erste, was
wir
tun werden, ist, zu
unserer 2-D-Ansicht zurückzukehren, sodass wir unsere Benutzeroberfläche hier sehen können sehen Und wir wollen eine Minimap
in der oberen rechten
Ecke des Bildschirms hinzufügen in der oberen rechten
Ecke des Bildschirms Dazu benötigen wir das Steuerelement
der Benutzeroberfläche, den sogenannten
Sub-Viewport-Container Wie der Name schon sagt, handelt es sich
dabei um einen Container, bei dem es sich im Grunde
nur um ein Steuerelement handelt,
das ein Unterfenster enthält Wir werden es auf die Größe
ausdehnen , die
wir haben wollen,
und dann werden wir es und dann werden wir mit
den richtigen Anker-Voreinstellungen
nach oben rechtfertigen Wir werden auch
sicherstellen, dass es quadratisch ist, legen die
Transformationsgröße 230 mal 190 Das wird nicht reichen. Sagen wir
200 mal 200. Viel besser. Und dann werden wir es ein bisschen
überschieben , sodass
es absolut
gerechtfertigt ist . Da haben wir's. Um nun
einen Sub-Viewport-Container zu verwenden, haben
wir,
wie Sie hier sehen können, eine kleine
Warnung, die besagt, dass er kein Unter-Viewport hat,
also lassen Sie uns das ändern Wir werden einen Sub-Viewport hinzufügen. Ein Sub Viewport ist im Grunde ein neues Fenster
zu deiner Spielwelt Es wird alles rendern, was in diesem
kleinen Subraum
sichtbar ist in diesem
kleinen Subraum
sichtbar Und in unserem Fall wollen
wir, dass wir
dort sichtbar sind , eine sekundäre
Kameraansicht unserer bestehenden Welt Und keine Sorge, es ist tatsächlich viel weniger
kompliziert als es sich anhört. Also werden wir unserer Hauptspielwelt
eine weitere Kamera mit drei D
hinzufügen . Und diese
muss nicht aktuell sein, weil
wir bereits
eine aktuelle Kamera auf unserem Spieler haben werden. Lassen Sie uns das jedoch umbenennen. Wir nennen es
Spy Cam, weil es
über unserer Spielwelt schweben wird. Also lass es uns hier zur Sprache bringen
und lass uns das nicht tun. Lass uns wieder hierher gehen. Wir werden
uns zwei Viewports Jetzt können wir also sehen,
was unsere Kamera sieht. Komm schon. Klick. Da haben wir's. Manchmal ist mein Computer langsam
und mürrisch und mag es nicht zu tun. Okay. Wenn wir jetzt runtergehen und die Kamera
so
drehen, dass wir es
so machen. Es ist einfacher. Wenn wir die Kamera
so drehen, dass sie nach unten zeigt, um
90 Grad, glaube ich nicht, dass ich das richtig gemacht habe Drehungen verwirren mich immer. Wo schauen wir hier hin? Oh, ich schaue in den Himmel. Okay, es ist minus 90.
Erwischt mich jedes Mal. Ordnung, jetzt ziehen wir
das einfach nach oben, bis wir
die gesamte Karte sehen können die gesamte Karte oder zumindest so viel von
der Karte, wie es erlaubt ist Und das ist gut, finde ich. Oder wir könnten immer so
hingehen
, damit wir uns
das Zeug einfach dort ansehen können. Das ist gut genug,
denke ich. Sie werden standardmäßig feststellen, dass es
unsere Navigationspunkte rendert Also
müssen wir natürlich zurück zu
unserer Anrufmaske gehen und
die NavPoints-Ebene ausschalten ,
damit wir
sie nicht in der Kamera sehen Jetzt müssen wir nur unsere Spionage-Kamera in
unser Unterfenster
ziehen Und jetzt, wenn Sie zu zwei D gehen, können
Sie ein hässliches Durcheinander sehen denn was hier passiert,
ist, dass der Sub Viewport,
der 512 x 512 Pixel groß ist, nicht
korrekt auf die Größe
des Sub-Viewport-Containers 512 x 512 Pixel gestreckt wird gestreckt des Sub-Viewport-Containers Zum Glück können wir das
einfach beheben, indem wir
die Option Stretch aktivieren, und jetzt haben wir ein winzig
kleines Viewport Das Einzige, was
wir jetzt noch tun müssen, ist die Spionage-Kamera zu aktualisieren
, wenn sich unser Spieler bewegt. Und normalerweise
würdest du denken, dass du die Spionage-Kamera einfach dem Spieler überziehen
würdest. Aber wenn du das tust,
müsste sich der Spieler im Viewport befinden, und wir wollen hier eigentlich nicht unsere Hierarchie
ändern Was wir also tun können, ist der Kamera einfach ihr eigenes Skript zu
geben Und da der Spieler
immer existieren wird, müssen wir nur
eine Referenz auf den Spieler exportieren, und wir nennen ihn Target
und wir machen ihn etwas generischer , da er jeden
Physikkörper drei D aufnehmen kann, aber wir werden
ihn immer nur für den Spieler verwenden. Und dann ziehen wir
den Player hierher. Und jetzt mit der Spy
Cams-Prozessmethode, die ich anscheinend nicht
buchstabieren kann. Da haben wir's. Wir müssen nur
die X- und Z-Positionen
der Kamera so aktualisieren , dass
sie denen des Spielers entsprechen. Wir aktualisieren den
Y-Wert nicht, weil der Y-Wert die Höhe,
das Hoch oder
das Unten darstellt , und wir möchten,
dass das konsistent bleibt. Wir
wollen buchstäblich nur, dass es
je nach Tank in die X- oder Z-Richtung geht. Die globale Position
unserer Kamera, sowohl X als auch Z,
entsprechen also dem globalen
Positionspunkt X des Ziels
und der
globalen Position Z. Und das sollte funktionieren. Lass uns sehen. Ja. Wenn
ich jetzt meinen Panzer verschiebe, kannst
du sehen, dass er all diese
aktualisiert. Eine weitere Anpassung, die wir wahrscheinlich vornehmen
sollten, besteht darin, die Kamera so
auszurichten , dass sich die Kamera
dreht, wenn sich der Spieler dreht Aber
das überlasse ich dir als Übung um zu sehen, ob du diese Lektion
gemeistert hast Viewports sind in Three D unglaublich
nützlich. Sie können sie
sogar verwenden, um
auf die Oberfläche
eines anderen Objekts zu rendern auf die Oberfläche
eines anderen Und wenn wir am Ende
des Kurses Zeit haben, werde ich das
vielleicht als
kleines Bonusmaterial betrachten Wir sehen uns in
der nächsten Lektion.
27. 3D-Benutzeroberfläche mit Label3D-Knoten: Willkommen zurück. Diese Lektion
wird ziemlich kurz sein, und wir werden
uns mit
einer schnellen Möglichkeit befassen , unserer dreidimensionalen 3D-Umgebung eine
dreidimensionale,
auch als
diagetische Benutzeroberfläche
bezeichnet, hinzuzufügen auch als
diagetische Benutzeroberfläche
bezeichnet unserer dreidimensionalen 3D-Umgebung Und das werden wir tun,
indem wir
über all unseren Panzern ein Namensschild im Stil von World of Warcraft Wie ihr euch vielleicht denken könnt, erfordert
das Hinzufügen
eines untergeordneten Knotens, und der untergeordnete Knoten, nach
dem
wir suchen, ist die Bezeichnung drei D.
Jetzt müssen
wir natürlich unsere Bezeichnung drei D richtig
ausrichten, also bringen wir sie hier zur Sprache, und wir werden
sie etwas nach hinten verschieben , sodass
sie über unserem Turm liegt Da haben wir's. Und dann
werden wir den Text öffnen. Und wie Sie sehen können,
gibt es einige ähnliche Einstellungen
wie bei Ihrem
Etikett und Ihrem Rich-Text-Label. Also fügen wir hier einfach etwas Platzhaltertext ein,
den Namen des Panzers Wie ihr sehen könnt, können wir den Namen des Panzers nur von
vorne und von hinten
sehen Wenn wir zur Seite schauen,
werden wir
nichts sehen, weil es sich um ein echtes Drei-D-Objekt handelt. Und manchmal willst du
das vielleicht, manchmal nicht. Wir sind vielleicht nicht in der Variante. Wir werden also
Flaggen erweitern und Billboard auf aktiviert
umstellen Billboard bedeutet, dass das
Objekt immer der Kamera
zugewandt ist ,
unabhängig von seiner Ausrichtung Jetzt wollen wir auch
unser Tank-Skript ein wenig erweitern, und das werden wir tun,
indem wir eine Exportvariable hinzufügen Mm. Und natürlich werden
wir unser
Etikett Drei D da reinziehen. Und in unserem Spielobjekt werden
wir den Namen des Spielers und
den Namen
der gegnerischen Panzer
auf die entsprechenden Werte ändern . Da wir bereits einen
Hinweis auf unseren Spieler haben, können
wir uns einfach die Eigenschaft mit der Bezeichnung
des Panzernamens holen und den Text mit dem Namen Spieler
gleichsetzen. Und dann schnappen wir uns unseren feindlichen
Panzer auf die gleiche Weise, wie wir es getan haben, als wir uns als
Signal angeschlossen haben, und machen
genau dasselbe. Aber mit der entsprechenden Anzahl
von Perioden sind wir fertig. Jetzt könnt ihr also sehen, dass
der Spieler einen Brunnen hat Sowohl der Spieler als auch der gegnerische Panzer haben ein Etikett darüber. Nun, beim Herumspielen mit
dem Build an dieser Stelle ist mir aufgefallen , dass es etwas
in der
künstlichen Intelligenz der gegnerischen Panzer gibt künstlichen Intelligenz der gegnerischen Panzer , das
eine Endlosschleife verursacht Vielleicht haben Sie das selbst
bemerkt. Ich werde es untersuchen, und bevor wir mit der nächsten Lektion fortfahren, werde
ich es reparieren
und Sie dann wissen lassen,
wie Sie es selbst beheben können,
bevor wir weitermachen. Aber das ist das Ende
von Kapitel neun. Also trotz dieses
Fehlers, gut gemacht.
28. Startmenü: Willkommen zurück. Wie versprochen, habe ich das
Navigationspunktsystem ein wenig debuggt und festgestellt, dass wir
im Grunde nicht
genügend Navigationspunkte innerhalb der Bewegungsreichweite
des Panzers hatten, sodass er stecken blieb, wenn er auswählen konnte an einem Punkt
ankam, an dem
er nur
aus einem bestimmten
Punkt Und wir wollen niemals
, dass das passiert. Also habe ich
der Karte ein paar zusätzliche Punkte hinzugefügt , um
das zu verhindern. Im Allgemeinen sollten
Sie
Ihre Navigationspunktebene
so feinabstimmen Ihre Navigationspunktebene , dass sich Objekte nicht durcheinander
bewegen, und dass es auch
genügend Punkte gibt , damit sie
nicht so hängen bleibt. Äh, ich habe im
Grunde auch
ein bisschen
zusätzlichen Code innerhalb der Funktion Get
Random NabPoint bereitgestellt zusätzlichen Code innerhalb der Funktion Get
Random NabPoint , und das sollte niemals passieren, wenn Sie Ihre
Navigationspunkte richtig einrichten Aber wenn es an
den Punkt kommt, an dem der Panzer nur noch einen
Punkt zur Auswahl hat, steckt
er im Grunde an dem Punkt fest
, dem er gerade am nächsten
ist, gerade am nächsten
ist und hat keine anderen
Ziele, zu denen er gehen kann Also habe ich eine Warnung ausgedruckt und den Navigationspunkt
, den er auswählen
wollte, auf den gleichen Wert
gesetzt , den er auswählen
wollte, auf den gleichen Wert nächste NavPoint Und das ist keine
ideale Lösung,
aber sie verhindert, dass das
Spiel gesperrt wird Und an diesem Punkt werden
Sie
feststellen, dass
etwas schief gelaufen ist und Sie Ihrem Navigationsraster weitere Knoten
hinzufügen
müssen . Okay, nachdem das geklärt ist, lassen Sie uns jetzt darüber sprechen, worüber wir in Kapitel zehn sprechen
werden. In dieser Lektion
werden wir anfangen, unser Spiel zu konkretisieren und
all die spielähnlichen
Komponenten hinzuzufügen , die es
zu einem Spiel machen und nicht
so sehr zu einem Prototyp Und das Erste
, was wir
brauchen werden, ist ein Startmenü Also werden wir natürlich zu unserer Spielszene
zurückkehren. Und wir
haben bereits eine Benutzeroberfläche im Spiel, was großartig ist, aber jetzt können wir ihr eine Benutzeroberfläche für den Spielstart
hinzufügen. Und wir werden das ziemlich
einfach und faul angehen. Im Grunde werden wir
die Hauptspielszene alle internen und externen
Benutzeroberflächenkomponenten
übernehmen lassen die Hauptspielszene alle internen und externen
Benutzeroberflächenkomponenten
übernehmen internen und externen
Benutzeroberflächenkomponenten und sie
einfach Bedarf ein- und ausschalten,
anstatt zu externen Szenen zu wechseln. Für ein größeres,
komplizierteres Spiel wäre
das definitiv
eine gute Idee, aber wir halten die Dinge einfach. Wenn wir also einen untergeordneten Knoten hinzufügen, könnten
wir ein Steuerelement hinzufügen, aber stattdessen werden wir
einen Panel-Container hinzufügen. Und was ist ein Panel-Container? Ein Panel-Container
ist ein Container, ähnlich den VBox-,
H-Box - und Margin-Containern
, die wir zuvor verwendet haben Er enthält jedoch
ein Hintergrundbild , das je
nach Größe Ihres Steuerelements skaliert wird Und wir können
das Hintergrundbild so ändern
, dass es tatsächlich
wie etwas Texturiertes aussieht Aber für das, was wir hier machen, ist standardmäßig ein
halbtransparenter schwarzer Hintergrund,
und das ist genau das, was wir wollen, denn
im Grunde wollen wir nur, dass das Spiel ausgeblendet wird, wenn
das Menü erscheint Also können wir das als
komplettes Wrack machen und
bekommen , was wir da haben.
Wir werden es umbenennen auch hier sicher, dass Sie sich
beim Bearbeiten von Benutzeroberflächen auf den beiden D-Registerkarten befinden. Jetzt werden wir also
einen anderen neuen Container verwenden, und dieser wird als Mittelcontainer bezeichnet
. Und was macht ein
Mittelcontainer? Ein Container in der Mitte nimmt
alles,
was sich in ihm drückt es auf die
kleinstmögliche Größe zusammen
und zwingt ihn dann, innerhalb werden befindet, drückt es auf die
kleinstmögliche Größe zusammen
und zwingt ihn dann, innerhalb der
Steuerung, an der er befestigt ist,
zentriert zu In diesem Fall ist er also an das Startmenü
angehängt, sodass
alle
darin enthaltenen Steuerelemente zentriert werden . Genau hier. Und es wird diese Kraft auf dieser bestimmten Größe
halten
, egal auf welche Größe wir
die Größe des Startmenüs In unserem mittleren Container werden
wir also unseren guten
Freund, den VBox-Container, verwenden, und innerhalb dieses Containers werden
wir ein Etikett hinzufügen Dieses Label wird
der Titel unseres Spiels sein,
nämlich Zone Battle Wir werden sicherstellen
, dass es zentriert ist, auch wenn die Schriftart
, die wir verwenden werden
, nicht
besonders gut zentriert ist. Schriftgröße wird 100 sein, und die Schrift selbst wird
unser Freund sein, die Schablone Anstatt
sie hier zu suchen, können
wir einfach zu
Quick Load gehen, da wir sie schon einmal
geladen haben, und dann hier drüben können
wir einfach zu
Quick Load gehen, da wir sie schon einmal
geladen haben darauf
klicken,
und bumm, wir haben eine Schablone Jetzt zeige ich
dir einen wirklich tollen Trick. In Ihrem Projektordner habe ich eine sehr schrecklich
benannte Tarntextur bereitgestellt Und das werden wir für
einen Spezialeffekt auf unseren Titel verwenden einen Spezialeffekt Das erste, was
wir tun
werden, ist ,
als Teil unseres Labels ein Textur-Wrack hinzuzufügen als Teil unseres Labels Und wir werden
dieses Label auch umbenennen , nur damit wir es können oder
nur damit wir wissen, was es ist Und unser Textur-Wrack, wir müssen es so
groß wie unser Etikett haben Wie wir bereits erwähnt haben, wird es sich, da es das
Kind des Labels ist, von selbst an die
Größe des Etiketts anpassen,
wenn wir sagen, dass es komplett
zerstört selbst an die
Größe Jetzt müssen wir eine Textur
bereitstellen. Ziehen wir also unsere Camo-Textur in den Textur-Slot,
und jetzt ist sie zu groß Also gehen wir in den Erweiterungsmodus
und sagen Größe ignorieren. Leider ist es gequetscht. Also ändern wir den
Stretchmodus auf Kachel und das sieht jetzt ziemlich gut Aber wir werden es ein bisschen umdrehen
, nur um zu sehen, ob wir eine
etwas bessere Orientierung bekommen können. Äh, wir können das auch auf Ja,
das wird nicht
funktionieren
ändern . A, Tile ist es. Okay, das sieht ziemlich gut aus. Und jetzt kommt der schicke Teil. Wenn wir nach unten gehen,
gehen wir zurück zu „Wenn wir unseren Spieltitel
erneut auswählen“ und
wir gehen runter zur Sichtbarkeit, haben
wir eine Option
namens Clip Children Und wenn wir das auf „Nur
Clip“ ändern, wie cool ist das? Es klemmt die zugrunde liegende
Textur auf das Etikett selbst. Nun, das ist natürlich nicht
perfekt, weil einige
dieser dunklen Werte etwas undurchsichtig wirken,
aber wir können die Farbe unseres
Herrenhintergrunds ändern
, indem wir zu Theme-Overrides Styles gehen und es in ein
neues Style-Box-Flat-Format ändern, das Also werden wir das ändern
und es dunkler machen. Und wir werden
die Alpha auch ein
wenig fallen lassen die Alpha auch ein
wenig , damit wir den
Hintergrund durch sie hindurch sehen können. Es wird
unser Problem nicht perfekt lösen. Die Dunkelheit des E ist
immer noch ein bisschen da, aber weißt du, es sieht trotzdem
ziemlich gut aus. Versuche das eigentlich nicht. Verschieben wir es auf
ein dunkleres Grün. Ja, es ist nicht perfekt, aber es sieht ein bisschen
besser aus. Ich weiß es nicht. Ich kann es sowieso nicht wirklich sagen, nah genug. Du verstehst die Idee. Von hier aus müssen wir also noch ein paar Artikel
hinzufügen. Wir möchten den Spieler die Anzahl der
feindlichen Panzer
konfigurieren lassen Anzahl der
feindlichen Panzer
konfigurieren , mit denen er das Spiel
beginnt. Um
das zu tun, müssen wir also einen weiteren HBox-Container
hinzufügen
, der uns eine weitere
Zeile zur Verfügung stellt, mit der wir arbeiten können Und innerhalb dieses HBox-Containers werden wir
wieder ein
Label hinzufügen Und auf diesem Etikett
werden Feinde stehen. Und natürlich müssen wir die Schrift
und die Schriftgröße
ändern. Lassen Sie uns die Schrift auf 50 setzen, und wir werden einen weiteren
Schnellladevorgang durchführen, um unsere Schablone zurückzubekommen Wir könnten
hier auch ein Thema definieren, das für das Menü verwendet werden soll, aber da
wir nur den Text ändern werden und es nur ein
zusätzliches Element gibt,
das geändert werden muss Normalerweise müssen wir das Thema sowieso auf
das Etikett
legen Was ist also der Unterschied
zwischen dem Ablegen eines Themes auf dem Etikett und
dem Löschen der Schrift und der Schriftgröße
auf dem Etikett, weißt du? Darüber hinaus benötigen wir also ein weiteres Element
im HBox-Container, und dieses wird als Spinbox
bezeichnet Und das werden wir auch tun, damit wir die Spinbox nicht hier haben
wollen. Und jetzt, wo
ich es mir ansehe, ist
es vor
dem grünen Hintergrund fast völlig
unsichtbar , also werden
wir das wieder ändern. Aber wenn das Etikett hervorgehoben ist, gehen
wir zur Größe von
Layoutcontainern über. Und dann haben wir hier
sowohl horizontale als auch vertikale Werte. Im Allgemeinen nimmt
ein Steuerelement also nur
so viel Platz ein, wie es benötigt. Und das kann geändert werden. Und eine Möglichkeit, es zu ändern,
besteht darin
, auf Erweitern
zu klicken . Das bedeutet, dass es so viel Speicherplatz einnimmt, wie es innerhalb des verfügbaren
Platzes einnehmen kann . In diesem Fall wird der
VBox-Container, den wir verwenden,
also nur so breit sein
wie der Text für den Titel Das bedeutet, dass wir so viel
Speicherplatz zur Verfügung haben , mit dem wir arbeiten können Und dann wird
es natürlich vertikal so sein, dass die
HBox so
groß ist wie der Text und das
Steuerelement, je nachdem, welcher Wert größer ist Aber horizontal gesehen,
würde keines dieser Objekte die gesamte
Breite des Steuerelements einnehmen,
was in Ordnung ist, obwohl das Steuerelement die gesamte Breite
des übergeordneten Steuerelements einnimmt gesamte Breite
des übergeordneten Wie wir gesehen haben,
wollen wir das Ganze so erweitern, dass es den gesamten verfügbaren
Platz einnimmt und uns genau dort die
kleine Spinbox lässt Leider ist
der einzige Teil
der Drehbox, den wir
ändern können, die Farbe des
Textes und der Pfeilschaltflächen Und das können wir nur tun,
indem wir ein Thema definieren, was irgendwie widerlich ist Also lassen wir es einfach so wie es ist. Aber wir werden ein paar
Änderungen an der Spinbox selbst vornehmen. Wir werden die Ausrichtung
des Textes so
ändern , dass er zentriert ist, und wir werden den Mindestwert
auf eins
ändern , weil
es sonst ein langweiliges Spiel wäre. Und wir werden den Maximalwert auf sieben
ändern , weil das
ungefähr so viel ist, wie unsere Map bequem verarbeiten
kann. Wir könnten
das jederzeit ändern, wenn wir wollten, und wir machen es gerundet,
sodass
nur ganze
Ganzzahlwerte eingegeben werden . Der Wert ist eins, der Höchstwert ist sieben. Okay, das sieht gut aus. Lassen Sie uns diese Farbe jetzt
wieder ändern , weil sie bei uns jetzt nicht
funktioniert. mache ich immer.
Ich versuche immer die Pfeile zu
ziehen, anstatt das Okay, das ist ein bisschen ähnlicher. Und schließlich benötigen wir
zwei Knöpfe. Fügen Sie also erneut einen untergeordneten Knoten und wir verwenden eine Schaltfläche. Die erste Schaltfläche wird unsere Schaltfläche zum Starten des Spiels
sein. Und wir werden es als solches umbenennen. Es ist immer eine gute Idee, Ihre wichtigen Steuerelemente der
Benutzeroberfläche
umzubenennen , denn wie Sie hier sehen können,
neigt die Hierarchie
der Benutzeroberflächen dazu, sehr schnell
unübersichtlich zu Es ist also immer gut
, sofort sehen zu können was Sie gerade
tun Und wir werden noch einen Button hinzufügen. Und dieser ermöglicht es uns, das Spiel zu
beenden. Gott bewahre Und jetzt müssen
wir natürlich zu Theme-Overrides
gehen
und die Schriftarten erneut ändern Die Schriftgröße ist also 50. Die Schrift selbst ist
wiederum eine Schablone. Und dann werden wir das
Gleiche für den Anfang tun. Wenn wir
etwas aufwändigeres getan hätten als nur die
Schrift und die Größe zu ändern, hätte
ich definitiv inzwischen ein Theme
erstellt. Aber ja. In Ordnung. Also das ist unser Titelbildschirm. Und in der nächsten Lektion werden
wir das, was
wir hier gelernt haben, nutzen, um
einen Pausenbildschirm zu erstellen , der mitten
im Spiel erscheint. Und in der
darauffolgenden Lektion werden
wir sie
mit Code verbinden, damit sie funktionieren. Ich werde dich dort sehen.
29. Pause-Menü: Willkommen zurück. In dieser Lektion werden
wir
ein Pausenmenü erstellen , mit dem wir das Spiel
pausieren können. Wie Sie vielleicht vermutet haben, wird
unsere Benutzeroberfläche hier
etwas unübersichtlich Deshalb klicken wir
auf den Augapfel neben
dem Startmenü, um dessen Sichtbarkeit auszuschalten Jetzt können wir ungehindert arbeiten. Wir werden
einen weiteren untergeordneten Knoten hinzufügen. Und dieser wird ein Mittelcontainer
sein. Und der Grund, warum wir einen
zentralen Container wollen, ist, dass
unser Pausenmenü nicht den gesamten Bildschirm
einnimmt Wir möchten also, dass es in
der Mitte des Bildschirms zentriert ist. Also, wenn wir
hier Full Wrecked machen und das auf Pause-Menü
umstellen Darin werden wir
nun einen anderen Panel-Container verwenden Beachten Sie jetzt natürlich, dass Sie den Panel-Container nicht
sehen können ,
und das liegt daran, dass, wie ich in
der vorherigen Lektion erwähnt habe, der mittlere Container
alles auf seine
absolute Mindestgröße Es gibt also zwei Möglichkeiten, dies zu beheben. Die erste ist, dass wir
unter Layout gehen und transformieren können. Nein, es wird nicht transformiert. Es ist im Layoutmodus.
Benutzerdefinierte Mindestgröße. Wenn wir das ändern würden,
dann können Sie sehen, dass die Steuerung eine
absolute Mindestgröße erzwingen würde , aber das müssen wir nicht tun Klicken Sie darauf und setzen Sie es wieder
auf Null zurück , weil
alles,
was wir in
den Panel-Container
legen , ihn für uns dimensioniert Auf diese Weise müssen
wir uns nicht
darum kümmern, diese benutzerdefinierte
Mindestgröße jedes Mal neu anzupassen
, wenn
wir die Größe unseres Panel-Containers ändern Das erste, was
wir hinzufügen werden, ist ein Margin-Container Und wie wir bereits erwähnt haben, bietet
ein Randcontainer buchstäblich
nur die Möglichkeit Ränder
an den Rändern
unseres bestehenden Inhalts hinzuzufügen. Diese werden sich anpassen
, sobald wir tatsächlich etwas hineinbekommen, weil
es
tatsächlich Möglichkeiten gibt , mit
diesem Unsinn umzugehen, bei dem die von uns
verwendete Schablonenschrift etwas aus Wir können an den Schaltflächen nichts
dagegen tun, aber wir können
etwas dagegen für den Menükopf tun, wofür
wir ihn verwenden werden. Wir werden
einen weiteren untergeordneten Knoten hinzufügen, und dieser wird
ein VBox-Container sein Und innerhalb des VBox-Containers werden
wir ein weiteres Label
hinzufügen Und auf diesem Etikett
steht natürlich das Pausenmenü. Und wir werden es zentrieren
und dann
gehen wir runter zu
Hemovides, natürlich wird gehen wir runter zu
Hemovides, die Schriftgröße
45 sein und die Schrift ist wieder Schablone Sieht ziemlich anständig aus. Jetzt werden wir ein
bisschen schick und wir werden uns eine neue Art
von Steuerung
schnappen ,
den H-Separator. Und das H-Trennzeichen ist unglaublich nützlich, weil
es im Grunde
die Möglichkeit bietet , Zeilen hinzuzufügen, die Ihren Inhalt trennen, und Sie können
das Aussehen dieser Zeilen
auf viele verschiedene Arten steuern . Wir
werden es also so machen , dass
wir wieder zum Modus wechseln und
den Trennzeichenstil ändern, und es wird
ein neuer Linienstil sein, einen Stil
, den
wir noch nicht gesehen Und wenn wir es dann öffnen,
ändern
wir
die Farbe der Linie in Weiß, sodass sie zu unserem Text passt Und wir geben ihr eine Dicke von zwei
, warum nicht? Und wir werden die
Inhaltsränder ändern. Und wir werden
den oberen Inhaltsrand auf etwa 16 erhöhen. Und wie Sie
sehen können, steigt es an. Obwohl das Steuerelement technisch gesehen vorhanden
ist, hebt
es die Linien an,
sodass es so
aussieht , als ob es unserer Schrift näher kommt. Und jetzt, wo wir das haben ,
jetzt, wo wir
die Schrift hier haben, können
wir
unsere Ränder ein bisschen
ändern unsere Ränder ein bisschen , sodass
es ein bisschen besser aussieht. Wenn wir also zu
unserem Randcontainer zurückkehren und unter die
Themoides-Konstanten gehen, können
wir jetzt die Ränder ändern Fangen wir also überall mit schönen
zehn Pixeln an, und das sieht soweit
ziemlich gut Wir können es also
weiter anpassen , sobald wir
unsere anderen Schaltflächen haben, und wir werden drei neue Schaltflächen
hinzufügen. Oder werden wir zwei neue Schaltflächen
hinzufügen? Ich denke, wir werden zwei neue Buttons
hinzufügen. Ursprünglich dachte ich, wir
würden einen Quit to Desktop machen, aber wir können einen Quit to Title machen. Unsere erste Taste wird also einfach
eine Zoom-Taste sein, die uns
zurück zum Spiel bringt,
und unsere zweite Taste wird eine Schaltfläche zum Verlassen des Titels
sein. Also wird der Zoom natürlich „
Zoom“ sagen, und „Quit to title“ heißt „Quit to title“. Und jetzt ist hier ein
wirklich cleverer Trick. Wenn Sie die Strg-Taste gedrückt halten und linken Maustaste klicken,
sodass Sie mehrere Knoten
auswählen gemeinsame
Eigenschaften verfügen, können
Sie sie alle gleichzeitig ändern. diese beiden ausgewählt sind, wechseln
wir jetzt bei Fahrten zu
ihnen
und können
die Schriftarten und
Schriftgrößen ändern, ohne das einzeln tun
zu müssen. Also schnell laden, Schablone. Bum, wie cool ist das?
Und jetzt gehen wir hierher. Und lass uns mit 40 gehen. Sieht ungefähr richtig aus. Und wir doppelklicken hier, um es neu
zu zentrieren Und das
sieht eigentlich ziemlich gut aus. Äh, die Margen sind, die Margen sind gut. Okay. Das ist unser Pausenmenü. Wir können also auf
Sichtbarkeit klicken, um sie auszublenden. Und jetzt, in der nächsten Lektion, werden
wir
es mit Code verbinden und die Möglichkeit hinzufügen, das Spiel zu
starten und zu pausieren. Und ja, wir sehen uns dort.
30. Spielmanager: Anfangs-/Endzustände: Willkommen zurück. In dieser Lektion werden
wir
den Code schreiben, der unsere Start
- und Pausenmenüs verbindet und dem Spieler die
Möglichkeit gibt, zu
sterben und zurück zum Startmenü geworfen zu werden
, sodass er es erneut versuchen kann. Um das zu tun, müssen
wir allerdings ein
gewisses Framework einrichten. Das erste, was wir tun
müssen,
ist also, Skripte sowohl für
das Start- als auch für das Pausenmenü zu erstellen. Und jetzt, wo unser Skriptordner etwas unübersichtlich
wird, fügen
wir einen neuen Ordner hinzu, um unsere UI-Skripte darin
abzulegen Und wir sollten auch innerhalb
unseres Spiels
Verweise auf unser Start- und
unser Pausenmenü erstellen Verweise auf unser Start- und innerhalb
unseres Spiels
Verweise auf unser Start- und
unser Pausenmenü Und natürlich
möchten wir, dass das Startmenü angezeigt wird
, wenn
das Spiel zum ersten Mal geladen wird. In der Ready-Methode
für unser Spielobjekt können
wir also unserem
Startmenü mitteilen, dass es sich selbst öffnet. Jetzt haben wir ein kleines Problem. Obwohl das
Startmenü angezeigt wird, kann sich
der Spieler immer noch bewegen und der gegnerische Panzer
kann sich immer noch bewegen. Und das liegt daran, dass wir
die Verarbeitung, die während des Spiels
passieren würde, nicht
unterbrochen haben dass wir
die Verarbeitung, die während des Spiels
passieren würde, während des Spiels
passieren weil
das
Menü angezeigt wird Und das wollen wir
sowohl für das Pausenmenü als auch für das Startmenü Jetzt könnten wir auf
die Prozessmethoden für
unsere Panzer und unser
Spiel und für alles
andere und für die
unbehandelte Tasteneingabe eingehen die Prozessmethoden für unsere Panzer und unser
Spiel und für alles
andere und für die
unbehandelte Tasteneingabe und im Grunde überprüfen,
ob eines der
Menüs angezeigt wird, und dann vorzeitig
von diesen Funktionen zurückkehren Aber das ist eine Menge Arbeit.
Und das Kennzeichen eines guten Spieleprogrammierers ist ein
gesteigertes Gefühl Wir werden also
die sogenannte
Pause-Eigenschaft des Szenenbaums verwenden sogenannte
Pause-Eigenschaft des Szenenbaums Hoppla. Wir
werden auch auf ein paar zufällige Hammelfleisch treffen, die absolut nichts mit dem
zu tun
haben , was wir
tun. In Ordnung Um also
Zugriff auf den Szenenbaum zu erhalten, verwenden
wir die Methode get tree Und es gibt eine Eigenschaft
des Szenenbaums namens pausiert. Wenn wir sie nun auf true setzen, bedeutet
das, dass keine
Verarbeitung stattfindet Wenn wir jetzt unser Spiel ausführen, können
Sie sehen, dass absolut
nichts passiert. Wenn ich eine der Tasten drücke, läuft
das Spiel nicht oder der
Panzer bewegt sich nicht. Das einzige Problem ist, wenn
ich auf eine der beiden Tasten klicke, ich meine, wir haben noch keinen
Code dahinter gesetzt, aber lassen Sie mich das nur
zur Veranschaulichung tun. Also gehen wir zu unserem Startmenü und verbinden die Quit-Taste,
und
das tun wir,
indem wir zur Registerkarte Signale wechseln und
das gedrückte Signal abrufen. Und wenn wir auf Gehe zur Quelle
klicken, geht es direkt
zu dem Objekt , das das Signal sendet. Wir wollen ein
bisschen nach oben scrollen, weil wir es eigentlich an
das Startmenü-Skript anhängen
wollen. Also sagen wir jetzt einfach
drucken, beenden gedrückt. Wenn wir jetzt versuchen,
zum Desktop zurückzukehren, werden
Sie feststellen, dass wir hier
in unserer Ecke
nichts sehen , und das liegt daran, dass
unsere Benutzeroberfläche natürlich auch
nicht verarbeitet wird. das zu ändern
, klicken Sie also auf die
Komponente der Benutzeroberfläche, das Steuerelement. Und das funktioniert wirklich für
jeden Knoten, aber wir werden es nur
für unsere Start- und
Pausenmenüs verwenden . Und du willst in Bearbeitung
gehen. Und dann ändern wir
den Prozessmodus
von „ Vererben“ auf „Immer Und das bedeutet, dass
dieses Objekt auch dann
weiterverarbeitet wird, wenn
der Szenenbaum angehalten wird Wenn wir jetzt
unser Spiel erneut starten
und versuchen, es zu
beenden, werden Sie feststellen, dass die Methode zum Beenden gedrückt wurde und die Meldung in der Konsole
angezeigt wurde Um unser Spiel zu beenden, brauchen wir nur einen
Verweis auf unseren Baum. Und dann sag einfach „Beenden“. Jetzt, in einem ausgefeilteren Spiel, würdest
du einen Dialog
hinzufügen wollen , in dem es heißt: Willst du
wirklich aufhören? Ja oder nein. Sie sollten
eigentlich genug Tools
zur Verfügung haben, um eines zu erstellen. Wenn du dich also dazu entschließt, etwas
mehr programmieren zu
wollen um etwas zu lernen, würde
ich dich
bitten, in dieser Lektion einen
Bestätigungsdialog
hinzuzufügen, der erscheint, wenn
die Schaltfläche zum einen
Bestätigungsdialog
hinzuzufügen, der erscheint, wenn Beenden gedrückt wird,
und wir beenden das Spiel nur, wenn die Ja-Taste
des bestätigten Dialogs gedrückt
wurde Jetzt wollen wir also auch die Starttaste
verkabeln. Und wir könnten beiden Menüs genauso gut
Klassennamen
geben und sie natürlich
richtig buchstabieren. Und natürlich
wollen wir auch die beiden Tasten
im
Pausenmenü verkabeln . Und im Fall
des Pausenmenüs möchten
wir das
Spiel fortsetzen, wenn es fortgesetzt wird. In diesem Fall setzen
wir
es natürlich fort, bis und tatsächlich müssen
wir
den Vorgang auch in unserem
Pausenmenü auf immer einstellen den Vorgang auch in unserem
Pausenmenü auf immer Wenn wir also weitermachen, ist
Pause natürlich gleich False und wir werden das Pausenmenü ausblenden. Jetzt, wo wir alle unsere
Stubs verkabelt
haben, müssen wir ihnen tatsächlich
Funktionen hinzufügen. Im Startmenü haben wir also unsere Methode bei
gedrückter Starttaste Und wie Sie sehen können, ist
das Startmenü ein
Teil des Spiels,
und das Spiel muss auf das Drücken der
Taste im Startmenü
reagieren , weil wir möchten, dass
das Spiel die gesamte Buchhaltung erledigt,
die
erforderlich ist das Spiel die gesamte Buchhaltung erledigt,
die , um das Spiel zu starten wenn diese Taste gedrückt
wurde Godot hat ein Motto, das Richtlinie dient, die vorschreibt,
wie Eltern und Kinder Und diese Richtlinie
heißt Call Down Signal Up. Das bedeutet, dass das Spiel
das Startmenü direkt manipulieren kann , wie wir hier anhand der Show-Methode des Spiels, das
Start Men aufruft,
gesehen haben , aber das Startmenü
sollte ein Signal senden und es anderen Knoten überlassen, zu entscheiden,
was damit geschehen soll. Und da das Spiel das
übergeordnete Element des Startmenüs ist, würde es natürlich auf
dieses Signal reagieren , weil wir in der Hierarchie
quasi nach oben klettern. Das Startmenü sollte
also ein Signal auslösen, auf
das das Spiel reagieren kann. Das Problem ist nun,
dass das Spiel
angehalten wird , wenn das
Startmenü angezeigt wird, sodass das Spielmenü nicht
wirklich reagieren kann Also müssen wir eigentlich sagen, dass
wir zwei Dinge tun müssen. Wir müssen das
Umschalten des Baums in das
Start-Button-Objekt selbst einfügen ,
was in ,
was Und dann müssen wir
eine Nachricht abfeuern, um das Spiel
und alle anderen interessierten Objekte darüber zu
informieren und alle anderen interessierten Objekte , dass ein neues Spiel gestartet
wurde Und so werden wir das tun. Wir
bekommen den Baum pausiert, gleich falsch Und dann gehen wir in unseren Messenger und
definieren ein neues Signal Mm hmm. Und unser Startmenü
wird dieses Signal auslösen. Und eine andere Sache, es tun muss, ist sich zu verstecken. Derzeit wird das Spiel also nicht wirklich
etwas tun, wenn das Spiel startet, sondern
das Signal trotzdem verbinden. Oh, habe das falsch gemacht.
Es ist verbinden wie ich schon sagte, im
Moment macht es nichts Mal sehen, ob das
tatsächlich funktioniert. Ups, wir haben einen Fehler. Und ich bin schon einmal auf
diesen Fehler gestoßen. Ich bin mir nicht ganz sicher,
worum es geht, aber im Grunde passiert
es so, dass
der NavPoint aus irgendeinem Grund auf Null geht, wenn der Tank aus
dem Ruhezustand kommt, und das ist ein Problem Wenn wir also in
unseren Jagdzustand zurückkehren, also wenn das überwachte
Objekt inaktiv ist, prüfen
wir, ob
es einen NavPoint gibt Wir holen uns den NavPoint und dann ist das überwachte
Objekt im Leerlauf falsch Aber das setzt voraus,
dass das tatsächlich funktioniert. Wenn das nicht funktioniert, wird
es bis zu dem Punkt durchfallen, an dem davon ausgegangen wird
, dass der NAPoint gesetzt wurde Was wir hier also
tun müssen, ist eine kleine
Sicherheitsmaßnahme zu treffen, die besagt:
Wenn überwachte Objekte, die dem
NavPoint am nächsten sind, gleich Null , nun
ja, nein, das müssen wir hier
nicht tun Wir werden es hier oben machen. Wenn also das überwachte Objekt, das naPoint
am nächsten ist, nicht Null ist, kann Idle auf False gesetzt werden Andernfalls wollen wir es im nächsten
Zyklus erneut versuchen. Jetzt ist es auch möglich, dass wir unseren
Navigationsgrad erneut anpassen müssen Ich werde das
nach dieser Lektion mit
ein bisschen mehr Tests untersuchen , um zu
sehen, ob das der Fall ist Aber das wird
uns definitiv einige Probleme ersparen , denn wenn sich der
Panzer nie wirklich bewegt, dann wissen wir,
dass das das Problem ist. Das ist nicht in der Lage, einen
Av-Punkt zu finden. Das könnte nur
ein Fehler sein, der
etwas damit zu tun hat , dass das
Spiel unterbrochen wurde. Aber ja. Also lassen Sie uns darauf zurückkommen
und wir werden sehen, ob das
funktioniert, und das sollte es auch. Und es und der feindliche Panzer bewegen
sich und so
weiter und so fort. Okay, jetzt wollen wir das Pausenmenü aufrufen, wenn die
Escape-Taste gedrückt wird, und wir machen gerade all
unsere Tasteneingaben in der unbehandelten Tasteneingabe des Spiels, aber wir könnten das auch
im Pausenmenü selbst machen Wenn der Speicher nur
deshalb dient , weil er nicht sichtbar ist, heißt das nicht, dass er keine
Tastendruck-Events empfängt Lassen Sie uns also diese Theorie testen. Und wenn ich falsch liege,
platzieren wir es einfach dort, wo wir es
ursprünglich hinstellen wollten. Wenn die Eingabe physisch per Tastendruck oder
Escape-Taste erfolgt und nicht sichtbar ist , dann wollen wir das Spiel pausieren, und das machen wir einfach
wieder, indem wir tree abrufen, pausieren als gleich true und show Okay, mir ist gerade aufgefallen, dass mir
gerade ein kleiner Bug aufgefallen ist. Wir
überprüfen also nicht wirklich , ob das
Spiel noch läuft. Also, wenn ich jetzt Escape drücke, bekommen
wir ein Pausenmenü.
Und das wollen wir nicht. Wir wollen also, dass das nur
passiert, wenn es nicht sichtbar ist, aber nun
ja, statt, falls nicht sichtbar,
schauen wir mal, ob der Baum
schon angehalten wurde Wenn der Baum nicht pausiert ist,
dann wollen wir das tun. Und da haben wir's.
Jetzt starten wir das Spiel und jetzt können wir eine Pause einlegen. Wir haben uns also bereits mit
unserer Zoom-Taste befasst, also müssen wir uns als Nächstes mit
unserer Schaltfläche „Zurück zum Titel“ befassen. Und der
einfachste Weg, das zu tun, ist natürlich , ein weiteres Signal hinzuzufügen. Und wir werden dieses
Signal über unser Pausenmenü ausgeben. Und wir möchten, dass das
Startmenü dieses Signal überwacht. Ordnung. Wo ist mein
Start? Da ist es. In der Bereitschaftsmethode
unseres Startmenüs
werden wir uns also damit verbinden. Eigentlich können wir hier eine
kleine Abkürzung machen. Wir würden also einen
Funktionsnamen angeben
und dann würden wir hier unten
eine Funktion angeben. Aber alles, was die Funktion
tun wird, ist einfach
das Startmenü anzuzeigen, und das
geht viel schneller. Wir werden eine
sogenannte Lambda-Funktion verwenden. Und eine Lambda-Funktion
ist buchstäblich nur eine Funktion, die
in einer Zeile ohne Namen definiert ist Wir können
hier also anstelle eines
Funktionsnamens eine vollständige Funktionsdefinition angeben hier also anstelle eines
Funktionsnamens eine vollständige Funktionsdefinition Und das tun wir
einfach, indem das Funk-Schlüsselwort und die Argumente der Funktion angeben,
wie wir
es hier hätten, aber wir geben ihr keinen Namen und fügen danach einfach den
Code hinzu. In diesem Fall besteht der Code also buchstäblich nur
darin, das Startmenü anzuzeigen. Jetzt sind wir in der Pause
oder wir sind im Startmenü. Und wir gehen zu Start.
Das Spiel läuft. Pause. Hör auf zum Titel. Ich habe vergessen, das Pausenmenü auszublenden. Aber ja, so
funktioniert das. Und wenn es uns jetzt zu gut ginge, könnten wir kein neues Spiel spielen, weil
das Pausenmenü immer noch da ist. In Ordnung, also hör auf mit dem Titel, lass los. Versteckt euch Und jetzt
sollten wir Gold verdienen. Und das sind wir. Es ist ziemlich cool. Ordnung, wenn wir mit dem Titel
aufhören, kehren wir zum Desktop zurück. Das Spiel ist vorbei. Okay, jetzt, wo wir ein
Startmenü und ein Pausenmenü haben können, müssen
wir
die Spielstatus so einrichten , dass das Spiel beendet wird das Spiel eine
Nachricht anzeigt und
nach dem Tod des Spielers wieder
zum Startmenü zurückkehrt . Und auch hier
ist
es am einfachsten, eine globale Funktion bereitzustellen. Eigentlich nein, hat
der Panzer nicht schon Nein, haben
wir gemacht, wir haben
das in Shell gemacht. Nun, wir können es hier hinstellen. So können wir ein Signal
geben , wenn ein Panzer zerstört
wurde. Und wenn wir
unser Shell-Skript öffnen, da wir
hier bereits mit
der Kollision des Panzers zu tun haben, ja, wir könnten es tun. Wir können es hier machen. Wir könnten es entweder hier machen oder wir könnten es mit
der Hit-Methode machen. Beides ist
völlig akzeptabel. Aber wenn wir tatsächlich, weißt
du was? Der logischste Weg, das zu tun. Es tut mir leid, ich
hüpfe hier ständig herum. Aber wenn wir zurück in den Tank gehen, haben
wir eine zerstörte
Variable, und auch hier Setter Destroyed entspricht Messenger, eigentlich müssen
wir das ändern,
weil es für jeden Kurierpanzer
zerstört, sendet sich selbst aus. Self ist ein spezielles Schlüsselwort, das das Objekt
angibt, dem das Skript gerade ausgeführt
wird. Okay. Ja. Es hilft, wenn ich Dinge richtig
buchstabiere.
Bum. Da haben wir's. Okay, jetzt nochmal, der einzige
Panzer, dessen Botschaft
uns wichtig ist, ist der Panzer des Spielers. Obwohl das eigentlich
ziemlich überflüssig ist, wenn
man bedenkt, dass
wir in unserem feindlichen Panzer, ähm, hm? Okay. In Ordnung. Ja, wir haben hier ein paar
redundante Signale, die ihr normalerweise
vermeiden wollt, aber in diesem Fall wollen
wir
unterscheiden, ob der gegnerische Panzer zerstört wird
und ob ein Panzer im Allgemeinen zerstört
wird In diesem Fall wollen
wir also eine Verbindung zur Methode der Panzerzerstörung des
Spielers herstellen. , weißt du,
wenn das der Fall ist, müssen
wir es hier nicht angeben. Weil wir hier oben bereits
verschiedene Signale haben. Und dann gehen wir wieder
runter und es ist nur ein bisschen
zerstört. Und dann kann das
Spiel auf diese Weise eine Verbindung zur zerstörten Methode
des Spielers herstellen. Was das Endspiel auslösen wird. Und das
bedeutet natürlich, dass wir
eine zusätzliche Benutzerschnittstelle benötigen werden. Also werden wir das jetzt erstellen. Lass uns zum Spiel gehen, und das wird
tatsächlich Teil der Benutzeroberfläche
sein. Also können wir das hier drauflegen. Es wird ein Container sein, machen wir einen Panelcontainer
daraus. Ja. Es wird ungefähr
so groß sein, mehr oder weniger, und wir werden es zentrieren,
was eine andere Art ist. Das ist eine andere Art, Dinge zu
zentrieren, als einen zentralen Behälter zu
verwenden Wenn Sie jedoch später die Größe
ändern ,
müssen Sie ihn neu zentrieren. Wenn ich also so weitermache, ist es
jetzt aus dem Gleichgewicht geraten, also müsste ich es neu zentrieren Spiel ist vorbei, Dialog. Bezeichnung des untergeordneten Knotens. Eigentlich nein. Wir wollen ein Panel, wir wollen
einen Margin-Container. Ich werde diese
Ränder ein bisschen einbauen. Die Moides sind Konstanten. Geben wir ihnen allen Fünfzehn. Behälter für den Rand. Etikett. Die horizontale Ausrichtung
ist jetzt zentriert. Und sie überschreiben. Laden Sie schnell unsere Schablonenschrift und ändern Sie die
Textgröße auf viel größer Da haben wir's. Und jetzt können wir den Code hinzufügen, um das aufzurufen und für
ein paar Momente zu pausieren und dann zum Startmenü
zurückzukehren. Also müssen wir natürlich zu unserem Spiel zurückkehren und
eine weitere Referenz exportieren. In Ordnung. Und sobald unser
Game-Over-Dialog angezeigt wird, müssen
wir das Spiel pausieren
und das Spiel dann,
sagen wir, nach etwa 2 Sekunden beenden . Bei der Methode, bei der der Spieler
zerstört wird, verwenden
wir also das Schlüsselwort Awet Und das bedeutet,
dass die Verarbeitung
dieses bestimmten Skripts,
in diesem Fall des Spiels,
unterbrochen wird Verarbeitung
dieses bestimmten Skripts,
in diesem Fall des Spiels,
unterbrochen , bis das von
Ihnen angegebene Signal ausgelöst wurde Was wir also tun wollen, ist
, unseren Baum zu bekommen
und wir werden
Create Ti aufrufen, was dem Erstellen eines Timer-Knotens entspricht , wie wir es
für den Nachlade-Timer der Panzer gemacht haben, aber das passiert quasi unsichtbar Es erstellt im Grunde
einen neuen Timer-Knoten und hängt ihn
mit dieser Anzahl an
Countdown-Verzögerungen in Sekunden an den Hauptbaum an
und startet ihn dann und Und wir möchten darauf hinweisen
, dass wir auf die
Timeout-Methode oder das Timeout-Signal dieses Timers
warten , das aufgerufen wird
, wenn
der Timer abgelaufen ist Und wir wollen auch unsere
Endgame-Handler-Methode mit diesem Signal
verbinden Leider friert das Spiel dadurch
nicht ein. Es funktioniert nicht, dass der
Szenenbaum angehalten wird, wie wir es getan haben, um das
Spiel anzuhalten Und das wollen wir, weil wir das Spiel
nicht unterbrechen wollen denn wenn wir das Spiel pausieren würden
,
sobald der
Dialog über das Spiel
erscheint, würde das
Abspielen des Sounds unterbrochen Der Spieler würde also sterben. Das Explosionsgeräusch würde auftreten. Aber dann kam der Dialog und der Baum hielt inne und wir würden die Explosion nicht wirklich
hören. Deshalb wollen wir
nicht unseren universellen
Getree-Punkt-Paused-Equal-Tree-Aufruf ausführen, wenn
wir den Spieler zerstören Wir müssen jedoch einige
Sicherheitsvorkehrungen treffen, um zu einige
Sicherheitsvorkehrungen treffen, um zu verhindern, dass Dinge passieren solange der Spieler tot
ist, denn wenn wir
zum Beispiel den gegnerischen Panzern nicht sagen, dass sie aufhören sollen, auf
den toten Spieler zu
schießen, werden
sie weiter auf sie schießen, werden
sie weiter auf sie schießen, was das Ganze nur noch schlimmer macht Im Feuermodus beheben
wir das, indem
wir
nicht bedingungslos eine Granate abfeuern, sondern prüfen, ob
das überwachte Objekt,
das natürlich
der gegnerische Panzer ist, ob sein Ziel, also beheben
wir das, indem
wir
nicht bedingungslos eine Granate abfeuern, sondern prüfen, ob das überwachte Objekt,
das natürlich
der gegnerische Panzer ist, der Spieler
, zerstört ist oder ob
es nicht
zerstört, nicht zerstört ist , dann feuern
wir eine Granate ab. Und wenn es zerstört ist, ignorieren
wir es. Außerdem müssen wir einen kleinen Fehler
im zerstörten Setter unseres Panzers beheben im zerstörten Setter unseres Panzers denn was hier passiert ,
war, dass wir
das zerstörte Signal unabhängig vom Status
der
zerstörten Variablen aussendeten das zerstörte Signal unabhängig vom Status
der
zerstörten Variablen Und wir wollen
das Signal „Zerstört“ nur zulassen , wenn der Panzer tatsächlich zerstört
wurde,
was bedeutet, dass „Zerstört“ gleich wahr
ist Also haben wir hier einen Scheck eingeworfen. Und der Grund, warum es
wichtig ist, ist, dass, wenn der Spieler
sterben würde und wir zum Hauptmenü zurückkehren und dann gleich wieder ein neues Spiel starten würden, der
Spieler immer noch tot wäre. Also fügen
wir bei Spielstart einen Spieler hinzu, der
Eagles False zerstört hat, um den Spieler in einen aktiven Zustand ,
sodass wir ein neues Spiel spielen können Leider entspricht keine
der anderen Variablen, die wir festgelegt haben, dem Wert,
der zurückgesetzt wurde Der Spieler behält also seine
alte Anzahl an Kills und so. Und das können wir tatsächlich ändern. Wenn wir also unter UI Kill Count klicken, können wir den Wert auf Null
zurücksetzen. Könnte auch eine gute Idee sein,
einfach Ja, lass uns das machen. Eine bessere Idee ist es also
,
den Kill zählen zu
lassen oder die Benutzeroberfläche mit der Startmethode des Spiels verbinden
zu lassen. Weil mehrere Dinge mit demselben Signal
verbunden werden können. Und eigentlich
wollen wir es hier nicht machen. Wir wollen es innerhalb der
Benutzeroberfläche selbst machen, weil dann alles in
sich geschlossen bleibt. Also Messenger, Spiel starten, Verbindung herstellen bei Spiel starten. Und dann wollen
wir im OnStart-Spiel die
Anzahl der Kills wieder auf Null setzen Leider wurden die Startpositionen
der Spielerpanzer und feindlicher Panzer nicht zurückgesetzt, aber das werden wir in
der nächsten Lektion beheben, wenn wir
ein aktuelles Spawn-System implementieren Lassen Sie mich jetzt sichergehen, dass
ich nichts vergesse. Also der Feuerzustand ist gut. Der zerstörte Panzer ist gut. Wir haben unsere Sachen im Spiel gemacht. Also werden
wir natürlich verbinden
und im Endgame verstecken
wir das Spiel über dem
Dialog und geben einfach das Quitt-to-Titel-Signal aus Und natürlich
müssen wir das Spiel
wieder einfrieren, müssen wir das Spiel
wieder einfrieren wenn es
zum Titelbildschirm zurückkehrt,
und ich glaube
nicht, dass ich das getan habe Lass uns nachschauen. Okay, Cart-Spiel. Lass den Feind mich töten. Okay, der Spieler
wird sich nicht bewegen, aber wie Sie hören können, haben wir den
Baum nicht angehalten Also werden wir das tun
müssen. Also haben wir in Endgame
Messenger zu Title Amit beendet. Das bedeutet also, dass
das Spiel nun, das Startmenü
schnell mit Title it Funk Show verbunden wurde Und hier, also wollen wir hier
eigentlich
eine weitere Zeile zu unserem Lambda hinzufügen , wodurch der Baum angehalten wird Wir können das also ein
bisschen besser formatieren , indem wir dort einfach
die Eingabetaste drücken Godot wird es egal sein. Und dann machen wir Get
Tree Almost equal true. Und das sollte
das Problem lösen. Und das tut es. Okay. Jetzt haben wir eine weitere Sache, die
wir natürlich tun müssen, und wir müssen überprüfen, ob der Spieler
alle feindlichen Panzer getötet hat, und wenn ja, dann sollte
das Spiel in dieser Hinsicht
vorbei sein. Oder zumindest sollte es neu gestartet und eine
festgelegte Anzahl von Panzern wiederbelebt Aber das werden wir jetzt nicht
tun. Das werden wir im Rahmen der
Entwicklung des feindlichen Spawners tun , was wir in der nächsten
Lektion tun werden
31. Gegnerische Spawn-System: Willkommen zurück. In dieser Lektion werden
wir ein
Spawnsystem programmieren, das sich darum kümmert , sowohl unseren Spieler
als auch unsere Feinde in die Karte einzufügen unsere Feinde in die Karte einzufügen Aber bevor wir mit dem Programmieren beginnen, müssen
wir noch einige Dinge erledigen Also das Erste
, was wir
tun sollten , ist, in unsere Arena zu gehen und einen neuen NavPoint hinzuzufügen weil wir auch angeben müssen ,
wo der Spieler
spawnt Wir haben also bereits
unsere NavPoint-Szene und ziehen sie
in die Liste Sobald sie da ist,
benennen wir sie in Player-Spawn um. Wir werden den Namen
des Spawns verwenden, um anzuzeigen
, dass dies der Spawnpunkt ist, an dem
der Spieler spawnen sollte Darüber hinaus möchten
wir die Farbe
der Spawnpunkte ändern, Farbe
der Spawnpunkte damit wir wissen, dass sie
speziell für den Spieler bestimmt ist Wenn wir also mit der rechten Maustaste darauf klicken
und Bearbeitbare Kinder auswählen, haben
wir jetzt Zugriff auf die untergeordneten
Objekte des Objekts Wie ich in
einer früheren Lektion erwähnt habe, ist
das Mesh eine Ressource, und da alle Spawnpunkte
aus derselben Szene stammen, teilen
sie sich alle
dieselbe Ressource. Das heißt
, wenn ich dieses Mesh
ändere, werden
sie alle geändert, also wollen wir das nicht Also erweitern wir das
Drop-down-Menü und sagen „
einzigartig machen“, „rekursiv Und der Grund, warum wir rekursiv sagen und nicht nur
einzigartig machen, ist, dass auch das Material innerhalb des Netzes einzigartig
sein soll Jetzt können wir
das erweitern und
zum Material gehen und
seine Albedo ändern und ihm die gewünschte Farbe
geben Ich habe mich für Grün entschieden. Und dann müssen
wir den
Spawn der Spieler woanders hin verlegen Ich werde es
ganz in der Ecke der Karte platzieren ,
damit der Spieler nicht über den
Gegnern spawnt Und ich werde auch
die Drehung des Spawnpunkts ändern die Drehung des Spawnpunkts ,
sodass wir
den Ursprung angeben können, an
dem der Spieler spawnen wird Sie spawnen also an
der Stelle, an der sich dieser spezielle
Spawnpunkt dieser spezielle Und als Nächstes
müssen wir unser Spiel tatsächlich
modifizieren, um der Tatsache
Rechnung
zu tragen, dass wir einen Spawner-Knoten verwenden werden Als erstes sollten wir
also den Spielerpanzer und
den gegnerischen Panzer löschen ,
weil der Spawner diese zur Szene hinzufügen
wird Und wir müssen auch einen
Spawner hinzufügen. Außerdem
wäre es an
dieser Stelle eine gute Idee, das Spielobjekt in den spielbaren Bereich und
den Abschnitt mit
der Benutzeroberfläche zu unterteilen Spielobjekt in den spielbaren Bereich und
den Abschnitt mit
der Benutzeroberfläche Also fügen wir einen untergeordneten Knoten hinzu
und
nennen ihn Playfield, und er wird einfach vom Typ Node
sein Node ist der
niedrigste Standardobjekttyp ,
den Sie in Godot haben können Und es ist sehr nützlich,
wenn du sagen willst, ich will etwas in einer Szene, aber ich will nicht, dass
es irgendwas Knoten eignen sich hervorragend, um
Dinge zu gruppieren , wie wir gleich sehen werden Also benennen wir diesen
Knoten in Spielfeld um
und ziehen die Arena darunter, sodass
sie ein
untergeordnetes Element des Spielfeldes ist Und das Spielfeld
wird auch einen Spawner benötigen
, der auch ein Knoten sein wird Und natürlich benötigt der Spawner
ein angehängtes Skript Und wird seinen
Klassennamen in Spawner ändern. Und jetzt sind wir bereit, mit der
Erstellung unseres Spawn-Systems zu beginnen. Das erste, was wir tun müssen, ist, den Spanor zu konkretisieren Der Spawner muss mehrere Dinge
erledigen. Er muss einige Signale einrichten. Also geben wir
ihm natürlich eine einsatzbereite Funktion. Es wird feindliche Panzer spawnen. Und es wird nicht nur den Spielerpanzer
spawnen, sondern diesen Spielerpanzer auch
wieder zum aufrufenden Knoten zurückbringen, weil wir
ihn in der Spielwelt einsetzen wollen Und wir wollen es nicht nur in die Spielwelt
bringen, sondern wir müssen auch einige Signale
und so an das Spielobjekt
anschließen und so an das Spielobjekt Es ist also etwas
einfacher, das Spielerobjekt zurückzugeben. Wir können aber auch
das Verbindungsobjekt weitergeben, was wir sowieso für
die feindlichen Panzer tun werden. Jetzt haben wir also unsere drei
Methoden, und
das wird sich natürlich
beschweren, weil es einen Wert zurückgeben will und wir noch keinen Wert haben. Jetzt haben wir sie
also im Griff. Und natürlich benötigen wir
Verweise auf die Szenendateien, die wir instanziieren
werden, bei
denen es sich natürlich um den
Panzer und den KI-Panzer handelt Player Tank Prefab
ist also eine vollgepackte Szene. Und das gegnerische Panzerfertighaus
ist auch eine überfüllte Szene. Wir müssen auch wissen, wie viele
feindliche Panzer wir spawnen
werden, weil wir
diesen Spinner im Startmenü haben diesen Spinner im Und es wird standardmäßig auf
eins gesetzt. Und das sollte
reichen, um uns den Einstieg zu erleichtern Wenn wir also ins Spiel gehen, sollten wir uns
eigentlich mit dem Spielskript befassen. Wir haben hier also schon eine
Menge Sachen, die wir im Ready-for-The-Skript
gemacht haben , das davon ausgeht, dass der Spieler und der
gegnerische Panzer
bereits vor Ort sind ,
wenn das Spiel beginnt Das ist nicht mehr der Fall, aber wir benötigen diesen Code immer noch Anstatt also
zu versuchen, uns an alles zu erinnern, werden
wir einfach
K kontrollieren und alles auskommentieren. Und zu Beginn des Spiels haben
wir jetzt Informationen, mit denen wir uns befassen
müssen. Lassen Sie uns also dort hinübergehen. Und dann
kommen wir darauf zurück. Sie können diesen Fehler ignorieren
, wenn Sie ihn bekommen. Es ist ein seltsamer
Bug, den Godot auslöst. Es ist in
früheren Ausgaben nicht erschienen, daher wird
es vermutlich behoben Es hat keinen Einfluss auf
das, was wir jetzt tun. Okay, also im Spawner,
was müssen wir tun? Nun, auch hier müssen wir den
Spielerpanzer spawnen, und der einfachste Weg, das zu tun, ist
natürlich, einen neuen zu
erstellen Der Var-Spieler
wird also ein Panzer sein. Und es
wird ein Beispiel für den vorgefertigten Panzer für
Spieler Also instanziiert Player Tank
Prefab und nur um es zu
spezifizieren, können
wir es casten, indem wir es als Tank bezeichnen Und wir haben jetzt eine Kopie
eines Panzers, den wir als unseren Spieler
verwenden können Wir können also den Spieler zurückbringen. Aber wir werden mehr als
das tun müssen. Wir werden
auch
einen Verweis auf das Spielfeld angeben müssen ,
insbesondere auf das Arena-Objekt, weil wir Lage sein
müssen, seine
Spawnpunkte abzufragen Und wir wollen nicht einfach
den Spawnpunkte-Node
direkt abrufen , weil
wir auch auf das
übergeordnete Element der Arena zugreifen müssen Also machen wir die Arena hier einfach zu
einer Variablen. Spawner. Okay, also
müssen wir auch diese Werte zuweisen Also
wird das Spielfeld-Terrain zur Arena. Das
Fertighaus des Spielers ist natürlich ein
Panzer, und das gegnerische
Panzerfertigteil ist ein feindlicher Panzer Wir müssen also unter anderem für den Spieler seinen Namen, seine Rotation und
seine Position festlegen Rotation und
seine Position Der Name, sowohl der Knotenname
als auch der Labelwert,
sind also ziemlich einfach. Wenn wir den
Namen des Knotens festlegen wollen
, der hier im Szenenbaum erscheint, sagen
wir einfach Spielerpunktname
und nennen ihn
Spieler, denn wenn wir es lassen
würden, wie
es für den Panzer ist, wäre
es Tank, und das wollen
wir nicht. Also wollen wir darauf hinweisen
, dass es sich um den Spieler handelt. Wenn ihr euch erinnert, hat der
Panzer ein Drei-D-Label, das wir, glaube ich,
entsprechend der Autovervollständigung Panzer-Namensschild
genannt haben . Okay. Da ist es. Namensschild des Panzers. Also ja. Der Text entspricht auch dem Spieler. Als Nächstes müssen wir den Spawnpunkt ermitteln, dem aus der Spieler spawnen wird
. Und das geht am einfachsten
, wenn wir
einfach unser
Spielfeld-Terrain nehmen Und wir werden den
Nav Points-Knoten bekommen. Oh, eigentlich gibt es
einen etwas einfacheren Weg das
zu tun, als ich es
ursprünglich getan habe. Also, als ich das zum
ersten Mal gemacht
habe, habe ich mir
den NAV Points Node geschnappt und ihn richtig geschrieben, was ich beim Filmen nie mache Und dann habe ich die
Find-Child-Methode verwendet und ihm den
Namen Player-Spawn gegeben Aber das
müssen wir nicht tun, weil
wir wissen, dass den NavPoints
immer
ein Spieler-Spawn
zugeordnet sein wird ,
also sollte ich einfach in der Lage
sein seinen Pfad direkt wie folgt anzugeben Und wir werden in Kürze wissen
, ob das nicht wirklich funktioniert, denn wir werden einen Absturz erleben Ordnung. Sobald wir das alles
gemacht haben, müssen wir den
Spieler zum Spielfeld hinzufügen Denn wenn du dich erinnerst, haben wir der Arena keine der beweglichen Objekte
hinzugefügt, sondern sie dem
Hauptteil des Spiels Ich meine, wir könnten
sie der Arena hinzufügen, aber ich möchte meine
Geländemaschen von
beweglichen Objekten trennen Deshalb haben wir Playfield. Also Hoppla. Also das Spielfeld ist das
Elternteil des Spielfeld-Terrains. Also bekommen wir einfach
Eltern-Kind-Spieler. Und das müssen wir tun,
bevor wir versuchen,
die Position
oder Rotation des Spielers festzulegen . Wenn wir keinen Fehler bekommen, und dieser ist einer, den
wir nicht ignorieren sollten. Sobald sich der Spieler also
im Spielfeld-Terrain befindet, können
wir seine Rotation ändern und seine Rotation
wird der
Spawnpunkte
entsprechen Und die globale Position des Spielers wird der globalen Position der
Spawnpunkte entsprechen Ob
Sie nun Position oder
globale Position verwenden oder nicht ,
hängt normalerweise von den Koordinatensystemen ab, in
denen Sie arbeiten Manchmal ist es wichtig,
manchmal wird nicht fast immer die
globale Position verwendet nur damit ich
keine unhöflichen Überraschungen Aber wissen Sie, lassen Sie uns einfach
Position ausprobieren und sehen, ob es
tatsächlich funktioniert. Das sollte es. Und jetzt, wo das alles erledigt ist, können
wir zu unserem Spiel zurückkehren. Und wenn
das neue Spiel startet, müssen
wir natürlich den Spieler und
die Feinde spawnen
und ein bisschen mehr
Setup-Initialisierung
vornehmen,
bevor das Spiel tatsächlich Spieler und
die Feinde spawnen
und ein bisschen mehr
Setup-Initialisierung
vornehmen bevor das Spiel Da wir also bereits
einen Hinweis
auf den Spieler in unserem Spiel haben , werden wir hier
sagen, dass Spieler gleich ist Oh,
wir haben ein kleines Problem, weil wir keinen
Verweis auf den Spawner haben Also lass uns einen von denen besorgen. Also gut, Spater ist natürlich ein Knoten Und wir werden das alles
auskommentieren, damit wir die Variable Lautes Schreien tatsächlich zuordnen
können Da haben wir's. Okay, Spanor Bum. Jetzt haben wir Spawner Jetzt können wir
zurückgehen und das machen. Spieler ist Spawner Dot ebenbürtig. Also haben wir tatsächlich
einen
Klassennamen festgelegt , oder? Ja, das haben wir. Gehen wir also
zurück
zum Spielskript ,
damit wir Autocomplete verwenden können Spawner ist kein Knoten. Spawner ist ein Spawner. Okay, jetzt gehen wir wieder runter, Spawner Spawner
Spawn Player Spawn Und sobald wir
den Spielertank haben, können
wir all
ihre Signale hier oben verbinden Wir müssen also das Etikett
der Spielerpanzer nicht ändern. haben wir bereits getan
, aber wir
müssen diese drei Methoden miteinander verbinden. In Ordnung. Und jetzt sollten wir
, wenn das Spiel beginnt, in der Lage sein, unseren Spieler
zu sehen Und das können wir nicht. Das liegt also daran, dass unser
Spawnpunkt Null ist,
was bedeutet, dass etwas
schief gelaufen ist, als ich versucht habe, den Spawnpunkt
zu bekommen Schauen wir uns an, was ich hier falsch
gemacht habe. Bin in einem Moment zurück. Und die
Antwort war natürlich, dass ich
den falschen Namen für den
NavPoints-Knoten in der Arena hatte den falschen Namen für den
NavPoints-Knoten in der Arena In meinem ursprünglichen
Entwurf des Spiels hatte
ich es also NavPoints genannt Also war da natürlich
mein Gehirn. Aber in dieser Version hatte ich es für die Lektion Path-Knoten
genannt. Also habe ich den
Knoten einfach umbenannt und das Leben war gut. Also haben wir noch eine Sache
, die wir hier in
GameStart tun müssen, um zu verhindern, dass das Spiel
abstürzt und wütend auf GameStart tun müssen, um zu verhindern, dass das Spiel uns
wird Und das ist
natürlich das Einrichten
des Ziels unserer Spionage-Kamera,
denn wenn ihr euch
erinnert, verwendet unsere Minimap eine Sekundärkamera, die an den Spieler
angeschlossen ist Da wir also den
Spieler aus der Szene entfernt
haben, müssen wir ihn
wieder zur Spy Cam hinzufügen Die Spy Cam
ist also , dass wir
keinen Verweis auf die Spy Cam haben,
weil wir sie noch nie
gebraucht haben, also fügen wir auch eine
davon hinzu. Und falls Sie sich am
Kopf kratzen und sich fragen: Hey, ist es wirklich so üblich,
so viele Exporte in einer
Klasse zu haben ? Ja, ja, das ist es. In einigen der letzten
professionellen Studios , in denen ich gearbeitet habe und
die Godot verwendet Oh, Sie wären
überrascht, wie viele Exporte wir hatten,
vor allem, wenn es um
Benutzeroberflächen ging Das war zu Zeiten von Godot Three Dot O, als es nicht
möglich war , Drag & Drop zu ziehen Also, obwohl wir die
exportierbaren Variablen hatten, mussten
wir immer noch GetObject
machen basierend auf einem Knoten darüber Also war es eigentlich noch schlimmer. Es gibt andere Möglichkeiten, direkt
auf Knoten zuzugreifen, z. B. über den eindeutigen Namen. In der Praxis habe ich jedoch festgestellt , dass eindeutige Namen
meistens kaputt gehen. Das ist die zuverlässigste Methode , um ein Objekt zu finden, unabhängig
davon, wo es sich gerade befindet, denn vor allem, wenn
Sie Ihre Hierarchie
entwickeln , werden Sie
Ihre Objekte häufig verschieben. Daher ist es normalerweise nicht gut,
Objektpfade zu verwenden , wie wir
es
bei der Spawn-Methode tun ,
um das Objekt abzurufen,
weil
Objektreferenzen aktualisiert werden wenn sich das Objekt bewegt,
fest codierte Pfade jedoch nicht In der Regel geht es also um das
richtige Tool für den richtigen Job. Wie dem auch sei, unsere Spionin Cam und ich haben
der Spicam nie wirklich einen Klassennamen gegeben Los geht's. Spiel. Spionage-Kamera. Spiel. Oh, natürlich, jetzt, wo wir
einen Fehler haben,
wird es ein Problem sein? Nun ja, es wird
ein Problem sein. Ordnung, lassen Sie mich das Projekt
neu laden und ich bin in einer Sekunde zurück Okay, durch die Magie der Nachbearbeitung sind
wir jetzt zurück Jetzt gehen wir zurück zum
UI-Subview-Port-Container SpyCam. Wir ziehen das
hierher, sodass wir
unsere SpyCam haben und diese jetzt
entfernen können Und dann, nachdem der
Spieler hinzugefügt wurde, entspricht
SpyCamt Target dem Spieler, und jetzt sollte aus
Spielersicht alles in Ordnung sein aus
Spielersicht alles in Ordnung Und das ist es auch. Wir haben einen Spieler. Ich bin mir jedoch nicht sicher,
ob der Spieler tatsächlich dort spawnt
, wo er sein sollte Okay, also fing ich an diese beiden Objekte anzusehen. Nun,
es gibt eine Möglichkeit, das herauszufinden. Wenn ich mich rundum drehe, kann
ich sehen, ob ich mich tatsächlich
an der Ecke der Karte befinde, und es sieht nicht so aus, als ob ich es bin. Es sieht so aus, als ob ich mich in
der Mitte der Karte befinde. Gehen wir also zurück in die Arena
und wir werden noch einmal überprüfen, wo sich unser Spieler-Spawn gerade Und wir haben es dort hingestellt. Überprüfe die Transformation. Okay, lass uns zurück
zum Spawner gehen. Und statt einer Position werden
wir es in eine
globale Position bringen Dies könnte einer der Fälle sein,
in denen es tatsächlich darauf ankommt. Oh, ich verstehe das Problem. Die globale Position des Spielers
entspricht der Spielerposition. Es ist wie es selbst geformt,
wie Shakespeare sagen würde. Wir wollen die Position des Spawnpunkts zusätzlich zur Drehung des
Spawnpunkts Das sollte das Problem lösen. ist viel besser. Jetzt sind die Spieler tatsächlich am Rand
der Karte, wo sie hingehören. Sieht aber so aus, als würden sie in
die falsche Richtung schauen. In Ordnung, spiel deinen Spawn. Gelbe Rotation. Wir
wollen es so haben. Es ist wahrscheinlich eine Frage der Tatsache, dass die
Y-Rotation in diese Richtung verläuft, der Tank sich
aber seitwärts
gedreht hat Also werden wir
den Tank einfach in die
entgegengesetzte Richtung drehen den Tank einfach in die
entgegengesetzte Richtung Wir könnten auch das
Vorzeichen der Rotation umdrehen. Äh, okay. Ich weiß nicht
, warum das nicht funktioniert. Lass es auf Null stehen, sagen wir, 180. Okay, das ist besser. Wie dem auch sei, du verstehst es. Du kannst Daten zum Spawn
des Spielers hinzufügen Spawn
des Spielers um zu ändern, wie
der Spieler spawnt Jetzt macht der Spieler
also sein Ding. Es kann wieder Granaten abfeuern. Aber wo wir gerade
vom Abfeuern von Granaten sprechen, müssen
wir eine Sache ändern, und das ist, wenn
die Granate abgefeuert wird, fügen
wir sie immer noch dem Spiel hinzu, und das
wollen wir nicht tun. Wir wollen es zu
Playfield hinzufügen . Und das
Spielfeld des Spiels heißt Oh, wir haben es nicht getan. Uh huh Wir haben keinen Hinweis auf
das Spielfeld hinzugefügt. Technisch gesehen brauchen wir das nicht
, da wir bereits wissen , dass das Spielfeld unter dem Spiel
existiert, also können wir einfach Gende machen Auf dem Spielfeld klicken Sie auf Kind hinzufügen und fügen Sie dann hinzu, dass
der Shell
die richtige Stelle zugewiesen wird der Shell
die richtige Stelle Sie könnten aber
natürlich auch
eine Variable vom Typ Knoten exportieren eine Variable vom Typ Knoten und dann das
Spielfeld dorthin ziehen In der Tat
wäre das etwas besser. Es wäre effizienter,
weil es immer noch einen
gewissen Overhead gibt , wenn Sie Node
bekommen. Also werden wir das tun. O. Okay. Und das ist
das falsche Drehbuch. Da haben wir's. Jetzt müssen wir
die feindlichen Panzer spawnen Um das zu tun, müssen
wir wissen wie viele Panzer wir spawnen müssen Und wenn ihr euch erinnert, haben wir in unserem Startmenü eine Spinbox für so etwas
eingerichtet unserem Startmenü eine Spinbox für so etwas Genau hier. Also müssen wir
die Spinbox verbinden,
und das tun wir, indem wir
unter den HBox-Container gehen Und aus diesem Grund müssen
Sie Ihre Knoten
intelligenter kennzeichnen Also werde ich das tun. Also die Spinbox, wann immer
Sie den Wert in
der Drehbox ändern , entweder indem ihn
direkt eingeben
oder die Pfeile verwenden, gibt
sie ein Signal ab, das als Wert geändert bezeichnet wird Also wollen wir das verbinden und wir werden es mit unserem Startmenü
verbinden Und wir wollen, dass dieser Wert im Grunde überall hingehört, wo
er hingehört. Also werden wir in unserem Messenger
ein weiteres Signal bereitstellen . Aber das ist ein bisschen zu ausführlich Okay, und natürlich müssen
wir
demjenigen, der
eine Verbindung
zu diesem Signal herstellt
, einen Wert für den Betrag angeben herstellt
, einen Wert für den Betrag , um den es sich geändert hat demjenigen, der
eine Verbindung
zu diesem Signal Also gehen wir in unserem Startmenü
hier runter und sagen Messenger, und die Anzahl der Spas
hat sich geändert und wir geben
den Wert ein, der
an die Methode übergeben wird. Und das haben wir falsch gemacht.
Es ist tatsächlich emittiert, was ich nicht
buchstabieren kann. Da haben wir's. Okay, jeder, der sich darum kümmern
muss, ob sich die Anzahl
der gegnerischen Spawns
geändert hat oder nicht Anzahl
der gegnerischen Spawns
geändert hat , wird diese Nachricht
abonnieren Und dazu
gehört natürlich auch unser Spawner. Also bereit, hat sich die Anzahl der Spawns von
Messenger-Punkten für Feinde geändert .
Verbinde dich Und dies ist ein weiterer Fall, in
dem die Funktion so klein ist
, dass wir ein Lambda verwenden können Also sagen wir einfach, dass die
Menge an feindlichen Panzern gleich Und das bedeutet, dass der Spawner, wann immer
sich
dieser Wert ändert, davon erfährt Also, wann immer wir feindliche Panzer
spawnen, müssen wir als Erstes zwei Variablen angeben Eine davon wird für den feindlichen Panzer sein ,
den
wir gespawnt haben Und das wird natürlich
ein KI-Panzer sein. Und dann
benötigen wir auch eine Spawnpunkt-Variable. Und wir werden
eine Spawnpunkt-Variable benötigen weil jeder Panzer
zufällig einem Spawnpunkt auf
der Karte zugewiesen wird ,
außer dem Punkt des Spielers Nun wäre es eine gute
Idee, diesen Wert zwischenzuspeichern. Und damit meine ich, dass wir das Array sowieso duplizieren müssen, aber wir müssen das Array nicht zweimal
abrufen, obwohl es nur einmal gleichzeitig gemacht wird
,
also ist es nicht superineffizient, wenn wir es nicht tun, ja, lassen Sie uns es einfach hier platzieren Und Spawnpunkte werden ein Array von Knoten drei Und es wird unser
Spielfeld-Terrain sein. Werde ein Elternteil Warte, nein, übernimm nicht die Eltern, denn Spielfeld-Terrain ist eigentlich die Arena, in der sich die
Nav-Punkte direkt befinden Ja. Also, was wir tun
werden, ist Node-NAV-Punkte zu sammeln. Und wir wollen
den NavPoints-Knoten selbst nicht bekommen. Was wir wollen,
sind seine untergeordneten Elemente, also ein Array, das
all diese NavPoints enthält Wir wollen also, dass
Kinder doppelt vorhanden sind. Und der Grund, warum wir es
duplizieren
wollen, ist, dass wir die
Liste, die wir erhalten, ändern wollen, und das wird gleich
klar sein. Und wir können hier wahrscheinlich
auch eine Prognose als Array Node Three D erstellen, nicht dass das wirklich wichtig wäre,
aber es sollte in Ordnung sein Okay, und wir müssen
auch das bereitstellen, was ich
den
Rückruf nenne Ich weiß nicht, ob das technisch gesehen als Rückruf
gilt, aber es ist im Grunde
eine Methode, die wir an
jeden feindlichen Panzer anhängen
müssen, und das ist
natürlich die
Granatenabfeuer-Methode aus unserem Spiel Wenn ihr euch erinnert, gehen wir hier hoch,
jeder gegnerische Panzer, der spawnt, oder zumindest der gegnerische Panzer, den wir spawnen
, musste der
Onsel-Feuer-Methode des Spiels
verbinden Zum Glück für uns sind Funktionen
in Godot also Objekte,
und zwar Objekte vom Typ Callable Wir können die
Funktion also direkt hier übergeben. Also nennen wir es einfach
Shell-Handler, ich denke, Shell-Handler vom Typ Callable und jetzt können wir das richtig
verbinden Ordnung, wir haben also
unsere Spawnpunkte und wir haben unsere Also das Erste, was
wir tun werden, und wir könnten es tatsächlich auf eine etwas andere Art
machen eine etwas andere Es wäre vielleicht etwas
effizienter, es so zu machen, aber wir werden
es trotzdem so machen. Bevor wir die Panzer spawnen, wollen
wir sicherstellen, dass die wollen
wir sicherstellen, dass Anzahl der feindlichen Panzer,
die wir
spawnen
, geringer ist als die Anzahl der NavPoints auf
der Und wir hätten auch Maximalwert des Spinners begrenzen
sollen , weil er
derzeit auf sieben gesetzt ist Und ich meine, wir haben
mehr NavPoints als das,
aber was wäre, wenn wir eine Karte mit weniger NavPoints erstellen
würden Und wenn Sie zum Beispiel
ein Solo-Entwickler sind, ist
es einfach,
solche Dinge im Hinterkopf zu behalten, aber manchmal möchte man einfach
ein paar zusätzliche Schutzmaßnahmen Wahrscheinlich wäre es
eine gute Idee, sobald das Spiel
startet,
die Map abzufragen und diesen Wert dann
automatisch festzulegen Und je mehr ich darüber
nachdenke, desto mehr ist
das eine gute Idee. Schauen wir uns an, wie
schnell das erledigt werden könnte. Wir haben bereits
unser Startmenü. Wir haben schon unseren Spawner. Also ja, lass uns das hier machen. Oh ja, sie sind zugänglich,
weil
wir sonst Start hier
nicht anzeigen könnten. Gehen wir also hierher und stellen das Startmenü ein. Und wir müssen
den richtigen Knoten finden. Also brauchen wir den Pfad zum Knoten, und das
wissen wir nicht. Also, wenn wir unter Spiel, Startmenü, Drehfeld rechten Maustaste klicken, wo ist es? Kopiert den Knotenpfad. So können wir das
Startmenü entfernen , weil wir
dort beginnen. Startmenü, Spinbox und
der Maximalwert der Spin-Boxen. Die Eigenschaft heißt
Underscore Max Lassen Sie uns also einfach den
Maximalwert gleich dem Punkt auf dem Spielfeld mit dem Punkt
, an dem der Knoten angezeigt wird Spielfeld mit dem Punkt
, an , entspricht. Setze es jemals in Anführungszeichen. Ich lasse Punkte zählen ,
um Kinder zählen zu lassen, weil
ich die Anzahl minus eins für
den Spielerknoten angeben werde, weil wir nicht wollen, dass wir auf dem Spielerknoten
spawnen können Das ist also ein langer und
hässlicher Code. Du solltest
das wahrscheinlich nicht in einem echten Spiel machen, aber nur um die Dinge
hier
mit minimalem Aufwand
zum Laufen die Dinge
hier
mit minimalem Aufwand zu bringen, werden wir es so
machen. Also zurück in unserem Spawner haben
wir einen Fehler.
Was ist unser Fehler? Das ist unser Fehler, weil wir diese Zeile
noch nicht fertig gestellt haben. Lassen Sie uns
zunächst
sicherstellen, dass das tatsächlich funktioniert. Und natürlich wird
Child Count auf einen Nullwert gesetzt. Spielfeldarena. Nav-Punkte Das Problem ist, dass wir hier einen redundanten Pfad
haben. Wir müssen nicht mit dem Spielfeld
beginnen weil wir auf dem Spielfeld sind Wir brauchen nur
Ana Nav-Punkte. Jetzt sollte das funktionieren.
Und da sind wir. Jetzt sollten wir also in der Lage sein, dies auf zehn
zu ändern, was der Anzahl der
NapPoints entspricht, die wir haben Perfekt. Jetzt
werden wir nie mehr darüber hinausgehen, was bedeutet, dass
wir im Spawner diese Linie ignorieren können.
Wir werden es nicht brauchen Und nur damit wir das bestätigen
können, werden
wir das vorerst hier
reinstellen. Also wollen wir die Anzahl der
feindlichen Panzer, die
wir spawnen werden,
durchgehen feindlichen Panzer, die
wir spawnen werden,
durchgehen Also werden wir das mit Tank
machen. Wir werden eine Viererschleife
definieren. Die Variable
heißt Tankindex, und sie ist in und es gibt eine sehr praktische
Funktion namens range. Und wenn wir den Wert angeben, wir eine singuläre
Menge als Wert geben
wir eine singuläre
Menge als Wert an.
Dadurch erhalten wir eine
Reihe von Zahlen von
Null bis zu dieser Zahl minus Eins,
was unglaublich nützlich ist,
um Arrays Null bis zu dieser Zahl minus Eins, zu durchlaufen Wenn unsere feindlichen Panzer also
tatsächlich 11 sind, wird uns die
Reichweite Null bis Zehn
geben, was genau
das ist, was Oder zumindest nah genug. Es ist die richtige Anzahl von Werten. Der gegnerische Panzer ist also gleich, und das ist dasselbe
, was wir für den Spieler getan haben. Also instanziieren feindliche Panzer
nicht. Als KI-Panzer. Und natürlich musst
du
das Wort Als richtig buchstabieren. Ich glaube, das ist ein neuer Rekord für mich, ein Wort aus
zwei Buchstaben falsch Hallo. Nun, deshalb bin
ich Informatiker und
kein Englischlehrer. In Ordnung. Und sobald wir
einen feindlichen Panzer haben, müssen wir
einige seiner Details festlegen Und diese
Details sind natürlich der Name, der Knotenname und
der Spawnpunkt Und da wir schon
einen Hinweis auf das
Spielfeld haben , ja, okay Also als absolutes Minimum können
wir einfach sagen, Spielfeld-Terrain
spielen, Eltern
bekommen, feindliche
Kinder hinzufügen , und
das wäre großartig Aber das ist nicht genug. Also das Erste, was wir
tun müssen,
ist natürlich, dass wir
das Granatensignal an
unseren Anruf anhängen müssen und dann
müssen wir den feindlichen Panzer umbenennen. Der Punktname des feindlichen Panzers ist gleich. Und mit diesem Token werden wir es feindliches U-Boot
oder Feind
nennen . Und natürlich haben wir
in einer früheren Lektion gesehen , dass wir
mit diesem Token Zeichenketten ersetzen können. Da wir also versuchen, es
durch eine Zahl zu ersetzen
, sollte es eigentlich auch ohne Zeichenkettenumwandlung
funktionieren. Lass es uns versuchen. Und
die Zahl der Feinde ist einfach Panzerindex plus eins, weil wir wollen, dass
sie von eins
bis was auch immer sind und nicht
Null bis was auch immer. Und dann werden wir dasselbe für Nun
tun, also den feindlichen Panzer
nennen wir damit feindlichen Panzer. Aber der Anzeigename Wir werden nur die Nummer des Feindes sein. Und die sind willkürlich. Ich entscheide
nur, dass es
das ist, was es ist. Du kannst sie machen, was immer
du willst. Und jetzt müssen wir
natürlich einen Spawnpunkt
finden Aber bevor wir das tun,
wäre es tatsächlich etwas effizienter oder
zumindest, glaube ich,
weniger kompliziert, weil der Spawner und das Spielfeld oder
das Spielfeld-Terrain exakt dasselbe Elternteil
haben,
also können wir einfach sagen, hol dir Okay, jetzt, wo
der Panzer dem Spielfeld
hinzugefügt wurde , können
wir einen Spawnpunkt Und wenn der Panzer
zum ersten Mal in der Welt erscheint, entspricht
seine Position natürlich dem Vektorpunkt Null, einer Konstante, die anzeigt,
dass der Vektor
Null, Null, Null ist Also, solange
das der Fall ist. Solange also die Position
des Feindes und des feindlichen Panzers dem Vektor 30 entspricht, bedeutet das, dass er nicht zugewiesen ist Und was wir
hier tun wollen, ist, dass wir so neue Spawnpunkte
auswählen wollen,
bis wir einen gültigen haben Und der
Spawnpunkt ist nur dann nicht gültig, wenn es sich um den Spawnpunkt
des Spielers handelt Also, Spawnpunkt Hoppla. Curt Fluch, du vervollständigst es automatisch. Spawnpunkt entspricht, und wir haben bereits
unser Spawnpunkte-Array Es entspricht also
Spawnpunkten mit dem Index einer Zufallszahl von
Null bis zur Größe der
Spawnpunkte Das gibt uns also einen beliebigen
Index von Null bis zum Ende
des
Spawnpunkts, weil das Maximum der Spawnpunkte
oder der maximale Index eines Arrays immer gleich
seiner Größe minus eins
ist Sobald wir also einen
Spawnpunktsatz haben, wollen
wir ihn aus
dem Spawnpunkt-Array entfernen , weil
wir ihn bereits ausgewählt haben Also sagen wir einfach
Spawnpunkte, Spawnpunkt löschen. Wir wollen es löschen, unabhängig davon, ob es gültig ist oder nicht,
denn da wir
bereits auf der Suche nach den Panzern sind, werden wir,
nachdem wir diesen
Spawnpunkt für Panzer festgelegt
haben, wieder zum Anfang
zurückkehren, einen neuen Panzer
erstellen
und dann aus den verbleibenden Spawnpunkten
auswählen wollen verbleibenden Spawnpunkten
auswählen Und den, den wir gerade ausgewählt haben, wollen wir nicht mit
einbeziehen. Wenn wir also immer
den Spawnpunkt löschen , den
wir gerade ausgewählt haben, werden wir nie einen doppelten Spawnpunkt
bekommen diesem Grund haben wir das
G-Childr-Array des NavPoints-Knotens dupliziert G-Childr-Array des NavPoints-Knotens , weil wir Dinge daraus
löschen werden Und wenn wir das
ursprüngliche Array
der ursprünglichen untergeordneten Elemente verwenden würden, würden wir Punkte von
NavPoints aus unserer Map
löschen , und das wollen
wir nicht tun also für
so etwas immer Arbeiten Sie also für
so etwas immer an einer doppelten Kopie Also Spawnpunkte löschen. Und wir wollen den
Spawnpunkt überprüfen, ob der Name des Spawnpunkts
dem Startpunkt des Spielers
entspricht,
denn ob es der
Spawnpunkt ist
oder war, kann ich mich nicht erinnern Lass uns nachschauen. Spieler spawnen Uh, man sagt, das Gedächtnis ist das Erste, was verloren
geht, wenn man alt Zumindest glaube ich, dass
sie das tun. Ich vergesse es. Okay, also wenn der Name
des
Spawnpunkts nicht dem Spawn des Spielers entspricht,
dann machen wir, dann machen wir des feindlichen Panzers der Position des
Spawnpunkts
entspricht Und das sollte uns genügen.
Lass uns einen Blick darauf werfen. Nun, eigentlich nein.
Wir werden das nicht testen können, weil
wir
zu Beginn des Spiels keine Panzer
spawnen Also müssen wir zurück zum Spiel gehen. Und jetzt, da damit befasst
haben, können
wir sie entfernen. Und dann gehen wir
zurück zum Startspiel. Also haben wir unseren Spieler hervorgebracht. Wir haben unsere Spionagekamera installiert. Jetzt müssen wir dem
Spawner sagen, dass er feindliche Panzer spawnen soll, und wir müssen die Funktion, die
wir anhängen wollen, übergeben , die natürlich
auf Granaten abgefeuert wird Und jetzt sollten wir in der Lage sein eine
bestimmte Anzahl von
Panzern in unserer Welt erscheinen zu Fangen wir mit zwei an
und wir haben einen Fehler. Ordnung. Ich
versuche, Typ zuzuweisen ,
bla, bla, tippen Sie Oh, okay Das Problem dabei ist also , dass versucht wird, einer Variablen vom Typ Knoten drei D
einen Typ von
Array-Knoten zuzuweisen . Wir haben unser
Spawnpunkt-Array als Knoten drei D
angegeben, aber aufgrund der
Magie des Polymorphismus versucht
es tatsächlich, einen Knoten zurückzugeben, und Sie können nicht nur
nach und Sie können Wenn wir das also so ändern,
dass wir nicht
sagen müssen, dass es ein Knoten drei D ist, können
wir das entfernen und
wir ändern es einfach Knoten Now, versuchen wir es noch einmal. Spawnen Sie zwei Panzer, starten Sie
das Spiel. In Ordnung. Wir haben einen Spieler und
wir haben zwei Panzer. Und natürlich bewegen sie sich
individuell. Und wie Sie sehen können, kümmert
sich Godot für sie um die
Physik Sie müssen sich also nicht einmal
Sorgen machen , dass sie
umeinander herumlenken, auch wenn sie
beide versuchen,
es gleichzeitig zu tun ,
sie einfach kollidieren werden Wir haben also ein funktionierendes Spiel. Das einzige, was uns fehlt, ist ein Spiel
über den Zustand, eine Gewinnbedingung für den Spieler. Das ist also wirklich einfach und schnell hinzuzufügen, wenn man bedenkt
, was wir bereits eingerichtet haben. Ich fordere Sie auf, dies als Ergänzung
zu dieser Lektion zu tun. Aber Sie machen eine Pause, wenn Sie
möchten, halten das Video an, probieren es selbst aus und schauen Sie sich dann das Video
weiter an, und ich zeige Ihnen, wie ich es gemacht habe. Ordnung. Aber bevor
ich darauf eingehe, haben
wir einen ziemlich großen
Bug, der
behoben werden muss, es sei denn, du magst es, dass dein
Spiel wirklich herausfordernd ist Wenn ihr also bemerkt oder vielleicht
bemerkt habt , dass ihr damit
herumspielt, wenn ihr ein Spiel startet und dann sterbt
und dann ein anderes Spiel startet, werden mehr Panzer
spawnen, werden mehr Panzer als ihr
gesagt habt, dass sie spawnen sollen Und das liegt daran, dass keines
der Objekte aus dem
vorherigen Spiel vom Spawner
entfernt wird , bevor
wir das Spiel tatsächlich starten Also der schnellste Weg, das zu tun , und wir können entweder vom Sponsor machen lassen
oder wir können es vom Spiel machen lassen Wir können es einfach im Spiel machen.
Das ist einfach genug. Also all unsere Objekte, all unsere Panzer werden
am Spielfeld befestigt Also wollen wir durch
das Spielfeld gehen . Und
das wollen wir nicht tun Also vier Kinder auf dem
Spielfeld. Holt Kinder. Dies wird
alle Kinder des Spielfeldes durchlaufen und es in
das variable Kind einfügen , damit
wir etwas damit machen können Und alles, was wir tun müssen,
ist zu sehen, ob das Kind zu der
verkaufbaren Gruppe gehört, weil wir alle
Objekte, die aus
dem Spiel entfernt werden
können , dieser Gruppe zuordnen, da
sie zerstört werden können Also, wenn Child Dot in der Gruppe Shellable Child Dot Free Und das sollte unser Problem
lösen. Ordnung. Nun, lassen Sie uns
unser Spiel unter bestimmten Bedingungen einrichten. Das Erste, was
wir tun müssen, ist die Anzahl
der getöteten
Panzer
im Vergleich zur Anzahl der noch verbleibenden
Panzer im Auge zu behalten getöteten
Panzer
im Vergleich zur Anzahl der . Und der schnellste und einfachste Weg , das
zu tun, besteht darin, zur Benutzeroberfläche zurückzukehren , da die Benutzeroberfläche bereits Anzahl der Kills verfolgt Alles, was wir tun müssen, ist also auch den
Wert des Spawners im Auge zu behalten Und der einfachste Weg
, dies zu tun, besteht darin,
eine weitere Variable namens
Kill Count Target hinzuzufügen eine weitere Variable namens
Kill Count Was auch eine Ganzzahl ist. Und da wir bereits
ein Signal eingerichtet haben, können
wir einfach überwachen, können
wir einfach überwachen ob sich die
Anzahl der gegnerischen Spawns geändert hat Und wieder können wir eine Lambda-Funktion
verwenden,
die einfach sagt, dass das Ziel der
Killanzahl der neuen
Menge entspricht Und jetzt wollen
wir jedes Mal, wenn
sich die Anzahl der Kills ändert, diesen Wert überprüfen Und wenn die Anzahl der Kills diesem
Zielwert
entspricht, dann haben wir gewonnen. Offensichtlich werden wir das gleich
ändern. Aber das nächste, was
wir natürlich tun müssen,
ist, dass ist Spieler,
der gewonnen hat,
einen Game-Over-Status erhält, und wir müssen auch in der Lage sein, dem Spieler zu melden
, dass er gewonnen hat. Also werden wir die Dinge ein wenig ändern
. Wir haben auch einen alten Bug. Lass
mich sehen, ob ich ihn finden kann. Das Problem dabei ist also, dass
jedes Mal, wenn ein Panzer getroffen wird, egal ob er
zerstört wurde oder nicht, egal ob er
zerstört wurde oder nicht,
er das Signal sendet, dass der gegnerische
Panzer zerstört wurde. Das ist schlecht, weil
das bedeutet, dass man einfach
weiter Kills erzielen kann , indem man auf denselben Panzer
schießt Wenn wir also zu unserer Granate zurückkehren, wenn der Körper in der Gruppe
beschallbar ist und der Körper nicht zerstört wurde, dann können
wir Treffer nennen Um anzuzeigen, dass die
Granate den Panzer getroffen hat. Ich meine, es trifft trotzdem. Ich glaube, das ist
eine falsche Bezeichnung. Es prüft bereits und
feuert, ob es eine Kollision gibt. Es ist nur so, das ist
32. Wechselnde Kameraperspektiven: Mm. Willkommen zurück. Wir werden uns mit der Entwicklung
eines dynamischen Kamerasystems befassen, oder ich denke, der bessere Weg wäre ein
Mehrkamerasystem. Jetzt sind wir also an einem
Punkt angelangt, an dem wir unsere Panzerfunktionalität so weit
erweitert haben unsere Panzerfunktionalität so weit
erweitert dass ein einfacher
Panzer nicht mehr
ausreicht weil wir unserem Panzer ein
Kamerasystem hinzufügen wollen , aber wir wollen
es nicht dem feindlichen Panzer hinzufügen , der vom Panzer abgeleitet ist. Also müssen wir
eine neue geerbte Szene erstellen, und wir werden von
Tank erben und wir werden
diese speichern, und wir sie
Spielertank nennen
und Spielertank ist, nun ja, wir müssen zurück
zu unserem Spawner gehen und unsere Spielerpanzer-Prefab
aktualisieren, um jetzt
tatsächlich Spielerpanzer
statt Panzer zu verwenden. Und im Moment
wird sich nichts ändern,
weil es sich um exakt dieselbe Klasse handelt Aber im Spielertank wollen
wir ein Kamera-System hinzufügen. Wir haben also unsere bestehende Kamera Three D, aber wir wollen mehr. Also gehen wir zurück und ändern, oder besser gesagt,
wir fügen einen Knoten hinzu, und das wird ein Knoten drei D
sein Wir werden ihn nennen.
Kameras. Und wir werden die
bestehende Kamera unter die Kameras stellen, und das wird nicht funktionieren. Und dafür gibt es einen
Grund. Also werden wir hier einfach
direkt
zusätzliche Kameras hinzufügen, anstatt uns darum zu
kümmern , es schick zu machen
und ein zusätzliches Rig hinzuzufügen. Kann ich die Kamera umbenennen? Nein. Okay. Und das alles ergibt Sinn. Sie wollen nicht, Sie können
eigentlich keine der
zugrunde liegenden Informationen
des Knotens ändern . Also das ist in Ordnung. Also werden wir einfach ein
paar zusätzliche Kameras hinzufügen. Nun, ich füge noch eine Kamera hinzu, drei D. Und dieser eine Name
gibt ihr einen Namen, oder besser gesagt, wir geben einen
zusätzlichen Index zwei. Also haben wir Kamera drei D zwei
und Kamera drei D drei. Also Kamera drei D zwei, ich
wollte schon immer eine Kamera auf
dem Turm haben, damit man sehen kann, wo sich
die Kamera tatsächlich dreht, obwohl uns das nicht wirklich
nützen wird, oder? Eigentlich nein, wir können die
Kamera dem Turm zuordnen Das haben wir vorhin mit dem
Marker Three D gemacht. Also füge dort Kamera drei D hinzu. Und dann werden wir sicherstellen, dass es in die richtige Richtung
zeigt. Ja, das sieht gut aus. Vorschau.
Oh, es ist verkehrt herum Und fürs Protokoll,
das ist der lila Pfeil, der dir die richtige
Ausrichtung des Panzers
zeigt In diesem Fall wollen
wir es also auf Null haben. Und jetzt können wir unseren
Turm auf unserem Turm sehen. Und wir wollen, dass der dritte ist, sagen
wir, nun, es ist in
Ordnung, wo er ist Es ist eine nach hinten gerichtete Kamera. Und
weißt du was? Wir können hinzufügen also müssen wir das etwas
anders
machen als ich es
ursprünglich geplant habe. Aber lassen Sie uns
statt eines Knotens drei D einen Knoten hinzufügen, und das wird ein Kamera-Rig sein. Und es wird buchstäblich
nur
ein Skript mit Verweisen
auf unsere vorhandenen Kameras haben . Und jetzt
erstellen wir keinen neuen Knoten. Wir fügen ein
Skript hinzu. Und wir werden Autokameras exportieren. Und Kameras werden
eine Anordnung von drei Kamera-Ds sein. Und ja, es hilft, wenn du nicht deine eigene
dumme kleine Notation hinzufügst Okay, jetzt haben wir ein Array und können
die Größe des Arrays angeben Also haben wir insgesamt drei
Kameras. Eins, zwei, drei. Und jetzt können wir
die Verweise auf
unsere vorhandenen Kameras
in dieses Array ziehen . Und alles, was wir brauchen, ist eine einzige Methode, die
unbehandelte Tasteneingaben verarbeitet Und wir werden überprüfen, ob
die eine, zwei oder drei Tasten gedrückt
wurden Und wenn ja, dann wechseln
wir zur
richtigen Kamera. Ist die physische Taste
gedrückt. Taste eins. Und wir werden eine Methode
namens Switch to Camera
erstellen namens Switch to Camera und ihr
den richtigen Index geben. In diesem Fall können
wir sie also so nennen, dass wir
denselben Index wie die Kamera verwenden können, aber wir
müssen
die Indizes ändern , weil sie
um eins ausgeschaltet sein werden. Und dann machen wir einfach etwas anderes. Mm. Eigentlich sollten wir hier
mit einem LF anfangen. F. In Ordnung. L F. Kamera eins, Kamera zwei, Kamera
drei, Kamera drei. Und da ist ein
überflüssiges Ich drin. Löschen. In Ordnung. Und natürlich müssen
wir nicht zur
Kamera wechseln. Also Funk Hoppla Und das ist ziemlich
einfach. Alles, was wir tun müssen, ist
Kameraindex minus
Eins
zu sagen Kameraindex minus , weil wir damit kompensieren müssen , dass
die
Indizes bei Null beginnen, aber wir beginnen hier bei Eins, und wir könnten diesen Wert genauso
gut auf Null setzen. Ich meine, richtig, warum nicht? Ich glaube
, das ist weniger verwirrend. Okay. Aktuell ist gleich wahr. Und da Godot sich nur um die letzte Kamera
kümmert , die auf aktuell eingestellt
wurde, sollten wir uns
keine Gedanken darüber machen müssen , welche Kamera aktuell ist Mal sehen, ob das
tatsächlich funktioniert. Und wenn nicht, werden
wir einige Änderungen vornehmen. Game Player Und da hast du's. Wir haben jetzt ein
Mehrkamerasystem. Und das war wirklich einfach. Okay, wir sind vorerst mit dem Programmieren
fertig, also lasst uns zum
nächsten Kapitel übergehen, und wir werden anfangen,
über grafische Upgrades zu sprechen. Wir werden uns die Materialien noch
einmal ansehen und uns Meshes und all
die anderen guten Wir sehen uns dort.
33. Bessere Explosionen mit Partikeleffekten: Willkommen zurück. In dieser Lektion werden
wir die Tatsache korrigieren
, dass ein Panzer, wenn er abgeschossen
wird, einfach stehenbleibt.
Es liegt einfach da. Es macht Geräusche und
es ist wirklich langweilig. Also werden wir die Explosionen
unserer Panzer mit
einigen Partikelsystemen aufpeppen Explosionen
unserer Panzer mit
einigen Partikelsystemen Das
Tolle an Partikelsystemen ist, dass sie oberflächlich betrachtet kompliziert
aussehen, aber sobald Sie ein oder
zwei nette kleine
Tricks über sie gelernt haben, können Sie im Grunde nach Herzenslust mit
ihnen spielen ohne wirklich zu
verstehen was die meisten
Funktionen bewirken Und da alles in Echtzeit im
GadoEditor-Fenster
aktualisiert wird , können
Sie im Grunde einfach
mit allen Einstellungen spielen, und wenn Sie
etwas bekommen, das Ihnen gefällt, können
Sie damit weitermachen. Ein Partikelsystem ist also ein Knoten, genau wie jeder andere
Knoten in Also werden wir eine neue Szene
hinzufügen. Wir
wählen einen anderen Knoten
und verwenden GPU-Partikel drei D. Nun gibt es einen Unterschied zwischen GPU-Partikeln
und CPU-Partikeln. GPU-Partikel werden
auf Ihrer
Grafikkarte in Ihrer GPU verarbeitet . CPU-Partikel werden
vom
Kernprozessor Ihres Computers verarbeitet . Der Unterschied
zwischen den beiden besteht darin, dass
GPU-Partikel auf einem System mit
3-D-Beschleunigung eine höhere Leistung bieten. Außerdem, und das
ist so etwas hinter
den Kulissen,
lässt
das Godot-Team CPU-Partikel im Grunde hinter sich, in dem Sinne
, dass sie ihnen keine Priorität vor GPU-Partikeln
einräumen Sie fügen also
keine neuen Funktionen hinzu,
aber sie sind bereit, die
Leute es auf die
Parität mit GPU-Partikeln bringen zu lassen auf die
Parität mit GPU-Partikeln bringen zu Sie also im Grunde
GPU-Partikel, es sei denn sie funktionieren einfach nicht auf der Hardware, auf die Sie
abzielen möchten Das ist eine gute Faustregel. Lassen Sie uns also eine neue
GPU mit drei D-Partikeln erstellen, und sie tut natürlich nichts. Weil wir eigentlich noch nichts
eingerichtet haben. Also die zwei wichtigsten
Dinge und du wirst ein wenig
sehen, du wirst eine Warnung
sehen und du wirst hier einen
Fehler sehen. Es besagt, dass nichts
sichtbar ist, weil Netze nicht den Ziehdurchgängen
zugewiesen wurden und kein Material für die Bearbeitung der
Partikel zugewiesen wurde, sodass kein Verhalten eingeprägt ist Das bedeutet, dass wir
diese beiden Dinge zuordnen
müssen ,
damit unsere Partikel überhaupt etwas
tun können Das erste, was wir
hinzufügen werden, sind die Draw-Pässe. Der Ziehvorgang,
und Sie müssen
mindestens einen hinzufügen , bestimmt
das Aussehen Ihrer Partikel. Also müssen wir ihm
irgendein neues Netz geben. Und wir werden texturierte
Bitmap-Partikel verwenden texturierte
Bitmap-Partikel Lassen Sie uns also ein Quad-Mesh verwenden. Und jetzt können Sie sehen, dass wir hier
tatsächlich ein Partikel haben. Eigentlich haben wir hier eine
Menge Partikel, aber da sie kein Verhalten zeigen, bewegen
sie sich nicht wirklich. Beachten Sie auch, dass ich das neu angeordnet habe. Ich habe in dieser Lektion zwei Dinge mit dem Projekt Ich habe es neu angeordnet, sodass wir eine Reihe von Unterordnern
haben.
Wir sind an dem
Punkt angelangt, an dem wir unserem Projekt viel mehr
Ressourcen
hinzufügen werden ,
und wir wollen nicht, dass alles unübersichtlich
wird Also habe ich alle
Schriften, Grafiken, Szenen
und
Soundeffekte in ihren eigenen Ordnern Soundeffekte in Apropos, ich habe dem ein paar
Partikeltexturen
hinzugefügt Projekt ein paar
Partikeltexturen
hinzugefügt,
die
Sie verwenden können, wenn Sie
Ihre eigenen Partikelsysteme erstellen. Diese sind alle kostenlos bei
opengameart.org oder Ken Dotn
erhältlich opengameart.org Es gibt andere Orte, an denen
Sie sie im Internet finden oder sogar
Ihre eigenen erstellen können im Internet finden oder sogar
Ihre eigenen erstellen Sobald wir auf den Pass
und das Mesh klicken und es erweitern, haben
wir jetzt die Möglichkeit, das Aussehen
zu ändern,
genauso wie wir es bei den anderen
Meshes tun würden, mit denen wir gearbeitet haben Wie Sie sehen können, können
wir sogar jede Art
von Mesh verwenden, die wir wollen Wenn wir also eine Schachtel oder
eine Kapsel oder was auch immer haben wollten, um unseren Partikeln ein noch mehr
dreidimensionales Aussehen zu verleihen , könnten
wir das tun. Aber wir werden uns für ein Quad-Mesh
entscheiden und dann müssen wir ein Material
bereitstellen, und wir sollten zu diesem
Zeitpunkt Experten darin sein. Also werden wir uns für
ein neues Standardmaterial entscheiden, und wir können es öffnen. Nun gibt es für ein Partikelmaterial
eine Reihe
zusätzlicher Einstellungen als für normale Materialien. Und es gibt auch ein
paar zusätzliche Schalter Wenn Sie sie nicht umdrehen, drei Viertel Ihrer
Partikelsystemeinstellungen funktionieren
drei Viertel Ihrer
Partikelsystemeinstellungen
nicht,
und Sie werden zwei oder drei Stunden damit verbringen, Ihren Kopf
gegen die Wand zu zwei oder drei Stunden damit verbringen, Ihren Kopf schlagen und
sich zu fragen, warum keine Ihrer Einstellungen vorgenommen wird Und ich
spreche definitiv nicht aus Erfahrung in
diesem Bereich Also, als erstes gehen
wir
natürlich zu Albedo und fügen eine unserer Texturen
hinzu Also werde ich Ihnen zeigen, wie man zwei verschiedene
Partikelsysteme
herstellt, ein explosives
und ein konstantes Und ich habe in diesem Projekt auch
das Partikelsystem zur Verfügung gestellt, das ich für den
Tank
erstellt und am Tank befestigt habe. Sie können also dieser Lektion
folgen um zu sehen, wie all
diese Einstellungen funktionieren, und dann können Sie versuchen
, Ihre eigenen zu erstellen, und dann können Sie sich auch die Einstellungen ,
die ich für den Tank
erstellt habe. Lektion werde ich euch auch zeigen,
wie man die Explosionen mit
den Skripten auslöst und das
GD-Skript benutzt auszulösen Am Ende der Lektion werde ich euch auch zeigen,
wie man die Explosionen mit
den Skripten auslöst und das
GD-Skript benutzt, um
die Explosionen Jetzt, wo wir wieder hier sind, brauchen
wir wieder eine Textur Also das wird
ein Feuer sein, ja, Art feurige Textur oder eher ein feuriges
Partikelsystem Also
verwenden wir die Textur
„Explosion oh acht“ und
bringen sie hierher Wie Sie sehen,
gibt es keine Transparenz, also müssen wir
Transparenz ermöglichen. Außerdem müssen wir die Scheitelpunktfarbe
erweitern und die Option Als Albedo verwenden anklicken und
aktivieren Und das ermöglicht es uns
, die Farben und die Transparenz und all
das
Gute an unserer Textur zu ändern Transparenz und all
das
Gute an unserer Und da es sich um
eine Drei-D-Textur handelt, wir
aber eine Textur verwenden, wir
aber eine Textur verwenden, können
Sie sehen, dass
die Textur beim
Drehen schräg wird und verschwindet weil sie auf
ein Objekt im Drei-D-Raum abgebildet ist Um das zu ändern, müssen
wir die Textur mit einem Billboard versehen
und dann Partikel-Billboard aktivieren Und das bedeutet, dass die Textur
immer zu uns zeigt,
egal in welcher Ausrichtung sich
die Kamera befindet Und in diesem Fall ist es
genau das, was wir wollen. Und wir brauchen auch gut, wir brauchen nicht, aber es
wäre eine gute Idee, auf „Skalierung beibehalten“ zu klicken, wenn wir die
Größe der Partikel ändern wollen, und
das tun wir höchstwahrscheinlich, dann wird das
auch möglich sein. Wenn nicht und wir eine der Maßstabskurven ändern
würden, würde
keine davon wirksam werden. In Ordnung, wir
haben also ein Material. Wir haben einen Pass. Jetzt gehen wir
zum Prozessmaterial. Das Prozessmaterial
bestimmt, was im Laufe der
Zeit tatsächlich mit den Partikeln passiert , und viele andere Dinge Wir brauchen also ein neues Material für die
Partikelverarbeitung. Jetzt, wo wir eines haben, können
Sie standardmäßig sehen, unsere Partikel spawnen
und nach unten fallen Und das liegt daran, dass
die Standardfunktionalität der
Partikelverarbeitung darin besteht, sie
einfach mit Schwerkraft zu belasten und Schluss zu machen.
Aber das wollen wir nicht Was wir
eigentlich wollen, sind ein paar Dinge. Gehen wir also zurück zum Abschnitt „Drei D“ der
GPU-Partikel und lassen die
Emission vorerst eingeschaltet. Aber was wir
irgendwann tun werden, ist einen Schuss
einzuschalten,
weil ein Schuss im Grunde bedeutet, dass eine
Gruppe von Partikeln emittiert wird, und dann ist
das alles. Das ist genau das, was wir für eine Explosion
wollen. Also schalten wir das vorerst aus, nur damit wir sehen können,
was vor sich geht. Dann haben wir das, was
man Explosivität nennt, und das ist genau das, was
auf der Dose steht Je explosiver es ist, desto schneller entstehen
die Partikel Und das ist
momentan ziemlich schwer zu erkennen, weil
sie wiederum alle mit
derselben Geschwindigkeit erscheinen und
alle von derselben Richtung
beeinflusst werden von derselben Richtung
beeinflusst Also lassen Sie uns die Anzahl
der Partikel auf etwa 25 erhöhen. Und Explosivität ist in Ordnung
und Zufälligkeit müssen wir uns keine Sorgen machen Zufälligkeit Wenn wir die Explosivität nicht
verwenden würden, würde der Zufall die
Zufälligkeit bestimmen, wie oft
die Partikel emittieren würden. wie oft
die Partikel emittieren würden. Wir müssen uns also nicht um
Kollisionen, Zeichnen oder Spuren kümmern Kollisionen Das sind ausgefallene Optionen , mit denen wir uns nicht befassen
werden. Normalerweise kollidieren
Partikel also nicht
mit der Umgebung Wenn Sie das möchten, müssten
Sie Ihrem Partikelsystem
einen speziellen Knoten hinzufügen , der
als GPU-Partikelbeschleuniger
bezeichnet wird , der
als GPU-Partikelbeschleuniger Und das hängt damit zusammen. Und wir müssen uns überhaupt nicht um das Zeichnen kümmern
. Eine der Eigenschaften von
Partikelsystemen ist also , dass
sie extrem nerdig sind
und es viele
Einstellungen gibt, die Sie nie
benötigen werden , wenn
Sie nicht absolut wissen, dass
Sie sie benötigen werden Wenn Sie sich also eine
bestimmte Einstellung ansehen, fragen Sie sich, warum sollte
ich sie jemals verwenden Dann musst du nicht.
Das ist großartig. Unter Prozessmaterial
können wir also damit beginnen, unsere Partikel dazu zu bringen, Dinge zu tun. Also tauchen wir unter Partikelflaggen auf. Und wir müssen uns um nichts davon wirklich
kümmern. Diese werden also bestimmen, wie das Teilchen in
seinen verschiedenen Richtungen ausrichtet Wir können auch
Dämpfung als Reibung hinzufügen, wodurch die Partikel mit der
Zeit verlangsamt werden, bis sie zum Stillstand kommen Spawning und Geschwindigkeit
Spawning-Geschwindigkeit und Anzeige gehören zu den
drei interessantesten Wenn wir also unter die Position gehen, können
Sie sehen, dass wir die Möglichkeit
haben, die Form
festzulegen , aus der die
Partikel spawnen Im Moment drehen sie sich also von
einem Punkt aus,
was bedeutet, dass sie alle
am exakt gleichen
Punkt auf der Welt erscheinen ,
aber wir können das so ändern, dass
sie innerhalb einer Kugel erscheinen Jetzt können Sie sehen, wie es hier
in einem kreisförmigen Bereich spawnt , und wir können die Größe
der Kugel ändern, um viel mehr
verteilte Partikel oder
eine Kiste oder so weiter und so
weiter zu bekommen verteilte Partikel oder
eine Kiste oder , sogar einen Ein Ring könnte Spaß machen,
besonders wenn es um Feuer geht. Etwas schwierig und dann kann man die Ringachse
ändern, um die Größe des Rings, die Ringhöhe, den
Ringradius und den Ringfehler zu
ändern . Ja, ich weiß nicht, ob ich das wirklich machen
will.
Belassen wir es bei einem. Dann haben wir Winkel und Geschwindigkeit, und diese beiden sind
extrem wichtig. Sie werden
sich also sehr an
diese Steuerung in Gadot gewöhnen diese Steuerung in Gadot zumindest wenn Sie
die Partikelsysteme verwenden Dies ist der einzige Ort, an dem ich
tatsächlich gesehen habe, dass es in Gdo verwendet wird, und es bietet im Grunde
einen Bereich, den Sie
erweitern können , indem Sie die Pfeile
dieser speziellen kleinen
Dinge ziehen dieser speziellen kleinen
Dinge Das ist das Wort, nach dem ich suche.
Sie können auch den gesamten Bereich selbst verschieben, indem auf das Rechteck klicken und es
ziehen Und das gibt den Bereich, Minimum und das Maximum an, den die
verschiedenen Einstellungen haben können Im Fall eines Winkels kann ein Partikel also einen Winkel haben
, der
irgendwo zwischen diesem Wert und diesem
Wert liegt Wir wollen aber nicht so
speziell oder verrückt sein, also setzen wir es einfach auf
0-360, und das ist Das bedeutet, dass das Partikel
potenziell in jeder beliebigen
Winkelausrichtung erscheinen kann potenziell in jeder beliebigen
Winkelausrichtung erscheinen Am lustigsten ist Geschwindigkeit. Geschwindigkeit bestimmt, wie schnell Ihre Partikel von dort aus
explodieren, wo sie sich befinden, und die Ausbreitung bestimmt
ihre Richtung In einem Winkel darum herum. Also, wenn du etwas willst, das eher nach einem Springbrunnen
aussieht,
reduzierst du die
Streuung, und wenn du willst explosionsartiger aussieht, kannst
du die Streuung erhöhen. Leider sieht es
momentan nach
nichts aus, weil wir
auch hier keine Geschwindigkeit
haben. Fügen wir also etwas Geschwindigkeit hinzu. Machen wir unsere
Geschwindigkeit auf zwei. Jetzt können Sie sehen, dass wir ein bisschen mehr davon
haben. Und wenn ich jetzt die Streuung
ändern würde, können
Sie sehen, dass
sie
in einem größeren Winkel explodieren in einem größeren Winkel Okay, wir wollen also nicht, dass
unsere Partikel
sinken , denn so
funktioniert eine Explosion nicht Also ist es zu wenig animiert? Nein, es läuft unter
Beschleunigungen. Okay. Um zu verhindern, dass die Partikel
einfach nach unten fallen, müssen
wir die Schwerkraft ausschalten Und die Schwerkraft wird
beschleunigt. Und wie Sie sehen können, ist sie
bereits auf minus 9,8 eingestellt,
was natürlich bedeutet, dass die
Schwerkraft der Erde nach unten zieht Wenn wir das auf Null ändern, Bum. Jetzt haben wir Partikel, die einfach in jede Richtung
explodieren Sie können jetzt sehen, wie die
Streuung aufgrund der Tatsache,
dass die Schwerkraft ausgeschaltet ist, etwas
besser funktioniert aufgrund der Tatsache,
dass die Schwerkraft ausgeschaltet ist, etwas
besser Also
belassen wir es bei 180, und jetzt haben wir eine
Explosion, die nach außen geht Die Partikel
selbst sehen jedoch nicht so gut aus. Wir haben also zwei Probleme. Die Explosion
verschwindet zu schnell, also erhöhen wir die Lebensdauer jedes Teilchens auf 2 Sekunden. Und eine weitere großartige
Sache an diesem System ist , dass fast jede Eigenschaft
in einem Partikelsystem, zusammen mit jeder
Eigenschaft, die in
Godot im Allgemeinen existiert, einen
sehr informativen Tooltip hat Wenn Sie also nicht wissen, was
eine bestimmte Einstellung bewirkt, fahren einfach mit der Maus darüber,
und es wird Ihnen sagen Wenn
Sie anfangen, sich mit solchen Dingen
zu befassen, werden Sie
leider nichts bekommen Es wird nur
sagen: Diese Eigenschaft kann nur
im Inspektor festgelegt werden. Nun, ich bin im Inspektor,
also lass mich das machen. Also mit einigen von ihnen
muss man irgendwie herumspielen. Aber Godot hat tatsächlich eine unglaublich gute Dokumentation
über die Partikelsysteme, und ich werde das in
den ergänzenden
Materialien für diesen Kurs verlinken den ergänzenden
Materialien für diesen Kurs Wir haben also die Schwerkraft und
wir haben auch die
Fähigkeit, die linearen Radial- und
Tangentialbeschleunigungen
der Partikel zu ändern die linearen Radial- und , aber wir werden diese nicht verwenden Wir könnten es jedoch. Wir
könnten das einfach erhöhen, und es würde die Art und Weise ändern, wie sich die Partikel
tatsächlich beschleunigen. Ich weiß nicht, ich mag das irgendwie
. Lassen wir es so. Radialbeschleunigung bestimmt
im Grunde, wie die Partikel aus ihrem Radius
heraus beschleunigen, was wenig Sinn macht , es sei denn, Sie
sehen es in Aktion. Also, hier ist es. Und lassen Sie uns die Dämpfung ein
wenig erhöhen, um zu sehen, was passiert. Im Grunde genommen
werden deine Partikel durch die Dämpfung allmählich verlangsamt,
bis sie aufhören. Ja,
eigentlich
kein Fan, kein Fan davon. Ich
schalte die Dämpfung aus Steh auf. Nun, das
Lustige ist Display. dem Display
können Sie das
Gesamterscheinungsbild Ihrer Partikel ändern und optimieren Also werde ich Ihnen zeigen, wie die
Farbkurven und die Skalen grundsätzlich funktionieren, und dann können Sie das
auf den Großteil
aller anderen anwenden. Im Allgemeinen
werden
die Partikel also durch
einen individuellen Bereich gesteuert. In diesem Fall bedeutet Maßstab also die wörtliche
Skalierung der Textur Also, wenn wir das erhöhen, dann ist das
ein bisschen zu groß. Manche Partikel können
größer sein als andere, weil
sie mit
einem Skalenwert dazwischen zwischen
diesem Bereich erscheinen einem Skalenwert dazwischen zwischen
diesem Bereich Machen wir das also tatsächlich
auf 0,25. Jetzt können wir also ein paar
kleine besorgen. Kann blühen. Dann haben wir auch
eine sogenannte Kurve, und Kurven machen Spaß. Es ist nicht sehr anschaulich, die Skalenkurve
zu erstellen, also zeige ich Ihnen die Farbe Ich zeige dir
die Farbkurven. Genauer gesagt
die Alpha-Kurve. Und auch hier funktioniert nichts
davon, es sei denn, Sie aktivieren
die Albedofarbe oder verwenden
in den Materialeinstellungen für diese Textur eine Albedo- und
Scheitelpunktfarbe in den Materialeinstellungen Wenn wir also zur Alpha-Kurve wechseln, können
wir eine neue Kurventextur auswählen Und natürlich scrollt
mein Inspektor aus irgendeinem Grund immer wieder ganz nach oben, wenn ich eine dieser Optionen ausdehne Ich weiß nicht, warum das so ist. Aber wenn wir darauf klicken, haben
wir jetzt die
Möglichkeit, eine Kurve festzulegen. Wenn Sie
dies also in eine neue Kurve ändern, haben wir
jetzt eine
Kurve, und wir klicken auf eine Kurve, und wir
können die Kurve sehen. Im Laufe der Zeit wird die
normale Einstellung der Textur für diesen Wert dem
Wert in dieser Kurve
multipliziert Da
ich gerade eine Kurve hinzugefügt habe, können
Sie meine
Texturen natürlich nicht mehr sehen, können
Sie meine
Texturen natürlich nicht mehr sehen weil sie alle multipliziert werden.
Das Alpha
wird während der Lebensdauer der
Textur mit Null
multipliziert , und das ist nicht das, Wenn wir das auf eins hochziehen, sind wir
jetzt wieder da,
wo wir vorher waren, was bedeutet, dass das
Basis-Alpha der Textur ,
das natürlich
eins ist, im Laufe der
Lebensdauer
wieder mit eins multipliziert wird. Also hier fängt es an. Hier wird das
Teilchen geboren. Hier stirbt das Teilchen. Da ist überhaupt keine Metapher
drin. Wenn wir das also ändern, wenn wir hier drüben klicken und
einen weiteren Punkt hinzufügen und
ihn dann auf Null ziehen, können Sie
jetzt sehen, dass die Partikel mit
der Zeit verblassen werden Im Laufe ihrer Lebenszeit wird
der Alphawert also allmählich
sinken, bis er wieder verschwindet. Und wir können sogar mehr Punkte hinzufügen. Was ich also gerne mache, damit
die Texturen nicht so schnell
auftauchen, ist,
meinen Anfangswert auf Null zu setzen und dann diesen Mittelpunkt hierher
zu ziehen , sodass
sie mit der Zeit tatsächlich - und dann mit der Zeit
allmählich verblassen. Und das ist wirklich toll. Und
das kannst du sogar mit den Farben machen. Wenn Sie also
die Farbe der Textur ändern möchten, können
Sie eine Vertiefung hinzufügen, Sie würden dem Farbverlauf
einen Farbverlauf hinzufügen. Gehen wir also so vor, dass
sich Farbverläufe geringfügig von Kurven unterscheiden Für viele dieser Funktionen
stehen jedoch Kurven zur Verfügung. Wie Sie hier sehen können,
haben wir eine Winkelkurve und so weiter. Also gut, lass uns das schließen
, wo waren wir? Okay, wir haben einen
Farbverlauf mit Farbverlauf. Bum, also öffnen wir das und
jetzt haben wir einen Farbverlauf. Und wenn Sie noch nie mit
Farbverläufen in Godot gearbeitet haben, können Sie
im Grunde
Punkte innerhalb des Verlaufs hinzufügen, und wir sind dabei, das zu
tun und dann den Wert des Farbwerts
an jedem Punkt so zu
ändern , dass
die Farben über die
Entfernung des Verlaufs gleichmäßig zwischen ihnen
verschmelzen Hier haben wir also Schwarz an einem Ende und
Weiß am anderen, was uns eine schöne
Überblendung verleiht Aus diesem Grund
können Sie jetzt sehen, dass die
Textur zunächst
schwarz ist und dann im Laufe
der
Lebensdauer der Textur zu Weiß
verblasst Laufe
der
Lebensdauer der Textur Fügen wir hier also
noch ein paar Punkte hinzu und
doppelklicken wir auf diesen Und alles, was ich getan habe, war
hier mit der linken Maustaste zu klicken, um diese Punkte hinzuzufügen. Wenn ich dieses
Schwarz nun in Gelb ändere, bedeutet
das, dass die Textur gelb anfängt
und dann
schwärzlich
wird und dann
schwärzlich Und dann ändern wir das in
Orange, also quasi in
ein leuchtendes Orange Und dann das hier in Rot. Jetzt können Sie sehen, dass
die Texturen im Grunde genommen
mit einem gelben Farbton beginnen und dann zu einem orangefarbenen Farbton und dann zu einem
roten Farbton übergehen und dann einfach zur ursprünglichen
Farbe der Nun, bei einer Explosion wollen wir das
nicht wirklich tun, aber wenn wir Feuer machen würden, was ich Ihnen
gleich zeigen werde, wäre so
etwas sehr
praktisch Also das ist eigentlich eine
beschissene Textur für eine Explosion Also lass mich dir einen besseren geben. Ich konnte mir tatsächlich einige Einstellungen einfallen
lassen, damit es
ein bisschen
aufbläst, bis lassen, damit es
ein bisschen
aufbläst, es wie eine echte
Explosion aussieht, aber es hat ewig gedauert, und ich kann mich nicht erinnern,
wie die Einstellungen sind Ähm, ich könnte sie noch einmal überprüfen, aber es wäre besser
für mich,
das Material zu ändern , weil ich es dir zeigen
will, lass uns das in Rauch verwandeln und dann und dann mache ich
die Explosion Also werden wir
die Textur wieder ändern. Lass es uns auf schwarzen Rauch umstellen. Oop, ich muss es zuerst öffnen. Los geht's, Material. Textur schwarzer Rauch. Bum. Und wir löschen das, indem wir einfach im
Drop-down-Menü auf Löschen klicken. Wir bleiben bei den Alpha-Kurven. Wir schalten die Explosivität aus. Wir erhöhen den Wert auf etwa 1:50 und wir ändern
die Winkelstreuung auf etwa 20, und wir ändern die Richtung
von X auf Null bis Y eins,
was bedeutet, dass
es jetzt nach oben geht Jetzt haben wir also schöne
wütende Rauchpartikel. Sie
steigen irgendwie ein bisschen zu stark. Gehen wir also mit der
Anfangsgeschwindigkeit von 0,5 aus. Wie sieht das aus?
Irgendwie besser. Oh. Okay, könnte schlimmer sein. Nicht schlecht. Und jetzt machen wir einen zweiten
, der ziemlich explosiv ist. Und ich werde es tatsächlich
erziehen. Nein, nein, bin ich nicht. Ich werde einen untergeordneten Knoten hinzufügen, und ich werde einen Knoten
drei D hinzufügen, weil ich das
ursprüngliche Partikelsystem so gemacht habe. Ich hatte also einen
dritten Knoten D und Hoppla. So kannst du es nicht machen.
Was du tun musst, ist dieses Nein zu ändern. Knoten drei D,
klicken Sie mit der rechten Maustaste auf Als Szenenstamm erstellen. Da haben wir's. Das
dreht sie um Jetzt fügen wir eine hinzu, damit diese
immer läuft. Und dann fügen wir ein weiteres
GPU-Partikelsystem hinzu. Und dieser wird
bei der Explosion einige Trümmer
abfeuern , wenn
der Tank explodiert Also können wir in die Zeit zurückreisen und irgendwann einen
Schuss setzen Aber wir wollen, dass unsere
Explosivität auf eins steigt. Wir wollen
das vorerst ausschalten , damit wir sehen
können, was wir tun Zufälligkeit ist gut. Dann benötigen wir natürlich
ein anderes Prozessmaterial und einen Ziehpass mit
einem neuen Material Dieses Material
werden wir als Prisma verwenden, weil es passend aussieht,
äh, wie Granatsplitter Also werden wir ändern,
wie es aussieht. Wir werden die Größe reduzieren nur damit es
kein riesiger Block wird. Dann
brauchen wir natürlich ein Material. In diesem Fall werden
wir keine
Transparenz oder verrückte
Farben oder so verwenden , also verwenden wir einfach eine Albedo Ich werde ihm keine Textur geben, aber ich mache es grau, sodass es aussieht wie ein Stück Metall das vom Tank abgeschossen ist, und sie brauchen auch keine Reklametafeln oder ähnliches Und jetzt gehen wir zu unserem
Partikelprozessor. Partikelflags sind
in Ordnung, Spawn-Position. Wir lassen sie von einem Punkt aus
emittieren. Der Winkel wird eigentlich
eine gute Frage sein. Was wird der Winkel sein? Nun, die Richtung wird
wieder nach oben gehen. Und wir werden
einen Spread von etwa 75 machen. Und geben wir ihm eine
Anfangsgeschwindigkeit. Sagen wir die Geschwindigkeit. Wir wollen nicht, dass irgendwelche
keine Geschwindigkeit haben. Also lass uns von
etwa fünf auf 20 gehen. Und jetzt, ohne
irgendwelche Änderungen, haben
wir tatsächlich eine ziemlich
anständig aussehende Explosion. Also werden wir das leicht
ändern. Wir wollen ihre
möglichen Blickwinkel ändern. Wir werden also 0-360 gehen. Und dann,
wenn sie spawnen, spawnen sie mit
einem zufälligen Und wir können
die Y-Achse des Partikels
an seiner Richtung ausrichten , und das ist auch ziemlich cool Tatsächlich
drehen sie sich jetzt quasi in der Luft um. Ordnung, also wenn ich
zur Emission zurückkehre und einen Schuss
einschalte, können
Sie sehen, dass
die Emission ausgeschaltet Und das liegt daran, dass ein einmaliger Schuss genau das
ist, was es
bedeutet. Es ist ein One-Shot. Erhöhen wir
hier die
Anzahl der Partikel . Bum. Da haben wir's. Bei einem Schuss
werden buchstäblich all
seine Partikel auf einmal abgefeuert
und es
wird werden buchstäblich all
seine Partikel auf einmal abgefeuert dann Feierabend gemacht, und dann wird es nicht mehr abgefeuert. Wenn Sie also,
sagen wir, 200 Partikel angeben sagen wir, 200 Partikel und die
Explosivität nicht wie ich
auf eins erhöhen würden, würden einfach diese 200 Partikel
austreten,
eins, zwei, drei, vier,
fünf, sechs, sieben Und wenn sie
dann alle fertig sind, wäre
das das Ende Explosivität
erhöht ist, wie wir es getan haben, feuern
sie alle auf einmal und
dann feuern sie nicht mehr Das ist es also, was uns ermöglicht, durch Mischung all dieser
verschiedenen Effekte oder dieser verschiedenen
Partikelsysteme Explosionseffekte zu
erzeugen Also lass mich dir den zeigen
, den ich für den Panzer gemacht habe. Also, hier ist die
erste Explosion, Kaboom. Und dann sind hier die Trümmer. Hoppla. Kaboom. Buchstäblich
der, den ich dir gerade gezeigt Rauch auch ähnlich. Und dann habe ich auch eins für
Feuer hinzugefügt , das
eigentlich keine Textur hat. Es sind buchstäblich
nur die quadratischen Partikel. Und das liegt daran, dass ich keine anständige
Feuertextur zur Hand habe. Aber wie dem auch sei, ich habe
sie alle
ausgeschaltet , weil wir wollen, dass sie nur alle aktiviert und ihr Ding machen, wenn
der Panzer explodiert Also habe ich dieses
Partikelsystem zu meinem Tank hinzugefügt und im Skript für den
Tank in unserer Trefferfunktion finde ich einen Verweis auf
die Explosionspartikel,
Kinder, weil wir die Kinder
wollen, das sind die eigentlichen
Partikelsysteme und nicht der Knoten selbst Und dann haben wir
jedes einzelne Kind durchgesehen und festgestellt, dass die
Emissionseigenschaft wahr ist. Und dann, wenn wir das getan haben, werden
wir eine nette Explosion haben. Und ich werde dir zeigen, wie es
in Aktion aussieht , weil
ich es wirklich mag. Füge also noch ein paar
Gegner hinzu, weil
wir sonst die Explosion nicht wirklich sehen können, bevor
das Spiel endet. Also, wenn ich mich jetzt an den
Kerl hier heranschleiche, sehr nett. Und das ist viel lohnender, als nur
zuzusehen, wie die Panzer anhalten Und jetzt wird es für alle Ewigkeit
brennen und rauchen, zumindest bis das Spiel vorbei ist Okay, das waren Partikelsysteme. Und in der nächsten Lektion werden
wir
noch einmal tief in die Materie eintauchen, werden
wir
noch einmal tief in die Materie eintauchen oder besser gesagt, tief in die
Materie eintauchen , damit unsere Tanks nicht so flach aussehen.
Wir sehen uns dort.
34. Neustrukturierung Ihrer Tanks: Überarbeitung der Materialien: Willkommen zurück. In dieser Lektion werfen
wir einen Blick auf
die zusätzlichen Optionen, die Ihnen zur Verfügung
stehen, wenn Sie ein Material für
die verschiedenen Teile
Ihres Tanks oder jedes andere Netz
oder Material, das
in Ihrem Projekt verfügbar ist,
erstellen Ihres Tanks oder jedes andere Netz
oder . Ich habe alle
relevanten Dateien als Teil
der Projektdatei im
Verzeichnis Graphics Slash Metal
Textures bereitgestellt der Projektdatei im , aber ich werde auch Links in
den Zusatzmaterialien für
diesen Kurs bereitstellen den Zusatzmaterialien für , um selbst welche zu
besorgen , da
Sie diese Maps entweder selbst
erstellen können ,
wenn Sie wissen, wie oder Sie konnten sie nicht aus verschiedenen Repositorien im Internet beziehen oder verwenden Sie sogar
Online-Tools, um sie zu erstellen. Ein guter Ort, um
diese Texturen zu bekommen,
wäre also ambientcg.com Auch hier habe ich für die
ergänzenden Materialien einen Link dazu bereitgestellt für die
ergänzenden Materialien einen Link dazu Und wenn Sie sie selbst aus
einer individuellen Textur
erstellen möchten , die Sie erstellt haben, können
Sie auch auf
normalmpline.com gehen Und wieder habe ich in den
ergänzenden Materialien einen Link
dazu bereitgestellt dazu Oh, wie Sie sehen können, habe ich bereits angefangen,
mit einigen Materialien herumzuspielen, aber wir werden eines erstellen oder besser gesagt direkt modifizieren. Gehen wir also zur Vorderseite
unseres Tanks, der natürlich seit 387 ein
Netz ist, seit 387 ein
Netz ist, und wir werden das Netz erweitern, und wir werden das Material erweitern Im Moment ist es ziemlich
langweilig, weil es buchstäblich
nur eine einzelne
einzelne Farbe ist nur eine einzelne
einzelne Farbe Also wollen wir das ändern. Also gehen wir zu Albedo und wir haben hier einen Platz
für Textur Lassen Sie uns also eine
Textur hineinziehen. Wir ziehen die Farbdatei
aus den bereitgestellten Dateien. Und jetzt können Sie sehen, dass unser Material
tatsächlich
eine Textur überschreibt oder überlagert unser Material
tatsächlich
eine Textur indem es mit der
Farbe getönt wird, die Also lass mich einfach diese Farbe nehmen. Wenn wir das ändern und alles
wieder auf Weiß
setzen würden , dann könnte man sehen, dass die Textur selbst
nicht wirklich beeinträchtigt wird. Und wenn wir es dann einfärben wollen, geben
wir ihm einfach wieder die Farbe Aber wir können mehr
als das tun, weil wir hier eine Menge
Dateien haben Wir können die Metallität ändern. Und das
hat natürlich auch eine Textur. Wenn wir also die
metallische Textur angeben, kann
das das metallische
Aussehen des Materials verändern Wir können auch
die Rauheit ändern, also die Rauheitstextur Und Sie können jetzt sehen
, dass dies der
Textur etwas mehr Tiefe und
Gefühl verleiht Textur etwas mehr Tiefe und
Gefühl Also, bevor diese Unebenheiten nicht wirklich
waren, sahen sie nicht
wirklich dreidimensional aus, und sie existierten auch nicht
wirklich Lassen Sie mich diese Textur sogar
löschen, damit Sie sehen können, dass der
Unterschied jetzt darin besteht, dass,
okay, es sieht einfach aus wie ein
Haufen farbiger Flecken Und jetzt, wenn wir die
Rauheit wieder reinlegen, können
Sie sehen, dass es tatsächlich wie etwas
aussieht, wissen
Sie, über das Sie mit der
Hand fahren und fühlen könnten Dann haben wir auch normale Karten. Jetzt gibt es zwei verschiedene
Arten von normalen Karten, normale Karten, entweder im
DX- oder im GL-Format. Godot arbeitet mit dem GL-Format. Also werden wir das normale GL
verwenden. Und dieser ist ein
bisschen verwirrend. Godot unterstützt
also eine Höhenkarte und in anderen Engines und
in anderen Arten von Tools, die normalerweise als Verschiebungskarte
bezeichnet Und bei
diesem speziellen
Beleuchtungs-Setup kann man nicht wirklich einen großen Unterschied erkennen , aber er ist da Wenn Ihnen die Art und Weise,
wie sich
die Textur auf
dem jeweiligen Objekt
, an dem Sie gerade arbeiten, nicht gefällt die Textur auf
dem jeweiligen Objekt
, an dem Sie gerade arbeiten, können
Sie erneut,
unter dem Material, zur Option
UV-Skalierung gehen. Und lassen Sie mich
diese Einstellung zurücksetzen , damit Sie den Unterschied sehen
können. Weil
wir manchmal keine
echten Modelle verwenden, bei denen das UV-Mapping innerhalb
der
Three-D-Modellierungssoftware erfolgt,
streckt Godot die Textur im Grunde einfach
über die gesamte Oberfläche
des Objekts,
wie echten Modelle verwenden, bei denen das UV-Mapping innerhalb
der
Three-D-Modellierungssoftware erfolgt,
streckt Godot die Textur im Grunde einfach
über die gesamte Oberfläche es auch immer es für richtig hält, aber das funktioniert bei uns möglicherweise nicht, also können wir sie reduzieren, indem wir
den Zoom der Textur ändern Okay, jetzt haben wir also einen Brunnen,
wir haben einen ganz anderen, texturierter aussehenden Panzer Und wenn wir in unser Spiel gehen, könnt ihr definitiv den Unterschied
erkennen,
vor allem, wie das Licht darauf
wirkt und
wie anders es aussieht Und da wir
das in unserer Basispanzerszene gemacht haben, sehen
die feindlichen Panzer natürlich genauso aus. Und ihr könnt auch sehen
, wie sich das Licht aufgrund des
Reflexionsvermögens der Panzer
verändert Oh, wir haben einen Fehler. In
Ordnung. Ich hab was kaputt gemacht. Also das ist etwas , das
für die nächste Lektion behoben wird, aber was auch immer es ist,
ich garantiere, dass es für diese
spezielle Lektion
irrelevant ist , sodass wir uns darüber keine Gedanken machen müssen. Wie dem auch sei, das waren Materialien
und ihre verschiedenen Karten. Wir sehen uns in
der nächsten Lektion.
35. Aufkleber: Willkommen zurück. Wir sind
auf der Zielgeraden. Bevor wir weitermachen,
möchte ich nur erwähnen, dass ich den Fehler behoben habe, der am Ende
der letzten Lektion aufgetreten ist. Als wir die
Dinge in dem Kapitel, in dem wir den gegnerischen Spawner
erstellt haben, neu organisiert haben, hatte
der gegnerische Basispanzer im Grunde Dinge in dem Kapitel, in dem wir den gegnerischen Spawner
erstellt haben, neu organisiert haben, kein Granaten-Fertigset, weil
der Panzer, den wir direkt ins Spiel eingebaut hatten, genau
dort
war, wo wir das Fertighaus aufgestellt hatten Aus irgendeinem Grund wurde es also nie verbreitet. Und dann, als wir es
in den Spawner verschoben haben, natürlich, weil wir mit der Vorlage
gearbeitet haben
und das Shell-Prefab Und dann habe ich natürlich
nie zugelassen, dass irgendein Panzer und der Unterricht danach auf mich zurückschossen, also kam es nie Wie dem auch sei, kurz
und bündig ist, dass ich zurückgegangen und die Szene
mit den feindlichen Panzern korrigiert habe.
Ich glaube, es ist 104 Kapitel
zehn, Lektion vier. Der Fehler sollte also
rückwirkend behoben werden, obwohl er im Video
auftauchte Hey, zu
interessanteren Dingen. Lass uns über Decals sprechen. Abziehbilder sind wirklich cool. Auf diese Weise können Sie
Ihrem Spiel
zusätzliche Texturdetails hinzufügen , ohne sie tatsächlich in Ihre Modelle integrieren zu
müssen So habe ich zum Beispiel
einen kleinen Explosionsgranatenkrater geschaffen einen kleinen Explosionsgranatenkrater erscheint hier
,
wo die Granate einschlägt, als Aufkleber
auf dem Boden Nun, ich war nicht
schick genug,
um es auf Bäume oder so zu kleben Also, wenn du auf einen Baum schießt, wirst
du ihn nicht sehen. Aber das ist Decal auf
seiner grundlegendsten Ebene. Und mal sehen, wie man einen macht. Abziehbilder sind Knoten, in Gado. Wenn du also eine neue Szene erstellst und ihr eine
Basis vom Typ Decal gibst, erstellen wir einfach ganz schnell eine neue,
damit du sehen kannst, wie das gemacht wird, anderer Knoten, Wenn Sie also ein neues
Decal erstellen, entfernen Sie es. Und du gibst ihm eine
Textur für seine Albedo. Das ist zumindest alles,
was Sie brauchen. In unserem Fall
müssen wir also nichts weiter tun. Normalerweise würden wir Ausrichtung der Aufkleber so
drehen , dass sie der
Oberflächennormalen des Netzes entspricht , an dem
wir sie angebracht haben Aber das müssen wir nicht tun, weil wir es nur
am Boden befestigen, sodass seine standardmäßige
Oberflächenausrichtung völlig in Ordnung ist Also gehen wir zu unserem
Shell-Skript und natürlich in unserer Shell, wie wir es
bereits für andere ähnliche Dinge getan haben , eine Exportvariable
vom Typ packed scene
für das Decal-Prefab hinzugefügt und dann den
Shell-Krater, den wir gerade erstellt haben, mit der Maus gezogen Shell-Krater Und wenn die Shell dann
auf etwas stößt, instanziieren
wir eine Wir fügen es als
Kind dem übergeordneten Objekt der
Schale hinzu, weil das Elternteil der
Schale das Spielfeld ist , und dann
setzen wir
den Krater auf das Abziehbild,
was Krater bedeutet, die globale Position des Kraters auf die globale
Position der Schale. Und wir müssen das natürlich in dieser Reihenfolge
tun,
denn wenn wir die globale Position
festlegen würden, bevor wir
das Kind hinzufügen , würden
wir Aber ja, das sind Decals. Sie können Aufkleber für
Dinge wie Blutspritzer,
Schmutz und all diese
Dinge Ähm, wir machen es hier
dynamisch weil die Granaten
so funktionieren, aber du könntest es auch verwenden, um deinem Terrain Textur zu
verleihen Und wenn wir unser
Terrain in einer späteren Lektion aufrüsten, die vielleicht sogar die
nächste Lektion sein könnte, dann ist das nicht mehr der Fall. Aber wie dem auch sei, sobald
wir das Terrain verbessert haben, werden wir es dort tun, um zu
sehen, wie wir etwas Abwechslung hinzufügen können. Wie dem auch sei, das sind Decals. Wir sehen uns in
der nächsten Lektion.
36. Importieren externer Modelle: Willkommen zurück. In dieser Lektion zeige ich
Ihnen
einige Möglichkeiten, externe
Modelle in Ihren Godot zu importieren Leider werden Sie angesichts
der Tatsache, dass Godot eine ziemlich breite
Palette von Modellformaten
unterstützt, und das
auch oft, oft, eine ziemlich breite
Palette von Modellformaten
unterstützt,
und das
auch oft, oft,
wenn Sie kostenlose Modelle aus dem Internet holen,
was ich fast
garantieren kann, was ich fast
garantieren kann dass Sie dies
für Ihre ersten Spiele tun werden , es sei denn, Sie sind
oder kennen
einen Drei-D-Modellierer, Sie werden
oft Probleme haben. Zu diesem Zeitpunkt ist
es für GaDo 43 möglich, die
Dateitypen GLTF und FBX fast
immer problemlos zu
importieren. Aber manchmal liegen die
gewünschten Assets entweder nicht in diesen
Formaten vor, oder selbst wenn sie es sind, der Künstler nicht
alle erforderlichen Schritte unternommen,
um die Ressource korrekt in GADO
verfügbar zu machen Wir werden
also einige Elemente importieren,
und ich werde Ihnen einige gängige Methoden zeigen, um
einige grundlegende Fehler zu beheben , die
bei Ihren Importen auftreten können bei Ihren Importen Alle Ressourcen werden also im Rahmen
dieses Unterrichtsprojekts
bereitgestellt Und außerdem habe ich Ihnen einige
unbewegliche Vermögenswerte zur Verfügung gestellt,
mit denen Sie spielen und versuchen können, sich selbst zu
reparieren, nachdem ich Ihnen
gezeigt habe, was zu tun Lassen Sie mich also zunächst
eine ganze Reihe
dieser Szenen schließen , weil wir sie
nicht verwenden werden Und das Erste, was
wir tun werden, ist
unseren Stein zu reparieren , weil er
sehr rund aussieht. Wir haben also eine Reihe von
Steinen zur Verfügung, und diese wurden
von Open Game Art heruntergeladen. Und wie Sie sehen können, wurden
sie in
einer Reihe kompatibler Formate bereitgestellt ,
darunter Kalata, ein
DAE OBJ, und sogar ein Aber wenn Sie den Godot öffnen, werden
Sie feststellen, dass
einige Abhängigkeiten
und andere Dinge aus verschiedenen Gründen fehlen und andere Dinge Wir werden
diese kaputte Abhängigkeit also nicht beheben. Was wir tun werden, ist
,
eine neue Szene aus
einer vorhandenen Datei zu erstellen . Wir haben also unsere DAE-Datei hier, und wir klicken mit der rechten Maustaste darauf
und erstellen eine neue geerbte Szene. Das gibt uns also einen neuen Godot mit diesem Mesh als
Mesh-Instanz darin Und eigentlich,
weißt du, ist das gut. Lassen Sie uns also die Mesh-Instanz kopieren. Und lassen Sie mich tatsächlich
sehen, ob das funktioniert. Lass mich hier zurück zum Felsen gehen. Wir haben schon ein Netz. Wir haben ein OBJ mal sehen, ob wir das da
reinholen können Wird das funktionieren? Nein.
Wie wär's damit? Ja, das wird funktionieren.
Mesh Instance Three Ds verwendet also Punkt-OBJs
als Mesh-Ressource Und wenn Sie kein OBJ haben,
wenn Sie nur
ein DAE oder was auch immer haben,
dann können Sie einfach das
tun, was ich getan habe, und rechten Maustaste klicken und eine geerbte Szene
erhalten, und dann können Sie die
Mesh-Instanz drei D kopieren. Wie lautet der Pfad hier? Ja, es ist immer noch das DAE. Interessant. Wie auch immer, Godot wird also hinter den Kulissen einige Importe
durchführen Wie auch immer, wir können mit der rechten
Maustaste klicken und diesen Knoten kopieren. Und zurück zu unserem Rock, obwohl wir das nicht wirklich brauchen, weil wir ihn bereits importiert haben. Also ja, wir haben also unser Netz. Das Problem ist, dass die
Mesh-Texturen nicht verknüpft wurden. Zum Glück
wurden uns die Texturen zur Verfügung gestellt, sodass wir das
Material für unser Mesh manuell festlegen können. Leider
wird bei einem DAE die
Mesh-Ressource nicht spezifisch angegeben, aber bei vielen
importierten Mesh-Dateiformaten wird das Material unter einer
sogenannten Oberfläche
versteckt. können Sie auch
ein vorhandenes oder ein neues Material angeben Unter „
Oberflächenmaterial überschreiben“ können Sie auch
ein vorhandenes oder ein neues Material angeben. Die Oberfläche ist also das eigentliche
Material für das Gestein. Was wir nun tun können, ist, unser Netz einzigartig zu machen und
dann sagen wir einzigartig rekursiv, und das wird uns ermöglichen, das Material
zu ändern Und in diesem Fall haben sie
bereits ein Material bereitgestellt, sodass wir es einfach herüberziehen können Und aus welchem Grund auch immer
, dadurch wurden die Texturen nicht aktualisiert. Also okay. Aber es hat uns
einige Materialeinstellungen gegeben, und wir haben die
Texturen selbst. Ziehen wir also unser
Rock-PNG in die Albedo, und das
sieht schon besser Und jetzt haben wir eine, es sieht
nicht so aus, als hätten wir hier
eine Metallic, aber wir haben eine Rauheit
und wir haben eine Und wir haben ein Spiegelbild, das vielleicht sogar unter metallisch
fällt Lass uns das versuchen. Das
sieht ziemlich gut aus. Jetzt haben wir hier einen ziemlich
anständig aussehenden Stein und wir können ihn schließen
. Speichere nicht. Wenn wir jetzt
unseren Stein retten und zu unserer Arena-Szene
zurückkehren , sollten
wir hier ein paar viel
besser aussehende Steine sehen. Und da haben wir's. Wir haben ein
paar gut aussehende Steine. Also werden wir das
Gleiche für die Bäume tun. Und in diesem Fall die Bäume. Also nochmal, ich habe dir
verschiedene Arten von
Steinen zur Verfügung gestellt , mit denen du spielen kannst
, um etwas Ähnliches zu tun. Nun, was die Bäume betrifft,
haben wir ein ähnliches Problem die Bäume, die
bereitgestellt wurden, im FBX-Format vorliegen Ab Godot Four Dot Three können
Sie
FBX-Dateien direkt in
Godot importieren, was etwa in der Vier-Punkt-Zwei-Ära
der Fall war Und wenn Sie in
Vierpunkt-Zwei
arbeiten ,
müssen Sie dies möglicherweise immer noch tun Aber es gibt einen externen
FBX-Konverter, den Godot verwendet. Und wenn ich zum Beispiel darauf
doppelklicke,
also wenn du darauf doppelklickst, kannst du sehen, dass das Material nicht richtig
eingerichtet wurde Und Sie können auch
sehen, dass Sie
die Möglichkeit hatten , einen
bestimmten Importer zu verwenden Nun, UFBX ist natürlich der Importer, der jetzt ab 4.3 im
Lieferumfang von Godot enthalten ist. Sie sollten
also einfach importieren können Das Problem hier ist also,
dass das Material, obwohl sie ein Material
zur Verfügung gestellt haben, keine Textur hat,
aber sie haben die Textur für uns bereitgestellt Ich habe also bereits ein neues Standardmaterial
erstellt. Um
das zu tun, Um
das zu tun klicken
Sie einfach mit der rechten Maustaste auf Neue Ressource
erstellen und dann auf Standardmaterial. Also haben wir bis jetzt
Standardmaterialdateien
innerhalb unserer bestehenden
Modelle erstellt . Dies ist also das erste Mal, dass
wir tatsächlich
eine externe Materialdatei verwenden . Aber ich habe
den
vorhandenen Skin genommen und ihn
hierher in die Albedo gezogen Zum Glück war der Baum
selbst richtig kartografiert, sodass nur noch ein erneuter Link erforderlich war Wenn wir also zu Young Tree gehen und eine neue geerbte Szene machen, und wir wählen eine Mehrfachauswahl aus,
sodass wir all diese Szenen erhalten Und dann öffnen wir die Maschen, wir können wieder ein
Material unter der Oberfläche haben, was nicht
das ist, was wir wollen Also können wir diese so einstellen, dass sie wieder
eindeutig rekursiv sind. Und dann können
wir unter der Oberfläche das Material auf
unser neues Standardmaterial umstellen Und jetzt okay, es sieht so aus, als ob dieses spezielle
Modell nicht gut funktioniert. Aber wie dem auch sei, hier ist
eines, bei dem ich den gesamten Prozess zuvor
mit einem der anderen
Modelle verfolgt
habe gesamten Prozess zuvor , und hier ist es. Also das hat tatsächlich funktioniert. Die Moral von der
Geschichte ist also, dass man
manchmal leider ein bisschen
massieren
muss ,
damit frei verfügbare
Modelle in Godot funktionieren Aber die häufigsten Probleme sind kaputte Materialien
oder kaputte Texturen, und ich habe dir gerade
zwei Möglichkeiten gezeigt, das zu beheben Also viel Glück. Lassen Sie uns, ähm, lassen Sie uns diesen Baum
, der derzeit funktioniert, tatsächlich in unsere Baumszene aufnehmen. Also doppelklicken wir
darauf, um ihn zu öffnen. Wir werden diese
beiden Mesh-Instanzen loswerden. Und dann werden wir:
Wo war unser Baum? Ziehen wir den Baum
hier rein, jetzt haben wir einen Baum. Also, wenn wir das speichern und
in unsere Arena zurückkehren, sehen die Bäume wieder ziemlich groovig Also lasst uns die
Ursache loswerden, die nicht funktioniert. Okay, so exportiert oder importiert
man Modelle in Godot Und in unserer nächsten Lektion werden
wir die Arena ein wenig
aufhübschen, und das wird das
Ende des Kurses sein Also werde ich dich dort sehen.
37. Upgrade des Ebengeländes: Mm hmm. Mm hmm. Willkommen zurück In dieser Lektion,
unserer letzten Lektion, werden
wir
ein paar Dinge tun. Das erste, was
wir tun werden, ist , unsere Skybox zu
wechseln Sie erinnern sich vielleicht,
und ich habe es
hier schon gelöscht, dass wir
eine Skybox hatten , die
aus den vom Godot
erstellten Standard-Sky-Einstellungen stammte aus den vom Godot
erstellten Standard-Sky-Einstellungen können wir ändern. Wenn wir also in unsere
Arena zurückkehren und zum
Knoten Weltumwelt gehen , den wir vor vielen, vielen Lektionen
erstellt
haben, können wir darauf klicken, um ihn zu erweitern, und dann auf
den Himmel klicken . Und den habe ich hier schon
erweitert. Nun, vorher hatte es eine
prozedurale
Himmelstextur in diesem Feld, die ich
bereits gelöscht habe. Wir können das auf eine
beliebige Anzahl von Dingen ändern. Geben wir ihm also einen neuen
Himmel und wir werden ihn öffnen. Und jetzt haben wir die
Möglichkeit, ein Himmelsmaterial festzulegen. Nun, vorher war es
ein prozedurales Himmelsmaterial, und so hatten wir das hier. Wir können aber auch
sogenanntes Panorama-Himmelsmaterial bereitstellen . Und mit Panoramahimmel
fügen Sie tatsächliche grafische Himmelskästen Nun, das Erstellen einer Panorama-Textur den Rahmen dessen sprengen, was
wir hier versuchen, aber ich tue es. Ich habe eine aus
dem All Sky-Paket von
Richard Whitlock
bereitgestellt , das in
der Godot Asset Library verfügbar ist Er bietet eine Reihe
vorhandener Godot Skybox-Szenen
und zehn verschiedene Skybox-Texturen und zehn verschiedene Skybox-Texturen Also habe ich hier einen bereitgestellt. Und wenn Sie auf
die Skybox klicken, um sie zu öffnen, werden
Sie sehen, dass Sie die
Möglichkeit
haben , ein Panorama bereitzustellen Nun, aus irgendeinem Grund, nun,
okay, jetzt wird es funktionieren. Großartig. Aber vorher hatte ich ein
Problem damit, das rüber zu ziehen Wenn Sie also
die Textur in diesen Slot ziehen , erhalten Sie
jetzt eine Skybox Die andere Möglichkeit besteht
natürlich darin, zu klicken und entweder zu
laden oder schnell zu laden Aber wenn du das getan hast, kannst
du jetzt sehen, dass du
einen wunderschönen Panoramahimmel hast, und ich muss jubeln, los geht's Wunderschön, da haben wir es. Nun, du verstehst die Idee.
Aber wie dem auch sei, ja, dieser Himmel ist jetzt da, er bedeckt unsere gesamte
Umweltszene und er sieht wirklich gut Sieht viel besser aus als
das Original. Lassen Sie uns als Nächstes die Serena
reparieren. Das erste, was
wir tun werden, ist tatsächliche Grenzen hinzuzufügen Also, wenn Sie sich erinnern
, von wann wahrscheinlich vorher Dinge
getestet und herumgespielt wurden. Es ist möglich, vom Rand der Arena
wegzufahren, und da wir keine Schwerkraft
anwenden, bedeutet
das, dass unsere Panzer in den Weltraum schweben
werden . Das wird den gegnerischen
Panzern nicht passieren, weil sie nur fliegen
können oder sie können nur
von NavPoint zu NavPoint fliegen, aber es kann definitiv
dem Spieler passieren , und das ist Also lasst uns das reparieren.
Der einfachste Weg zu beheben, besteht darin, einfach
ein paar Collider-Hügel rund um
den Rand der Montierung vorzusehen ein paar Collider-Hügel rund um
den Rand der Montierung Also werden wir uns einen Hügel schnappen. Wir werden mit der rechten Maustaste klicken
und diesen Hügel duplizieren, und dann brauchen wir
Editierbare Kinder Und dann müssen wir die Meshes einzigartig
machen. Und die Kollision ist einzigartig
, sodass wir sie ändern können. Lassen Sie uns diesen Hügel jetzt in
Grenzgebiet Hill North
umbenennen . Und wir werden das hier nach oben verschieben. Wir werden Whoa,
das ist interessant. Wir werden die Ausrichtung
dieses Hügels so ändern, dass Wo ist unsere Transformation?
Wo ist unsere Transformation. Wir brauchen die 90 Grad auf diese Weise. Ja. Okay. Und lassen Sie uns ja, lassen Sie uns
das ein bisschen ansprechen. Bring es ein bisschen nach vorne. Und jetzt können wir
das eigentliche Netz ändern. Wenn wir also hierher gehen, haben wir XYZ. Wir ändern die
X-Richtung auf 100, was das Whoa ist,
das ist nicht richtig Wir ändern den Dire,
weil er gedreht ist. In Ordnung, wir ändern dort
die Z-Richtung. Wir bringen das her. Und wir haben einen
von denen. Und dann werden
wir das
Ganze duplizieren. Ändere es auf Süden. Ziehe es nach unten. Hoppla. Border Hill Süd. Und wir können einfach beide
duplizieren und sie so rotieren , dass sie Ost und West sind. Und ich habe vergessen, die Kollision zu
ändern, also werden wir das gleich beheben. Lass das rotieren. Negativ 90. Die Orientierung ist etwas falsch. Das können wir ziemlich einfach beheben. Wir können sie auch einfach so ausdehnen
, dass sie besser sind. Z eins gegen fünf. Ja. Und dann machen wir
dasselbe für East Hill. Ja, okay, ich schätze, das sind sie. Ja, sieht aus, als hätten
wir da eine kleine Lücke . Das ist nicht richtig. Okay. Das ist besser. Und jetzt müssen wir die Kollisionen
reparieren. Also kehren wir zu unseren
Kollisionsformen zurück und zum Glück können wir sie hier
einfach bearbeiten Und natürlich müssen
wir ihre Transformationen zurücksetzen Und die Ausrichtung ist ein
bisschen falsch, aber das ist okay. Wir ziehen
das einfach so raus. Zieh das hierher und
zieh das hierher. Und dann mach dasselbe
für die anderen drei. Das ist richtig. Wir müssen
es nur jetzt neu drehen. Und es ein bisschen neu ausrichten. Machen Sie dasselbe für die anderen beiden. Ja, es sieht so aus, als ob
sie beide gut sind. Wir müssen nur die Rotation
ändern. Null. Und sie sind
in Bezug auf Z falsch, also werden wir das korrigieren. Okay. Jetzt sollten wir
nicht mehr in den Weltraum fahren können. Jetzt lasst uns
das Gelände reparieren, es sieht
irgendwie hässlich aus. Also
habe ich, ähnlich
wie zuvor, zusätzliche
Texturen für dieses Projekt
im Ordner Graphics Desert
Textures bereitgestellt Texturen für dieses Projekt . Jetzt können wir einfach ein neues Material
erstellen, ein neues
Standardmaterial für Ressourcen erstellen. Ja, wir nennen es.
Wüste. Wo ist das hingegangen? Da ist es. Okay, und jetzt können wir, wir
brauchen keine Schattierung, aber wir brauchen nicht
die Vertex-Farbe Wir werden unsere Albedo brauchen. Und es wird den
Rock 29 da nicht reinziehen. Okay, du wirst mir geben,
du wirst mir Kummer bereiten. Rock 29 Albedo Rock Drag. Da haben wir's. Und das tun wir
nicht, wir brauchen Metall nicht wirklich. Wir brauchen Rauheit
und wir brauchen Normalität. Also hier ist unsere Rauheit. Warum verschwindet das immer wieder? Normale Karte. Aktiviert. Und wieder müssen
wir sicherstellen
, dass wir das richtige verwenden,
nämlich das normale GL. Und wir haben tatsächlich einen
für Umgebungsokklusion, also lassen Sie uns den einschalten
und sehen, was passiert Stopp. Die Freuden von
Open-Source-Software, manchmal
will sie sich einfach albern verhalten Ordnung. Und wir haben eine Verschiebungs-Map, also ist
es Enable Height. Und dieses Mal mache ich
das ganz normal. Grafiken,
Wüstentexturen, Verschiebung. Okay, Dan, wir gehen
zurück in unsere Arena und wollen
das Material
unseres Bodennetzes für Instanz
drei D festlegen . Also öffne unser Mesh und wir werden das Material ändern. Können wir auf „Laden“ klicken? Nein. Lod. Wüstensträucher. Da haben wir's. Okay, es sieht also ziemlich groß
aus. Und der schnellste Weg, das zu beheben,
besteht darin, die
UV-Skalierung zu ändern Wenn wir also die Textur öffnen
und zur UV-Textur heruntergehen, können
wir hier die Skala ändern Also setzen wir es auf 0,5. Und das ist nicht gut.
Stellen wir es auf 1,5 ein. Das ist ein bisschen besser. Die Beleuchtung ist irgendwie komisch. Wahrscheinlich hat
es etwas mit
dem Sonnenuntergang zu tun , schätze ich Lass uns das ausschalten.
Nein, es ist nicht die Sonne Hmm. Okay, damit wir sehen können, dass hier
tatsächlich etwas
Interessantes vor sich geht Also, was haben wir? Okay, es sieht also so aus, als ob die
Rock 29-Textur schlecht war. Lass uns die Farbe Rock 29 nehmen. Mal sehen, ob das das Problem löst.
Ja, viel besser Okay. Das gefällt mir. Ordnung, jetzt, wo das gut aussieht, können
wir das gleiche
Material wieder für unsere Hügel bereitstellen Und lassen Sie uns das einfach
direkt im Hügel selbst machen, weshalb es wunderbar ist, übernommene
Szenen zu verwenden Also gehen wir zurück zu
Hill und erweitern unser Netz. Und ersetzen wir unsere Ressource, und jetzt können wir schnell laden weil wir sie bereits
verwendet haben, öffnen, bumm. Ordnung. Diese Hügel
sehen besser aus Zumindest was die Textur angeht.
Ich meine, offensichtlich verwenden
wir immer noch ein
sehr ungeeignetes Netz Aber, ähm, in Ordnung,
und natürlich verwenden
unsere Randnetze nicht
dasselbe Material, verwenden
unsere Randnetze nicht weil
wir sie einzigartig gemacht haben,
also müssen wir sie direkt einstellen Und natürlich
sehen sie schrecklich aus. Also müssen wir
unsere UI-Skalierung erneut ändern. Wir setzen das auf eins zurück. Das sieht
immer noch wie Mist aus. Gehen wir zu Nr. Okay, an dieser Stelle müssen
wir
die Texturskalierung
nur in eine Richtung ändern . Also gibt es hier ein kleines
Linksymbol. Wenn du
es anklickst, heißt das, wenn du es änderst und
sicherstellst, dass es weiß ist. Wenn Sie sie alle ändern, bedeutet
das, dass
sie alle geändert werden. Wenn Sie jedoch nicht möchten
, dass dies der Fall ist, klicken
Sie erneut darauf
, sodass es kaputt aussieht. Und in diesem Fall, glaube
ich,
wollen wir nur das X und das Z ändern. Also lass uns sagen, es
verändert alles, nicht
wahr? Und
das wollen wir nicht. Oh, richtig, natürlich,
weil wir dieselben Texturen
verwenden, die wir
vor oder für die anderen Meshes verwendet haben vor oder für die anderen Meshes Also müssen wir sie wieder einzigartig
machen. Und glücklicherweise können wir das
einfach tun, indem wir mit der rechten Maustaste
auf alle klicken, sie erweitern, zum Material gehen und dann „Einzigartig machen“ wählen. Und jetzt sollten wir in der Lage sein, sie zu
reparieren, ohne
alles andere kaputt zu machen. Aber gehen wir zurück zu
unserer ursprünglichen Wüste. Vergewissern Sie sich, dass die
Waage korrekt ist. Ja, sie waren ursprünglich
1,5, was gut war. Und jetzt können wir das
alles hoffentlich ändern. Material B. Jetzt
sollten diese Materialien einzigartig sein. UV eins. Da haben wir's. Das ist die Sache
fünf. Da haben wir's. Das
sieht langsam ein bisschen besser aus. Ordnung. Es ist nicht perfekt Vielleicht können wir 15 machen? Ja, das sieht
unendlich besser aus. Ordnung. Lass uns jetzt unser
Spiel starten und sehen, wie es aussieht Ordnung. Ich denke,
an diesem Punkt sollten
wir
ihn vielleicht aus dem Nebel machen. Aber wo ist der feindliche
Panzer? Da ist er. Die Texturskalierung
ist immer noch etwas schwach. Wir würden für das Material. Okay, lassen Sie uns den
Nebel auf der Kamera oder für
die
Umgebung ausschalten . Oh, das stimmt. Weil es auf der
Kamera
aktiviert ist. Das haben wir gemacht. Gehen wir also zurück zu unserer
ursprünglichen Panzerszene und gehen wir zur Kamera
und schalten einen Z-Nebel aus. Ordnung, jetzt versuchen wir es noch
einmal. Richtig. Sieht viel besser aus.
Offensichtlich wollen wir mit der Richtung der Sonne , denn jetzt
ist alles völlig dunkel. Also lass uns das machen. Gehen wir
zurück zu unserer Spielszene. Und es ist tatsächlich
direktionales Licht in der Arenawelt. Und wir können das in
Ordnung bringen , also wo ist
das Oh, da ist es Da ist der kleine
Pfeil. Da haben wir's. Wenn wir es also nach unten drehen, sodass die Karte jetzt
direkter im Sonnenlicht steht, ziehen
wir es
hierher, damit wir
etwas Schatten bekommen etwas Schatten Okay, das sollte
unendlich besser aussehen. An diesem Punkt kannst du damit
herumspielen, bis
ich das Gefühl habe, ich das Gefühl habe dass die Textur immer noch
ziemlich eklig aussieht Gehen wir zurück zu diesem Punkt. Und wir ändern die
UV-Skala auf drei. Okay. Es sieht besser aus. An diesem Punkt ist es
nur eine Frage des Optimierens, bis es so aussieht Sie es
gerne hätten Wie du siehst,
sieht die Textur auf der Minimap unendlich
besser aus, aber sie ist
hier aufgrund der Größe der
Arena irgendwie abgeflacht und verzerrt hier aufgrund Aber wenn du tatsächlich in die Hügel
gehst, sieht
es viel besser es Aber ja, es ist immer
noch komisch da unten. Wie dem auch sei, damit sind wir
am Ende unseres Kurses angelangt. können ruhig weiter mit den Einstellungen der Texturen und
der Beleuchtung und
allem
herumspielen Texturen und
der Beleuchtung und , bis Sie
etwas bekommen, das Ihnen gefällt, denn an diesem
Punkt wird, wie
gesagt, denn an diesem
Punkt wird, wie
gesagt, buchstäblich nur noch nach Geschmack angepasst Ich hoffe, Ihnen hat dieser
Kurs gefallen und Sie haben
sich mit mir die Grundlagen der
Drei-D-Entwicklung in Godot angesehen Wir sehen uns
beim
38. Exportieren Ihres Spiels: Lass uns einen kurzen
Blick darauf werfen, wie du
dein Spiel exportierst , damit andere Leute dein Meisterwerk spielen
können. Du exportierst
dein Spiel unter Projektexport und musst
die entsprechenden Voreinstellungen
für dein System herunterladen die entsprechenden Voreinstellungen
für dein System Wenn ich also zum Beispiel auf den Windows-Desktop exportieren
möchte , würde
ich auf die Schaltfläche Hinzufügen klicken
und Windows Desktop auswählen Und wenn
wir dann keine
Voreinstellungen zur Verfügung haben,
erfahren wir natürlich wir dann keine
Voreinstellungen zur Verfügung haben, , dass
im erwarteten Pfad
keine Exportvorlagen verfügbar sind im erwarteten Pfad
keine Exportvorlagen verfügbar Wir
müssten sie also herunterladen, Exportvorlagen
verwalten, sie Exportvorlagen
verwalten vom
besten verfügbaren Mirror
herunterladen und installieren Und sobald das erledigt ist,
sollten Sie in der Lage sein, Ihr Projekt zu
exportieren. Sie können bei Bedarf alle verfügbaren
Einstellungen ändern . Sie können beispielsweise ein Symbol
hinzufügen oder andere Dinge ändern
. Wenn Sie jedoch nicht wirklich wissen, was eine
dieser Einstellungen bedeutet, ist
es völlig in Ordnung,
sie als Standard beizubehalten.
39. Klassenprojekt: Erstellen Sie Ihr eigenes 3D-Spiel: Es ist Zeit, alles, was
Sie gelernt haben, in die Praxis umzusetzen. Für das Klassenprojekt erstellst du
deine eigene Version des Spiels Zone Battle mit den Systemen, die wir
in diesem Kurs entwickelt haben. Das Ziel ist nicht,
alles perfekt zu kopieren, sondern die Kernkonzepte anzuwenden und das Projekt zu deinem eigenen zu machen. Ihr Projekt kann
einen spielbaren Panzer mit Bewegungs
- und Turmsteuerung,
eine 3D-Umgebung
mit Beleuchtung,
Gegner mit grundlegendem KI-Verhalten,
Soundeffekte und Benutzeroberflächenelemente
wie Punktestand oder Minikarte beinhalten einen spielbaren Panzer mit Bewegungs
- und Turmsteuerung,
eine 3D-Umgebung
mit Beleuchtung, Gegner mit grundlegendem KI-Verhalten, Gegner mit grundlegendem KI-Verhalten, Soundeffekte und Benutzeroberflächenelemente
wie Punktestand oder Du kannst das Projekt gerne
anpassen. Sie werden sogar dazu ermutigt. Ändert das Level-Layout,
passt das Verhalten der Gegner an. Experimentieren Sie mit Materialien oder
fügen Sie Ihre eigenen kleinen Funktionen hinzu. Wenn du bereit bist,
lade Screenshots oder einen kurzen Gameplay-Clip
deines Projekts in die
Projektgalerie hoch. Du kannst auch eine kurze
Beschreibung hinzufügen, was du
gebaut hast und welche Teile du am interessantesten
oder herausforderndsten fandest. Ich werde die Projekte überprüfen
und Feedback geben. Ich freue mich darauf, deine Spiele
zu sehen.
40. Wir gratulieren!Was kommt als nächstes?: Herzlichen Glückwunsch. Du hast
es bis zum Ende des Kurses geschafft. Sie haben gelernt, in Gdo
zu arbeiten, drei D-Räumen
zurechtzufinden, Umgebungen zu
erstellen, Physik, Steuerung, KI,
Audio, Benutzeroberfläche und
Spielsysteme zu
implementieren . Sicherlich eine Menge Und du hast all diese Teile zu einem
kompletten Drei-D-Spiel
zusammengefügt. Noch wichtiger ist, dass Sie jetzt
verstehen, wie GidObjects strukturiert
sind und wie verschiedene Systeme
miteinander kommunizieren Diese Grundlage ermöglicht
es Ihnen, selbstständig
weiter zu lernen und zu
experimentieren Vielen Dank, dass du an diesem Kurs teilgenommen und zusammen mit mir etwas kreierst Ich freue mich darauf zu sehen, was du Nächstes auf
deiner
Reise in die Spieleentwicklung vorantreiben wirst. Viel Glück und viel Spaß beim Erstellen.