Godot 3D-Spielentwicklungs-Masterclass: Erstellen Sie ein Panzerkampfspiel | Skillademia Academy | Skillshare

Playback-Geschwindigkeit


1.0x


  • 0.5x
  • 0.75x
  • 1x (normal)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

Godot 3D-Spielentwicklungs-Masterclass: Erstellen Sie ein Panzerkampfspiel

teacher avatar Skillademia Academy, Creative Skills for the Future

Schau dir diesen Kurs und Tausende anderer Kurse an

Erhalte unbegrenzten Zugang zu allen Kursen
Lerne von Branchenführern, Ikonen und erfahrenen Experten
Wähle aus einer Vielzahl von Themen, wie Illustration, Design, Fotografie, Animation und mehr

Schau dir diesen Kurs und Tausende anderer Kurse an

Erhalte unbegrenzten Zugang zu allen Kursen
Lerne von Branchenführern, Ikonen und erfahrenen Experten
Wähle aus einer Vielzahl von Themen, wie Illustration, Design, Fotografie, Animation und mehr

Einheiten dieses Kurses

    • 1.

      Willkommen zur Godot 3D Masterclass!

      1:02

    • 2.

      Installation von Godot

      1:40

    • 3.

      Projektübersicht: Zone Battle

      3:44

    • 4.

      Navigieren in Godot: Hauptfenster, Szenenbaum und Inspektor

      4:46

    • 5.

      Navigieren in Godot: Das Spielfenster und grundlegende Navigation im 3D-Weltraum

      5:37

    • 6.

      Primitive und 3D-Raum – Rotation, Skalierung, Translation

      14:36

    • 7.

      Materialien

      7:51

    • 8.

      Erstellen komplexer Objekte aus Primitiven: der Tank

      26:30

    • 9.

      Aufbau des Playfields

      16:03

    • 10.

      Der Camera3D-Knoten

      8:44

    • 11.

      Vektoren

      12:11

    • 12.

      Der CharacterBody3D-Knoten

      10:44

    • 13.

      Reaktion auf Spielereingaben – Bewegung

      26:53

    • 14.

      Reaktion auf Spielereingaben – Steuerung des Turms

      10:54

    • 15.

      Kollision

      13:25

    • 16.

      Der Knoten RigidBody – Auslösen einer Shell

      53:09

    • 17.

      Umwelt: Weltbeleuchtung und die globale Sonne

      6:35

    • 18.

      Gameplay: Hinzufügen feindlicher Panzer über geerbte Szenen

      5:13

    • 19.

      Zerstörung der Panzer

      6:46

    • 20.

      KI: Staatsmaschinen

      16:33

    • 21.

      Hinzufügen eines Zustandsrechners zum gegnerischen Panzer über ECS

      50:35

    • 22.

      Hinzufügen einer Staatsmaschine zum gegnerischen Panzer über ECS Pt. 2.  

      22:19

    • 23.

      SFX: 3D-Audio

      12:49

    • 24.

      Grundlegende Benutzeroberflächenebenen

      14:34

    • 25.

      Ereignisse und Signale der Benutzeroberfläche – Bewertung

      18:27

    • 26.

      Erstellen einer Minimap

      6:52

    • 27.

      3D-Benutzeroberfläche mit Label3D-Knoten

      3:42

    • 28.

      Startmenü

      12:54

    • 29.

      Pause-Menü

      6:37

    • 30.

      Spielmanager: Anfangs-/Endzustände

      31:37

    • 31.

      Gegnerische Spawn-System

      53:16

    • 32.

      Wechselnde Kameraperspektiven

      8:33

    • 33.

      Bessere Explosionen mit Partikeleffekten

      28:49

    • 34.

      Neustrukturierung Ihrer Tanks: Überarbeitung der Materialien

      5:30

    • 35.

      Aufkleber

      4:01

    • 36.

      Importieren externer Modelle

      9:45

    • 37.

      Upgrade des Ebengeländes

      21:15

    • 38.

      Exportieren Ihres Spiels

      1:28

    • 39.

      Klassenprojekt: Erstellen Sie Ihr eigenes 3D-Spiel

      0:47

    • 40.

      Wir gratulieren!Was kommt als nächstes?

      0:32

  • --
  • Anfänger-Niveau
  • Fortgeschrittenes Niveau
  • Fortgeschrittenes Niveau
  • Jedes Niveau

Von der Community generiert

Das Niveau wird anhand der mehrheitlichen Meinung der Teilnehmer:innen bestimmt, die diesen Kurs bewertet haben. Bis das Feedback von mindestens 5 Teilnehmer:innen eingegangen ist, wird die Empfehlung der Kursleiter:innen angezeigt.

9

Teilnehmer:innen

1

Projekt

Über diesen Kurs

Godot ist zu einer der spannendsten Open-Source- Spiele-Engines geworden, die heute erhältlich sind - leistungsstark, flexibel und völlig kostenlos. Mit der Veröffentlichung von Godot 4 ist die Echtzeit-3D-Entwicklung leistungsfähiger denn je. Dadurch können komplette Spiele erstellt werden, ohne auf proprietäre Tools angewiesen zu sein.

In diesem Kurs lernen Sie die Entwicklung von 3D-Spielen von Grund auf kennen, indem Sie ein komplettes, spielbares Projekt namens Zone Battle erstellen. Dieser Kurs konzentriert sich nicht auf isolierte Demos, sondern auf reale Systeme, die in tatsächlichen Spielen eingesetzt werden – von Bewegung und Kampf bis hin zu Benutzeroberfläche, KI, Audio und Export.

Zunächst installieren wir Godot und machen uns mit dem Editor, den Szenen, den Knoten und der 3D-Navigation vertraut. Von dort aus erstellen Sie Spiel-Assets mit Hilfe von Primitiven, erstellen Materialien, richten Kameras, Beleuchtung und Umgebungen ein und erwecken alles mit Physik und Spielersteuerung zum Leben.

Während das Projekt wächst, implementieren Sie Spielsysteme wie das Spawnen von Feinden, Panzer-KI mit Zustandsmaschinen, Kollisions- und Schießmechaniken, Punktebewertung, Menüs, Minimaps, Soundeffekte und Partikelexplosionen. Außerdem erfahren Sie, wie Sie ein Spiel mithilfe von Managern, übernommenen Szenen und wiederverwendbaren Komponenten richtig strukturieren.

Dieser Kurs wird mit Godot Version 4.3 stable unterrichtet. Die Techniken, die Sie erlernen werden - Szenenorganisation, Physik, KI-Logik, Benutzeroberflächensysteme und Spielarchitektur - sind jedoch grundlegende Fähigkeiten, die für verschiedene Godot-Versionen gelten.

Am Ende des Kurses werden Sie nicht nur verstehen, wie Godot funktioniert, sondern auch Ihr eigenes komplettes 3D-Spiel erstellt und exportiert haben und eine solide Grundlage für die weitere Entwicklung Ihrer eigenen Projekte erworben haben.


Was Sie lernen werden

  • Navigieren und Verwenden des Godot-Editors für 3D-Projekte
  • Kernkonzepte für 3D: Transformationen, Materialien, Kameras, Beleuchtung und Physik
  • Erstellen komplexer Objekte und Umgebungen aus einfachen Primitiven
  • Spielerbewegungen, Turmsteuerung, Schieß- und Kollisionssysteme
  • Erstellen feindlicher KI mit Zustandsrechnern und ECS-ähnlicher Logik
  • Hinzufügen von Soundeffekten, Benutzeroberflächen, Bewertungssystemen, Minimaps und Menüs
  • Arbeiten mit Partikeln, Aufklebern, externen Modellen und Geländeverbesserungen
  • Strukturierung eines kompletten Spiels mit Managern, Spawnern und Staaten
  • Exportieren des fertigen 3D-Spiels

Anforderungen

  • Ein Computer, auf dem Godot 4.x ausgeführt werden kann
  • Godot installiert (kostenloser Download)
  • Keine Godot-Vorkenntnisse erforderlich
  • Neugier auf grundlegende Programmierung oder Spieleentwicklung ist hilfreich, aber nicht erforderlich

Für wen dieser Kurs geeignet ist

  • Einsteiger, die die Entwicklung von 3D-Spielen von Grund auf lernen möchten
  • Godot-Benutzer wechseln von 2D zu 3D
  • Indie-Entwickler erforschen Godot 4
  • Teilnehmer:innen und Teilnehmer:innen des Spieldesigns
  • Entwickler, die eine umfassende, projektbasierte Lernerfahrung wünschen

Triff deine:n Kursleiter:in

Teacher Profile Image

Skillademia Academy

Creative Skills for the Future

Kursleiter:in

NEW CLASS: Figma Beginner Masterclass: Learn UI Design Step by Step

Figma can feel intimidating when you first open it.

There are so many tools, panels, and features that many beginners don't know where to start, or what actually matters when designing an interface.

That's exactly what this class is designed to solve.

In this beginner-friendly class, we'll build a complete UI project together while learning the fundamentals of Figma step by step. You'll learn how to structure layouts, work with typography and colors, organize your designs, and create simple interactive prototypes.

The focus isn't just on learning the software, but on understanding the workflow behind modern UI design in a practical and approachable way.

If you'... Vollständiges Profil ansehen

Level: Beginner

Kursbewertung

Erwartungen erfüllt?
    Voll und ganz!
  • 0%
  • Ja
  • 0%
  • Teils teils
  • 0%
  • Eher nicht
  • 0%

Warum lohnt sich eine Mitgliedschaft bei Skillshare?

Nimm an prämierten Skillshare Original-Kursen teil

Jeder Kurs setzt sich aus kurzen Einheiten und praktischen Übungsprojekten zusammen

Mit deiner Mitgliedschaft unterstützt du die Kursleiter:innen auf Skillshare

Lerne von überall aus

Ob auf dem Weg zur Arbeit, zur Uni oder im Flieger - streame oder lade Kurse herunter mit der Skillshare-App und lerne, wo auch immer du möchtest.

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.