Inventar und Shops in Godot! | Thomas Yanuziello | Skillshare

Playback-Geschwindigkeit


1.0x


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

Inventar und Shops in Godot!

teacher avatar Thomas Yanuziello, Indie Game Developer

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.

      Promo

      1:38

    • 2.

      Münzen

      14:38

    • 3.

      Polisch

      16:41

    • 4.

      Abholen

      17:39

    • 5.

      Inventar

      15:34

    • 6.

      Gegenstände

      15:21

    • 7.

      Verbrauchsmaterialien

      17:32

    • 8.

      Ausrüstung

      12:11

    • 9.

      Shop

      13:43

    • 10.

      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.

47

Teilnehmer:innen

--

Projekt

Über diesen Kurs

Dieser Kurs ist eine Fortsetzung der Grundlagen der Spielentwicklung in Godot.

Klicke auf meinen Website-Link in meinem Profil, um unserem Discord-Server beizutreten!

In diesem Kurs behandeln wir verschiedene Methoden der Aufnahme von Gegenständen, der Verwaltung der Inventardaten der Spieler, der Anzeige ihres Inventars auf der Benutzeroberfläche in einem Menü, der Ermöglichung des Spielers, die Interaktion mit ihrem Inventar auf verschiedene Weise zu ermöglichen, und der Handel mit Gegenständen mit NPCs.

Sie lernen auch nützliche Fähigkeiten für die Arbeit mit der Godot Spielengine, die Organisation und das Design Ihrer Projekte, um skalierbarer zu sein.  Sie lernen, wie man mit GDscript programmiert und alles wird detailliert erklärt.  Unsere Skripte werden so geschrieben, dass sie hochgradig anpassbar und wiederverwendbar sind.  Alle Projektdateien sind auch auf GitHub verfügbar, wenn Sie das Projekt nach Abschluss der einzelnen Kurseinheit so überprüfen müssen, wie es war.  Diese Videos wurden mit Godot Version 4.2.2 aufgenommen.

Dieser Kurs ist Teil einer Serie, die mundgerechte Spielentwicklungsstücke beibringt, die alle austauschbar untereinander verwendet werden können.  Also lass mich wissen, welche Arten von Spielen du interessant bist, wie man macht, und ich werde versuchen, sie in zukünftige Kurse in dieser Serie aufzunehmen.

Triff deine:n Kursleiter:in

Teacher Profile Image

Thomas Yanuziello

Indie Game Developer

Kursleiter:in
Level: All Levels

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. Promo: Willkommen zu meinem Kurs über Inventar und Geschäfte in Gado. Dieser Kurs ist eine Fortsetzung des Dialogs und der Ereignisse in Gado, kann aber verfolgt und auf jedes Projekt angewendet werden , bei dem es darum geht, Gegenstände zu sammeln, zu einem Inventar hinzuzufügen, Gegenstände aus einem Inventarmenü fallen zu lassen, zu verwenden oder auszurüsten und Gegenstände mit einem MPC Du kannst gerne unserem Discord-Server beitreten, um mit deinen Kollegen an diesem Kurs zu arbeiten In diesem Kurs werden wir uns mit verschiedenen Methoden befassen, um Gegenstände einzusammeln, Inventardaten der Spieler zu verwalten, ihr Inventar auf der Benutzeroberfläche in einem Menü anzuzeigen, es dem Spieler zu ermöglichen, auf unterschiedliche Weise mit seinem Inventar zu interagieren , und Gegenstände mit NPCs zu tauschen Wenn du fertig bist, hast du ein einfaches Inventarsystem für dein Spiel , das in seiner Darstellung und Funktion leicht anpassbar ist in seiner Darstellung und Funktion Sie werden auch nützliche Fähigkeiten erlernen um mit der Gada-Game-Engine zu arbeiten und Ihre Projekte so zu organisieren und zu gestalten, organisieren und zu gestalten dass sie skalierbarer sind Sie werden lernen, wie man mit dem GD-Skript programmiert, wobei alles ausführlich erklärt wird Wir werden objektorientierte Designprinzipien in unseren Skripten, Vererbung, Kapselung, Abstraktion und Polymorphie anwenden in unseren Skripten, Vererbung, Kapselung, , um sie für ein Projekt jeder Größe organisiert, anpassbar und wiederverwendbar zu halten für ein Projekt jeder Größe organisiert, anpassbar und wiederverwendbar Alle Projektdateien sind auch auf GitHub verfügbar, falls Sie das Projekt so überprüfen möchten, wie es nach Abschluss jeder Lektion war Diese Videos wurden mit Geoversion 4.2 0.2 aufgenommen. Das Projekt beginnt mit Inhalten aus K Kits, Charakteren- und Dungeon-Remaster-Paketen Basic Guy-Paket von Penzilla und Icons von Shakahi und Alle können dort kostenlos heruntergeladen werden. Soundeffekte von Valensbyer sind ebenfalls enthalten und auf freesound.org verfügbar 2. Münzen: Hallo, Freunde. Bevor wir anfangen, solltest du in deinem Projekt ein Spiel gesehen haben, das einen Charakter enthält , den der Spieler kontrollieren kann , und ein Level, in dem er herumlaufen kann. Du solltest mindestens einen weiteren Charakter haben als Ladenbesitzer fungiert, sowie Vermögenswerte für Münzen und Gegenstände, die der Spieler aufsammeln, benutzen und ausrüsten Während dieses Kurses geben wir dem Spieler ein Inventar, mit dem er sein Geld und seine Gegenstände im Auge behalten, sie auf der Benutzeroberfläche anzeigen, Verbrauchsgüter verwenden, den Charakter mit Gegenständen ausstatten und sie von NPCs kaufen oder verkaufen Du kannst dein eigenes Projekt verwenden , um diesen Kurs zu verfolgen, oder ein Starterprojekt mit dem Titel Godo Inventory course, Main branch von meinem GitHub herunterladen dem Titel Godo Inventory course, Main Ihr Projekt kann zwei D oder drei D sein und fast jedes Spielgenre, bei dem der Charakter Geld und/oder Gegenstände in einem Inventar hat und mit NPCs handeln kann Beginnen wir damit, eine Variable hinzuzufügen, um die Währung des Spielers in seiner Speicherdatei zu verfolgen , die in diesem Projekt die Fortschrittsressource ist Die Variablen werden exportiert, sodass sie serialisiert und gespeichert werden Nennen wir es Münzen. Es wird eine Ganzzahl mit einem Standardwert von Null sein. Als Nächstes zeigen wir diese Informationen mithilfe eines Label-Nodes auf der Leinwand an. Nachdem Sie die Schriftart und Schriftgröße festgelegt haben, empfiehlt es sich, zu entscheiden, wie groß eine Zahl sein soll, die empfiehlt es sich, zu entscheiden, wie groß eine Zahl sein soll, die angezeigt werden soll, mit einer Platzhalterzahl zu experimentieren Summenlimit von 10 Millionen. Es wäre schön, ein Symbol neben dieser Zahl zu haben , um dem Spieler mitzuteilen, was es bedeutet Mithilfe eines texturzerstörten Knotens, mit einem Münzsymbol gefüllt ist, können wir beide als Kinder eines horizontalen Kastencontainers platzieren , um sie für uns zu arrangieren Lassen Sie uns das Wallet des übergeordneten Knotens umbenennen. Und verschiebe es so, dass es hinter der Fassade ist. Ich denke, der Münzzähler sieht am besten in der oberen linken Ecke aus , wo er bereits verankert ist, aber mit 32 Pixeln Abstand zum Fensterrand das Symbol zu groß ist, Da das Symbol zu groß ist, ändere ich den Streckmodus um das Seitenverhältnis beizubehalten Seitenverhältnis beizubehalten, und lasse es automatisch an die Breite proportional zur Höhe anpassen Breite proportional zur Höhe Die Höhe des übergeordneten Containers wird zurückgesetzt. Sie wird nun anhand der Schriftgröße des Labelknotens festgelegt, die offenbar 42 Pixel beträgt Die Höhe des Symbols wird ebenfalls 42 Pixel betragen, sodass bei einem Seitenverhältnis von eins zu eins auch die Breite des Symbols auf 42 festgelegt wird. Außerdem werde ich den Text vertikal zentrieren und der Zahl einen schwarzen Rand mit 16 Punkten hinzufügen einen schwarzen Rand mit 16 Punkten , der dem Umriss um das Symbol entspricht. ich vorausschauend denke, möchte ich, dass das Symbol leicht pulsiert , wenn sich die Zahl ändert. Setzt den benutzerdefinierten Y-Wert für die Mindestgröße auf 42. Klicken Sie darauf und ziehen Sie ihn nach rechts, sehen, welche Auswirkungen das Erhöhen und anschließende Verringern dieses Werts im Laufe der Zeit hat. das schnell machen, können wir sehen, wie sich ein schneller, aber subtiler Pulseffekt auswirkt, auch das Etikett leicht verschiebt und so die Aufmerksamkeit des Spielers Außerdem möchte ich, dass der Canvas keine irrelevanten Informationen enthält, während der Spieler das Spiel spielt Also werden wir den Geldzähler verstecken, wenn er nicht benötigt wird. Auswahl des Wallet-Knotens. Wir können auf den Y-Wert für die Position klicken und ihn ziehen , um zu sehen, wie er sich vom Bildschirm nach oben bewegen kann , um sich auszublenden, und wieder nach unten, um sich selbst zu zeigen. Lassen Sie uns die Wallet in ihrer geschlossenen Position starten, wo ihr Wert für Position Y dem Wert für Größe Y entspricht, aber negativ ist. Nachdem wir das Wallet angezeigt haben, können wir mithilfe eines Timer-Knotens einen Timer starten, um es nach einer gewissen Zeit automatisch auszublenden . Nennen wir es Auto Hide und setzen seine One-Shot-Eigenschaft auf true, sodass es nur einmal herunterzählt, wenn es dazu aufgefordert wird , um die Demonstration kurz zu halten. Ich verstecke die Brieftasche nach nur 3 Sekunden automatisch. diesem Knoten ein Skript hinzufügen, nennen wir es Counter und speichern es im UI-Skriptordner. Es kann von der Steuerung erben, da es keine Verhaltensweisen des horizontalen Box-Containers benötigt Wir benötigen Verweise auf alle untergeordneten Notizen, die während der Bereitstellungsphase Und eine private Tween-Variable. Öffentliche Funktionen werden verfügbar sein , die diese Notiz anweisen, zu öffnen oder zu schließen, das Tween-Finish-Signal zurückgegeben wird, wenn der Vorgang abgeschlossen ist, und eine Funktion, mit der der Wert des Zählers festgelegt Das Öffnen des Zählers wird erreicht, indem seine Y-Position auf positive 32 gesetzt wird, und wenn er geschlossen wird, wird das Gleiche dem negativen Punkt Y erreicht. Es wäre eine gute Idee, diese als Variablen zu exportieren , um das Skript für andere Zähler wiederverwendbar zu machen für andere Zähler wiederverwendbar Durch Hinzufügen von Variablen für die Position auf dem Bildschirm und die Position außerhalb des Bildschirms, beide als Vektor zwei, kann O-Pen nun die Position der Knoten so ändern, dass sie auf dem Bildschirm sind, und Tweens außerhalb des Bildschirms schließen Umwandlung des Float-Arguments in einen zweiten Vektor. Tweening der Position des Knotens, Annahme einer neuen Position als Vektor-Zwei-Parameter und Rückgabe des fertigen Tween-Signals Wir prüfen zunächst, ob ein Tween existiert und ausgeführt wird. Wenn ja, töte ihn und erstelle einen neuen. Wir können dann die Position der Knoten miteinander verbinden, um die neue Position im Laufe der Zeit zu erreichen Lassen Sie uns dies als eine weitere Variable exportieren und ihr einen Standardwert von 1 Sekunde geben Denken Sie daran, die Werte für die Positionen auf dem Bildschirm und außerhalb des Bildschirms dieses Kontrollknotens im Inspektor Um den Wert festzulegen, benötigen wir einen neuen Wert , der eine Ganzzahl sein sollte Wir werden die Texteigenschaft des Label-Nodes so einstellen dieser Ganzzahl entspricht, nachdem wir ihren Typ in eine Zeichenfolge umgewandelt haben, sie aber auf einen Wert zwischen Null und dem Höchstwert, den Käufer anzeigen können , festgesetzt haben. Aber zuerst sollten wir überprüfen, ob der Zähler gerade angezeigt wird, und wenn nicht, warten wir, bis die Funktion geöffnet ist. Dafür benötigen wir eine boolesche Variable, uns mitteilt, ob der Zähler gerade geöffnet ist oder nicht wird während der Öffnungsfunktion auf true gesetzt, aber erst, nachdem das Tween Sie dann auch auf die Pulsanimation des Symbols, bevor Sie die tatsächliche Zahl aktualisieren Oder Sie können hier die Gewichtung weglassen, damit der Puls und die Zahl gleichzeitig aktualisiert werden eine Impulsfunktion hinzufüge und das Signal „Tween fertig“ zurückgebe, das Signal „Tween fertig“ zurückgebe nachdem ich die üblichen Tween-Prüfungen durchgeführt habe, setze ich die Eigenschaft „Tween“ einfach so ein, dass das Minimum der Y-Eigenschaft der Symbole etwas habe, setze ich die Eigenschaft „Tween“ einfach so ein, dass das Minimum der Y-Eigenschaft der Symbole Minimum der Y-Eigenschaft Sagen wir 46 Pixel. Über eine Dauer von einer Zehntelsekunde, dann im gleichen Zeitraum wieder auf die ursprüngliche Größe exportieren Wenn wir möchten, können wir auch Variablen für die Dauer und Größe des Pulses Beachten Sie, dass aufgrund der von mir verwendeten Knoteneinstellungen Verkleinern des Symbols auf einen Wert von weniger als 42 Pixeln ignoriert wird Sie können den Typ des horizontalen Felds jederzeit so ändern , dass es sich um einen normalen Kontrollknoten handelt, und die untergeordneten Knoten manuell positionieren, wenn Sie mehr Flexibilität wünschen den Auto-Hid-Timer-Knoten auswählen, können wir sein Timeout-Signal mit der Schließfunktion des Zählers verbinden . Wenn Sie ihn aus der Liste auswählen, zeigt der grüne Pfeil, dass die Funktion einem Signal verbunden ist. Manchmal möchten wir vielleicht die Funktion zum automatischen Ausblenden deaktivieren. Fügen wir diese Funktionalität mit einem optionalen booleschen Parameter namens stay open hinzu, der standardmäßig dies in einer lokalen Variablen mit demselben Namen speichern, können wir dies als Bedingung verwenden bevor wir den Timer zum automatischen Ausblenden aufrufen, das Verhalten beim automatischen Ausblenden deaktivieren und diesen Zähler Wenn wir dies in einer lokalen Variablen mit demselben Namen speichern, können wir dies als Bedingung verwenden, bevor wir den Timer zum automatischen Ausblenden aufrufen, das Verhalten beim automatischen Ausblenden deaktivieren und diesen Zähler geöffnet lassen. Wenn beim Einstellen des Zählerwerts der Zähler noch nicht geöffnet ist, liegt es nahe, dass dem Zähler nicht gesagt wurde, dass er geöffnet bleiben soll Wir sollten also auf das Öffnen warten und False als Argument übergeben , um das automatische Ausblenden auszulösen, und beim Schließen Is Open wieder auf False setzen. Wechseln wir nun zur Level-Szene und erstellen einen Stapel Münzen, den der Spieler einsammeln kann. Beginnend mit einem Aa-Drei-D-Knoten nennen wir ihn Coin Stack Small. Ziehen Sie dann das Modell-Asset auf den D-Node Area Three , um es als untergeordnetes Objekt hinzuzufügen. rechten Maustaste auf den Münzstapel und wählen Sie Make Local aus, um diesen Knoten vom importierten Asset zu trennen, sodass es sich lediglich um eine lokale Kopie nicht um einen Verweis auf das Asset. Jetzt können wir nur den Mesh-Instanz-D-Knoten extrahieren , der den Münzstapel zeichnet , und alles andere entfernen. Achten Sie darauf, dass die Münzen sauber auf dem Boden liegen, und passen Sie gegebenenfalls Ihre Perspektive Als Nächstes fügen wir eine Kollisionsform für den D-Knoten des Bereichs drei hinzu Ich verwende eine Kugel, gebe ihr einen Radius , der sie ausreichend umgibt, und schiebe sie über den Boden. Fügen wir diesem Coin-Stapel ein neues Skript hinzu, das Coin Stack genannt wird. Ich lege es in den Ordner mit den Event-Skripten. T. Und lass es von Proximity Event erben, um automatisch auf Kollisionen mit dem Spieler zu reagieren Weitere Informationen zu Ereignissen finden Sie im Kurs „Dialog und Ereignisse“ der Reihe Lassen Sie uns eine Variable für die Anzahl der Münzen , die sich im Stapel befinden, als Ganzzahl mit einem Standardwert von zehn exportieren die Anzahl der Münzen , die sich im Stapel befinden, . können wir diesen Wert auch so einschränken, dass er innerhalb eines Bereichs enthalten Mithilfe des Export-Bereichs-Tags können wir diesen Wert auch so einschränken, dass er innerhalb eines Bereichs enthalten ist, indem wir einen Mindest - und Höchstwert angeben, indem wir einen Mindest - und Höchstwert angeben für diese Variable zulässig ist. Ein Stapel Münzen sollte nicht leer sein, also wäre der Mindestwert eins, und ich setze den Höchstwert einfach auf 10 Millionen. eine Definition für den Eventmanager bereitstellen , um die Ereignisfunktion des Skripts aufzurufen , den Eventmanager als Parameter akzeptieren, brauchen wir ihn nicht zu verwenden, sodass mit einem Unterstrich fortgefahren werden kann Wir müssen die Fortschrittsvariable auf plus den Wert dieses Münzstapels setzen auf plus den Wert dieses Münzstapels ihn dann mit Q free vernichten Außerdem müssen wir die Funktion „Ein Körper eingegeben“ überschreiben , um dem Spielleiter mitzuteilen, dass er den Spielerknoten während dieses Events nicht deaktivieren soll . Lassen Sie uns diesen Münzstapel zu einer eigenen Szene machen, ihn im Szenenordner speichern und einen neuen Unterordner für Objekte erstellen. Dann verschiebe den Stapel von der Startposition des Spielers weg . Das Letzte, was wir tun müssen, ist die Benutzeroberfläche zu aktualisieren, wenn die Münzen eingesammelt werden. Es wird wahrscheinlich eine Menge Münzen im Spiel geben und wir wollen ihre Signale nicht manuell verwalten . Das wäre Zeitverschwendung. Eine einfache Möglichkeit, dies zu erreichen , besteht darin, automatisch geladene Signale zu verwenden. ein neues automatisches Ladeskript erstellen, nennen wir es global und geben ihm ein Signal namens Coins Date mit einem Integer-Parameter für die Menge der neuen Münzen. Dieses Skript ist auch nützlich , um Werte für häufig verwendete Variablen in verschiedenen Skripten Ihres Projekts bereitzustellen häufig verwendete Variablen in , insbesondere für Variablen, die nicht vom Spieler in den Spieleinstellungen angepasst werden sollen . Wir können dann das globale Skript zur Liste der automatisch geladenen Knoten in den Projekteinstellungen hinzufügen . Das an unsere Wallet angehängte Counter-Skript kann nun die Ready-Funktion verwenden , um dieses Signal mit seiner Sollwertfunktion zu verbinden . Das Label auf der Benutzeroberfläche wird so eingestellt, dass es dem Argument entspricht das über das vom globalen Autoload ausgegebene Signal übergeben wurde. Und initialisiere den Wert auch mit dem, was in der Speicherdatei des Spielers gespeichert ist in der Speicherdatei des Spielers gespeichert wenn das Spiel zum ersten Mal geladen wird Dies ist jedoch kein wiederverwendbares Skript mehr. Geben wir ihm also einen Klassennamenzähler. Erstellen Sie dann ein neues Skript namens Wallet, das vom Zähler geerbt wurde. wird es mit dieser Ready-Funktion direkt an die Münzen des Spielers gebunden der Wand befestigte Skript wird ersetzt , indem es auf den Knoten gezogen Das Zählerskript kann jetzt verwendet werden , um alles zu zählen, was auf dem UY angezeigt wird, wie zum Beispiel Schlüssel oder Heiltränke Im Fortschrittsskript können wir, indem wir der Coins-Variablen eine Setter-Funktion hinzufügen, indem wir der Coins-Variablen eine Setter-Funktion hinzufügen, anweisen, dass dieses Signal automatisch ausgegeben wird, wenn sich der Wert ändert Mit einer if-Anweisung können wir sicherstellen, dass die Zahl nicht auf das gesetzt wird, was sie bereits war. Lass es uns ausprobieren. Wenn wir zu den Münzen gehen, verschwinden sie. Die Brieftasche erscheint mit dem Saldo Null , der pulsiert und auf zehn aktualisiert wird. Nach einer Wartezeit von drei Sekunden versteckt sich die Brieftasche dann von selbst Wir haben jetzt Münzen, die der Spieler einsammeln und auf der Leinwand des Spiels im Auge behalten kann und auf der Leinwand des Spiels im Auge behalten In der nächsten Lektion werden wir visuelle und akustische Effekte hinzufügen , um das Erscheinungsbild dieser Spielmechaniken zu verbessern . Wir sehen uns in der nächsten Lektion. 3. Polisch: Hallo Freunde. In der vorherigen Lektion haben wir unserem Spiel Sammelmünzen hinzugefügt In dieser Lektion werden wir alle Arten von Spezialeffekten verwenden, um den Prozess des Münzsammelns zu verbessern und ihn angenehmer zu gestalten. Ausgehend vom Counter-Skript können wir dem Verhalten unserer Tweens eine Vielzahl von Effekten hinzufügen , indem wir Übergänge und Beschleunigungen verwenden, die verändern, wie sich die Eigenschaft im Laufe der Zeit verändert Lassen Sie uns eine Variable vom Typ Tween-Übergang exportieren. Und legen Sie sie bei der Erstellung des Tweens fest. Wenn Sie sich den Inspektor ansehen, ist das Standardverhalten ein linearer Übergang, dem sich die Eigenschaft im Laufe der Zeit gleichmäßig ändert Wir können es jedoch auf verschiedene Optionen ändern. Wenn ich mir diese Grafiken ansehe, denke ich, dass es gut aussehen würde, wenn der Zähler den elastischen Übergangstyp verwenden würde. Und jede dieser Methoden kann auch mit einer Lockerung kombiniert werden, indem sie auf die obere Hälfte des Tweens oder auf die ausgehende Hälfte oder beides Anstatt den Beschleunigungstyp zu exportieren, möchte ich, dass verschiedene Beschleunigungen auf die geöffneten und geschlossenen Funktionen angewendet werden Da es Sinn machen würde, den elastischen Effekt auf dem Bildschirm abzuspielen, habe ich die offene Funktion und die geschlossene Funktion aktiviert übergeben den offenen geschlossenen Funktionen an jedem Fall wird der Easing-Typ von den offenen geschlossenen Funktionen an die Tween-Positionsfunktion In der Münzstapel-Szene können wir warten, bis der Stapel schrumpft, bevor wir ihn zerstören, anstatt dass er während der Bereitschaftsphase einen Verweis auf das Chaos schnappen, können wir das Netz mit einem Tween anweisen, zu schrumpfen Da es keine Möglichkeit gibt dieses Tween mehr als einmal verwendet werden kann, brauchen wir uns darüber keine Gedanken zu machen. Erstelle einfach das Tween Ich verwende denselben elastischen Übergangstyp und setze die Maschen-Skalierungseigenschaft über einen kurzen Zeitraum auf Null und gebe das Signal zurück Aber wir müssen sicherstellen, dass der Spieler während des Tweens nicht erneut mit diesem Bereich kollidiert während des Tweens Deaktivieren wir es also, indem wir dem Proximity-Event-Skript eine Funktion hinzufügen , die die Kollisionsmaske auf Null setzt Wir können auch zusätzlichen Feinschliff hinzufügen, indem einen Audio-Stream-Player mit drei D-Knoten hinzufügen. Befüllt mit einem Soundeffekt, der auf Münzen klirrt. Ich verwende das Coin Sounds Pack, das von Val Inspired oder erstellt wurde von Val Inspired oder Wir müssen mithilfe von Addon einen Verweis auf diesen Knoten abrufen. Und sag ihm, dass er während der Veranstaltung spielen soll. Warten Sie dann, bis der Sound beendet ist, bevor den Knoten, der freigegeben werden soll, in die Warteschlange stellen, damit er abgespielt werden kann Bei einem Audio-Stream-Player mit drei D-Knoten wird die Lautstärke des ausgegebenen Tons an die Nähe zum Standard-Hörer, der Kamera, Wenn wir der Benutzeroberfläche Soundeffekte hinzufügen möchten, sollten wir stattdessen den einfachen Audio-Stream-Player-Knoten verwenden , der den Soundeffekt immer mit der eingestellten Lautstärke wiedergibt der eingestellten Lautstärke wiedergibt Einen Verweis auf den Audio-Stream-Player-Knoten abrufen. Wir können jedes Mal, wenn der Zählerwert eingestellt ist, ein Klirren der Münze wiedergeben Zählerwert eingestellt ist, ein Klirren der Münze Wir haben jetzt Soundeffekte, die von verschiedenen Knoten und verschiedenen Szenen aus abgespielt verschiedenen Knoten und verschiedenen Szenen Ein automatisch geladener Node spielt außerdem Hintergrundmusik ab, während andere Nodes Soundeffekte abspielen wird, desto mehr werden wir haben größer das Spiel wird, desto mehr werden wir haben, und andere könnten auch Dialoge abspielen. Wir sollten ihre Lautstärke so einstellen, dass sie der der Spieleinstellungen entspricht. Es wäre jedoch schwierig, sie einzeln zu verwalten. Wenn wir unten im Editor auf die Registerkarte Audio klicken, verfügt Gada über einen eingebauten Audiobus, mit dem wir unsere verschiedenen Audioquellen kategorisieren können unsere verschiedenen Audioquellen kategorisieren können Auf diese Weise können wir die Lautstärke oder andere Einstellungen für jeden Knoten gemeinsam über den Bus anpassen, anstatt für jeden einzelnen Knoten Wenn ein neuer Bus für Musik und ein weiterer für Soundeffekte hinzugefügt wird, werden beide durch den Master geleitet , bevor sie an die Lautsprecher ausgegeben werden. Die Anpassung der Master-Lautstärke wirkt sich auf alles im Spiel aus. Die Anpassung der Musiklautstärke wirkt sich nur auf die Musik und ebenso auf die Soundeffekte aus. die Soundeffekt-Audiostream-Knoten auswählen, können wir deren Bus auf SFX umstellen Da wir außerhalb des automatisch geladenen Skripts nicht auf den Musikknoten zugreifen können , können wir die Ready-Funktion verwenden, um seinen Bus auf Musik einzustellen Vergewissern Sie sich, dass die Schreibweise exakt dieselbe ist. Andernfalls wird der Bus auf die Standardeinstellung Master zurückgesetzt . Speichern Sie das Audiobus-Layout als Projektressource. Öffnen Sie dann die Projekteinstellungen. Wählen Sie unter Audiobusse das Audiobus-Layout als Standard aus. Der Musik-Node muss nicht mehr auf die Lautstärkeeinstellung verweisen, da der Musik-Audiobus die Obergrenze für die Lautstärke festlegt und einfach auf eine lineare Lautstärke von eins übergehen kann. In der Einstellungsressource können wir Variablen hinzufügen, um die einzelnen Lautstärkeeinstellungen, Master-, Musik- und Soundeffekte zu speichern , auch Standardwerte für jede Einstellung angeben können. Im Einstellungsmenü können wir Lautstärkeregler hinzufügen, um jeden dieser Werte zu ändern Ich ändere die Lautstärke auf Master-Lautstärke. Dann duplizieren Sie es zweimal und bearbeiten Sie die Duplikate, um Musiklautstärke und die Soundeffekte anzupassen der Bereitschaftsphase werden Verweise auf jeden Slider abgerufen initialisiert, dass sie den Spieleinstellungen entsprechen , als sie zum ersten Mal geladen wurden Wir müssen die Musiklautstärke nicht mehr manuell einstellen , da sie vom Bus übernommen wird Und wenn der Spieler seine Werte ändert, ändern Sie die Variablen in der Einstellungsressource und passen Sie auch die Lautstärke im Audiobus entsprechend an. Audioserver stellt Buslautstärke in Dezibel ein Audio-Server-Busindex Die Punkteinstellungen der Masterdatei machen die Master-Lautstärke aus, die von linear in Dezibel umgewandelt wird Geben Sie jedem Schieberegler seine eigene Funktion zur Änderung des Werts Danach können wir die Signalanschlüsse der Schieberegler bearbeiten , um eine Verbindung zu den eine Verbindung zu den Außerdem müssen wir die Bus-Volumes beim ersten Laden initialisieren Bus-Volumes beim ersten Jetzt müssen wir uns nicht mehr die Mühe machen, die Lautstärke von Audioknoten manuell anzupassen , solange sie der entsprechenden Kategorie zugeordnet sind Öffnen des Münzstapels kleinen Szene setzt die Transformationen auf ihren lokalen Ursprung zurück, falls dies nicht Lassen Sie uns den Münzen auch einen einfachen Partikeleffekt hinzufügen , wenn sie verschwinden Pudo hat zwei verschiedene Knotentypen für die Erzeugung von Partikeln, denen einer auf der CPU und der andere auf der GPU läuft CPU-Partikel, die mit langsameren Computern oder Computern ohne dedizierten Grafikprozessor wie Mobilgeräte kompatibel sind mit langsameren Computern oder Computern ohne dedizierten Grafikprozessor wie Mobilgeräte kompatibel dedizierten Grafikprozessor , aber sie können nicht so viele Partikel erzeugen und haben weniger Funktionen Ein CPU-Partikelsystem ist in der Lage, kleine Partikelschübe zu erzeugen , wie wir es hier erreichen wollen. Ein GPU-Partikelemitter wäre jedoch besser geeignet Tausende oder Millionen von Partikeln auf einem modernen System zu emittieren von Partikeln auf einem modernen System Ich verwende einen CPU-Partikelemitter. Im Moment wird nichts emittiert, weil es kein Partikel zum Zeichnen Erweitern Sie den Zeichnungsbereich und fügen Sie eine Netzressource hinzu, um ein einzelnes Partikel darzustellen. Ich möchte das Münznetz als Partikel verwenden. Ich ziehe ein einzelnes Münz-Asset aus dem Asset-Paket in die Szene. Machen Sie es lokal und wählen Sie den D-Knoten der Mesh-Instanz aus. Nachdem Sie dieses Mesh einzigartig gemacht haben, ist es nicht mehr an das importierte Objekt gebunden. Ich kann dieses Netz als Projektressource speichern. Ich nenne es Coin Mesh. all diese Knoten lösche und den Partikelemitter erneut auswähle, kann ich dieses Netz jetzt als mein Partikel verwenden Die Partikel emittieren jetzt achtmal pro Sekunde und fallen Ich hätte lieber einen einmaligen Partikelausbruch statt einer kontinuierlichen Emission. Wenn ich den Zeitabschnitt ausdehne, setze ich einen Schuss auf wahr und Explosivität auf Wenn Sie auf den Schalter „Aussenden“ klicken, erscheinen die acht Partikel alle gleichzeitig und verschwinden nach einer Sekunde, was der Eigenschaft „Lebensdauer“ entspricht Ich möchte, dass die Partikel nach oben platzen, also erweitere ich den Bereich Richtung und ändere die Richtung auf eine Streuung von 15 Grad nach oben Als Nächstes setze ich die Anfangsgeschwindigkeit auf eine zufällige Zahl 2-3 Metern/Sekunde und setze die Schwerkraft auf nur minus 4 Meter/Sekunde im minus 4 Meter/Sekunde Ich lasse die Partikel ihre lokalen Vektoren nach oben in die Richtung ausrichten , in die Mal sehen, wie es bisher aussieht. Ich würde es vorziehen, wenn die Münzen nicht plötzlich auftauchen oder verschwinden, also erweitere ich den Skalenbereich, und zwar mit einer Skalenkurve. die Kurvenressource erweitern, um sie zu bearbeiten haben wir Zeit entlang der X-Achse und Skalierung entlang der Y-Achse. Beachten Sie, dass eine Zeit von eins nicht 1 Sekunde entspricht, ebenso wenig wie eine Skala von eins, 1 Meter. Dies sind Prozentsätze der Lebensdauer und der Skaleneigenschaften der Partikel Bei Null möchte ich, dass die Münze unsichtbar ist stelle ihre Skala auf Null und bei Eins auf dieselbe Skala Bei der Hälfte der Lebensdauer des Partikels möchte ich, dass seine Skala eins oder die volle Größe Dadurch entsteht eine Welle, sodass das Partikel im Laufe seiner Lebensdauer allmählich wächst und schrumpft Wir können die Anker eines beliebigen Punktes auf dieser Kurve ändern, um anzupassen, wie sich dies auf die Partikelskala auswirkt Jetzt sieht es so aus, als ob die Münzen nach oben platzen und herunterregnen, nachdem sie eingesammelt wurden Es gibt viele verschiedene Einstellungen, mit denen Sie einstellen können, wie Partikel entstehen und wie sie sich im Laufe ihrer Lebensdauer verhalten Experimentieren Sie mit verschiedenen Einstellungen für Partikeleffekte , um den gewünschten Effekt für Ihr Spiel Im Coins-Stack-Skript können wir einen Verweis auf den Partikelemitter-Knoten abrufen den Partikelemitter-Knoten und dessen Emissionseigenschaft auf true setzen , wenn die Münzen gesammelt werden Warten Sie dann, bis das Signal beendet ist bevor Sie diesen Knoten zur Freigabe in die Warteschlange stellen Ich lasse das Schrumpfen, den Soundeffekt und den Partikeleffekt gleichzeitig ablaufen. kleine Szene mit dem Münzstapel duplizieren, können wir einen mittleren und einen großen Stapel erstellen Der D-Knoten der Mesh-Instanz wird durch verschiedene Münzstapel ersetzt D-Knoten der Mesh-Instanz wird durch verschiedene Münzstapel Ich werde auch den Wert dieser Stapel so einstellen, dass er einen höheren Standardwert hat , indem ihn im Inspektor innerhalb ihrer Szenen ändere Ändern Sie ihren Soundeffekt und die Anzahl der Partikel, die von ihren Partikeleffekten emittiert werden Fügen Sie dann verschiedene Stapel rund um das Level hinzu, die vom Spieler aufgenommen werden sollen Wir können Partikeleffekte auch in zwei D verwenden. Lassen Sie uns einen ähnlichen Effekt auf das Brieftaschensymbol erzielen, wenn das Münzsymbol aktualisiert wird. Hinzufügen eines Zwei-D-Partikelemitters zum Symbolknoten. Ich werde ihn so positionieren, dass er sich in der Mitte befindet. A Ich verwende fast die gleichen Eigenschaften für diesen Partikelemitter fast die gleichen Eigenschaften für diesen Partikelemitter und ändere das Partikel einfach in eine Kopie des Münzsymbols Verwenden Sie eine Streuung von 180 Grad, sodass die Partikel in alle Richtungen fliegen und der Schwerkraft entziehen Die Geschwindigkeit wird in Pixeln pro Sekunde gemessen, also lasse ich sie zwischen 16 und 32 variieren Aber wenden Sie dieselbe Kurve sodass die Partikel wachsen und schrumpfen Und stellen Sie die Mindest- und Maximalskala auf nur 5% der normalen Größe Dann können wir im Counter-Skript nach einem Verweis auf den Partikelemitter angeben, dass er bei der Aktualisierung des Zählerwerts ausgeben soll Beim Aufheben der Münzen sehen das Verhalten der Münzen und der Benutzeroberfläche jetzt das Verhalten der Münzen und viel interessanter aus Experimentieren Sie mit verschiedenen Übergangs- und Beschleunigungstypen, Soundeffekten und Partikeleffekten, um das gewünschte Erscheinungsbild für Ihr Spiel zu erzielen einer Vielzahl von Effekten haben wir jetzt ein angenehmeres Erlebnis für den Spieler in unserem Spiel Münzen sammelt Dank einer Vielzahl von Effekten haben wir jetzt ein angenehmeres Erlebnis für den Spieler, der In der nächsten Lektion ermöglichen wir es dem Spieler, einen Gegenstand aufzuheben , indem er eine Taste drückt und ihn seinem Inventar hinzufügt. Wir sehen uns in der nächsten Lektion. 4. Abholen: Hallo Freunde. In der vorherigen Lektion haben wir den Mechaniken beim Sammeln von Münzen den letzten Schliff gegeben. In dieser Lektion werden wir Gegenstände hinzufügen, die der Spieler durch Drücken einer Taste aufheben kann. Beginnen wir damit, ein paar Gegenstände herzustellen , die der Spieler aufheben können sollte. Beginnend mit der Charakterszene können wir einen der Gegenstände in ihren Händen verwenden. Ich nehme die Axt der Barbaren. Ich mache diese Axt zu einer eigenen Szene speichere sie im Ordner mit den Artikelszenen. Beachten Sie, dass der Ursprung der Axt Griff liegt, an dem der Charakter Wir können dieser Szene einen festen Körper mit drei D-Knoten hinzufügen, wodurch sie zu einem physikalischen Objekt wird, durch das Beachball-Symbol gekennzeichnet Geben Sie ihm eine Kollisionsform. Ich benutze einfach eine Box Collide. Passen Sie dann die Grenzen und die Position der Box an, um das X-Modell zu kapseln Die Verwendung von orthogonalen Ansichtspunkten macht dies viel einfacher. rechten Maustaste auf den Drei-D-Knoten des starren Körpers klicke, mache ich ihn zum Stammknoten der Szene und benenne ihn in X um. Lassen Sie uns diesen Knoten auf eine neue Kollisionsebene legen Ich verwende Ebene sechs für Objekte. Dieses Objekt kann das Terrain, andere Gegenstände, den Spieler und den MPC maskieren andere Gegenstände, den Spieler und den MPC Öffnen Sie die Projekteinstellungen, die Ebenennamen, die Drei-D-Physik legen Sie die sechste Ebene für die Abholung von Objekten zur Verfügung Wenn ich ein Skript an den Stammknoten anhänge, nenne ich es einfach item Ich werde es vorerst einfach halten und einfach einen Anzeigenamen für das Element als Zeichenfolge exportieren Wir werden auf die Artikel selbst näher eingehen. Um zur Charakterszene zurückzukehren, können wir den Gegenstandsknoten löschen, da wir noch nicht über die richtigen Systeme verfügen , um ihn auszurüsten In der Dungeon-Szene wurde eine Flasche A mit der Aufschrift „Braun“ in die Szene gezogen und sie lokal dargestellt. Das Objekt wurde so importiert, dass bereits ein starrer Körper daran befestigt Wir können mit der rechten Maustaste auf diesen Knoten klicken und ihn zu einer eigenen Szene machen und ihn Gesundheitstrank nennen Dem Heiltrank einen neuen Namen geben und den Heiltrank umbenennen und den Knoten drei D löschen . Beim Öffnen der Szene wird die Weltsimulation ausgeschaltet Ich schalte es wieder ein. Lassen Sie uns auch den Root-Node in Health Potion umbenennen. Und füge das Artikelskript an, das dem Heiltrank einen Anzeigenamen Mit den gleichen Kollisionseinstellungen wie bei der Axt. Der Zaubertrank hat seinen Ursprung an seiner Basis, wo er auf dem Boden sitzen wird, ebenso wie sein Massenschwerpunkt, was zu ungewöhnlichem Verhalten führt Um es Charakteren leichter zu machen, Gegenstände in ihren Händen zu halten, ist es hilfreich, ihren Ursprung dort zu haben wo der Charakter sie hält also sowohl das Netz als auch die Kollisionsform auswählen, bewegen wir sie etwa zwei Drittel der Flasche nach unten positionieren den Ursprung am Flaschenhals. Und wenn wir den Knoten des starren Körpers auswählen, erweitern wir den Bereich für die Massenverteilung. Wir können den Massenschwerpunkt auch ändern , indem wir ihn von „Automatisch“ auf „Benutzerdefiniert“ umstellen und ihn so verschieben, dass er um etwa ein Drittel näher am breiteren Teil der Flasche entlang der Y-Achse liegt. Dadurch wird verhindert, dass sich die Flasche wie eine Rollstange verhält. Wir haben jetzt zwei verschiedene Gegenstände , die der Spieler abholen können sollte Lass uns eine Axt und zwei Zaubertränke auf den Tisch legen , damit der Spieler sie einsammeln kann Aber das sieht ziemlich langweilig aus, und da es sich um physikalische Objekte handelt, die sich bewegen können, legen wir einen der Zaubertränke auf den Boden, der auf die Seite kippt Zurück in der gesundheitsfördernden Szene können wir versuchen, ihr ein Interaktionsereignis zuzuordnen, indem wir einen D-Knoten im Bereich drei und eine Kollisionsform verwenden Ich nehme als Beispiel dieselbe Kapsel wie unsere NPCs. Dieses System hat zwar hervorragend für die Interaktion mit NPCs und Türen funktioniert , die im Allgemeinen größer sind und sich nicht drehen, wir können jetzt die Grenzen unserer bestehenden Event-Interaktionen erkennen , wenn es um kleinere Objekte und/oder physikalische Objekte geht, die sich drehen können Für diese Demonstration aktiviere ich sichtbare Kollisionsformen du dem Heiltrank ein Interaktionsereignis hinzufügst, kann er nicht mehr interagieren, wenn er umkippt und auf den Boden rollt Da sich der Kollisionsbereich auch um den lokalen Ursprung des Heiltranks dreht Es wird viel schwieriger, mit einem Strahlwurf zuverlässig anzuvisieren . Wir könnten die Kollision zu einer Kugel machen, die so groß ist, dass sie durch den Strahlwurf immer erkennbar ist. Aber lassen Sie uns eine andere Lösung verwenden. In vielen Spielen kann der Spieler der Einfachheit halber auch Gegenstände hinter sich aufheben , die sich noch in unmittelbarer Nähe des Charakters befinden . Eine Besetzung, die nur nach vorne schaut , wird das nicht schaffen. Eine andere Art der Interaktion mit der Umgebung kann erreicht werden indem ein D-Node im Bereich 3 an den Spielercharakter angehängt entweder eine Kugel- oder eine Zylinder-Kollisionsform verwendet, wobei der Radius auf eine angemessene Reichweitenbegrenzung eingestellt wird. Ich verwende dieselbe Reichweite wie beim Interaktionsstrahlwurf von 2 Metern. Stellen Sie die Höhe des Colliders für den Charakter auf 2,6 Meter ein und zentrieren Sie ihn auf der Hälfte der 1,3 Meter Wenn der Charakter jedoch an einem abwärts gerichteten Hang steht und der Spieler Gegenstände aufheben möchte, die sich etwas darunter befinden , sollte er dazu in der Lage sein Also füge ich einen halben Meter Höhe und senke die Mitte um einen Viertelmeter Diese Kollisionsform wird nach Objekten Ausschau halten , die der Spieler aufheben kann , wenn er die Interaktionstaste drückt, wodurch Ebene sechs maskiert wird Ein Skript an diesen Bereichsknoten anhängen. Nennen wir es Abholradius. Ich erstelle einen neuen Ordner für Spielerskripte und lege das da rein. Verschieben Sie dann auch die Player- und Spring Arm-Skripte in diesen Ordner. Verbinde dann das vom Körper eingegebene Signal mit diesem Skript, um auf jeden Körper auf Ebene 6 zu reagieren , der den Aufnahmeradius erreicht. Ebenso wie das Signal, das der Körper ausgesendet hat , wenn er den Aufnahmeradius verlässt Dieses Skript muss eine Liste aller Gegenstände in Reichweite des Spielers führen , die mithilfe eines Arrays von Knoten drei Ds abgeholt werden können, wobei standardmäßig ein leeres Array verwendet wird Wenn ein Körper diesen Bereich betritt, wird er an das Array angehängt Und wenn er diesen Bereich verlässt, wird er aus dem Array gelöscht Der Nachteil der Verwendung von Flächenkollisionen auf diese Weise besteht jedoch darin, dass es keine Möglichkeit gibt, dazwischen liegende Hindernisse zu erkennen Auf diese Weise kann der Spieler tatsächlich Gegenstände auf der anderen Seite einer Wand aufheben Wir müssen einen weiteren Strahlwurf verwenden , um festzustellen, ob das, was der Spieler aufnehmen möchte, durch das Gelände oder andere Hindernisse behindert wird durch das Gelände oder andere Hindernisse behindert zum Aufnahmeradius des Gegenstands einen Knoten mit drei D-Knoten hinzufüge, bewege ich ihn auf halber Höhe des Charakters entlang der Y-Achse nach oben, 1,3 Meter, und lasse halber Höhe des Charakters entlang der Y-Achse nach oben, 1,3 Meter, und ihn nur mit dem Terrain oder den Gegenständen kollidieren Wenn der Spieler die Interaktionstaste drückt, lasse ich ihn einfach den Gegenstand aufheben, der ihm am nächsten ist. Lassen Sie uns einen Algorithmus schreiben, der dem Spieler in diesem Bereich das Objekt am nächsten bringt der dem Spieler in diesem Bereich das Objekt am einen Knoten drei D zurückgibt. Wenn Sie einen Algorithmus schreiben, ist es am besten, sich zuerst alle möglichen Fälle auszudenken , die berücksichtigt werden müssen Was passiert, wenn das Array leer ist, das heißt, es gibt keine Gegenstände in Reichweite, die der Spieler aufheben könnte Wir sollten Null zurückgeben, was nichts bedeutet. Wenn das Array nur ein Element enthält, müssen wir zuerst überprüfen, ob es einen ungehinderten Pfad zwischen diesem Knoten und dem Elementknoten gibt einen ungehinderten Pfad zwischen , der den Strahlwurf verwendet Die Zielposition der Strahlwürfe wird so eingestellt, dass sie der Differenz zwischen den Objekten und den globalen Positionen der Strahlwurfknoten entspricht Der Strahl zeigt von seinem eigenen Ursprung direkt auf den Ursprung des Elements. Nachdem wir geändert haben, auf welche Richtung der Raycast zeigt, werden die Kollisionsinformationen erst beim nächsten physikalischen Prozess aktualisiert, aber wir können sie mit einem Funktionsaufruf erzwingen, sofort zu aktualisieren mit einem Funktionsaufruf erzwingen, sofort Trifft der Raycast auf das Objekt, können wir es zurückgeben. Andernfalls geben wir immer noch Null zurück, da das einzige Element im Array durch Terrain blockiert wird Machen wir diesen Code wiederverwendbar indem wir ihn in eine private Funktion umwandeln Ich nenne es blockiert, akzeptiere das Objekt als Parameter und gebe einen booleschen Wert zurück, ob der Strahlwurf behindert war oder Da es sich bei diesen Fällen die allermeisten Fälle handelt, in denen der Spieler die Interaktionstaste drückt, sollten sie zuerst überprüft und so effizient wie möglich behandelt werden und so effizient wie möglich behandelt In dem seltenen Fall, dass sich zwei oder mehr Objekte in der Reihe befinden , müssen wir die Entfernung der einzelnen Objekte zum Spieler vergleichen , um zu entscheiden, welches Objekt am nächsten ist, die Komplexität des Algorithmus erheblich erhöht Wir benötigen jetzt ein paar zusätzliche Variablen, den Array-Index des nächsten Elements, die Entfernung zum nächsten Objekt und die Entfernung zum nächsten Element in der Nachdem alle unsere Berechnungen abgeschlossen sind, können wir das Element mit dem Index des nächstgelegenen Elements zurückgeben Beim Vergleich solcher Entfernungen ist es mathematisch effizienter, die Entfernung im Quadrat anstelle der Entfernung zu verwenden Quadrat anstelle der Entfernung Da der Abstand zwischen zwei Punkten in drei D-Räumen die Quadratwurzel aus X zum Quadrat plus Y zum Quadrat ist , ist D zum Quadrat gleich X zum Quadrat plus ist D zum Quadrat gleich X zum Quadrat Y zum Quadrat plus Quadrat entfällt die Notwendigkeit, die Quadratwurzel dieser Zahl zu berechnen , und wenn d eins kleiner als d zwei ist, dann ist d eins zum Quadrat auch kleiner als d zwei zum Quadrat Wir können damit beginnen, den Index auf Null und die Entfernung zum nächstgelegenen Objekt auf etwas Größeres als den Aufnahmeradius im Quadrat zu setzen auf Null und die Entfernung zum nächstgelegenen Objekt auf etwas Größeres als den , sodass jedes Objekt innerhalb des Aufnahmeradius standardmäßig als am nächsten gelegenes Objekt betrachtet wird betrachtet Da mein Radius zwei ist, verwende ich einfach fünf. Für jedes Objekt in der Reihe müssen wir die Entfernung im Quadrat dazu bestimmen Anhand der globalen Position dieses Knotens wird die Entfernung im Quadrat zur globalen Position des Elements am Vergleichen Sie dann diese Entfernung mit der nächstgelegenen Entfernung. Wenn es kleiner ist, überprüfen Sie auch , ob der Artikel ungehindert ist Wenn das stimmt, dann ist dies die nächste Entfernung, die wir bisher gefunden haben, und I ist der Index des nächstgelegenen Objekts, das Beachten Sie, dass boolesche Operationen von links nach rechts ausgeführt werden. Der Vergleich der Entfernungen wird zuerst abgeschlossen, was eine ziemlich effiziente mathematische Berechnung ist Wenn die Entfernung zum nächsten Objekt nicht kleiner als die nächste Entfernung ist , spielt es keine Rolle, ob das Objekt nicht blockiert ist. Die boolesche Operation beginnt mit falsch, und es ist daher egal, was die andere Seite ist, da falsch und alles ist immer noch falsch, da falsch und alles ist immer noch falsch, der Strahlwurf komplett übersprungen wird, was eine kostspieligere Berechnung ist die Reihenfolge der Operationen unter den üblichen und einfachen Prüfungen sorgfältig auswählen und die komplexeren oder selteneren Fälle bis zum Schluss aufschieben , wo sie möglicherweise übersprungen werden, kann dies dazu beitragen, dass Ihre Wir werden dies wiederholen, bis wir das Ende des Arrays erreicht haben. Dann haben wir den Array-Index des Gegenstands , der dem Spieler am nächsten ist, und können den Gegenstand zur Abholung zurückgeben. Dies sollte nicht gleich sein. Der Spieler benötigt ein Inventar, um seine Gegenstände aufzubewahren, das Teil seiner Fortschrittsinformationen sein wird. Deklarieren wir eine private Variable mit dem Namen Inventory als Wörterbuch und initialisieren sie so, dass sie leer ist, indem wir Klammern anstelle von eckigen Klammern verwenden Ein Wörterbuch ist eine Sammlung von Schlüssel-Wert-Paaren, ähnlich einem Array Wenn Sie den Array-Index als Schlüssel betrachten, aber ein Wörterbuch kann alles als Schlüssel verwenden. Solange jeder Schlüssel einzigartig ist. den Anzeigenamen des Elements als Schlüssel verwenden, können wir Artikel einfach stapeln, indem wir die Menge als Wert verwenden. Dies ist eine sehr vereinfachte Inventarstruktur, für diese Demonstration jedoch ausreichend Vorerst werden wir eine Funktion namens Zum Inventar hinzufügen bereitstellen, die einen Gegenstand akzeptiert, der dem Inventar des Spielers hinzugefügt werden soll , und eine optionale Menge mit einem Standardwert von eins Prüfen wir zunächst, ob der Gegenstand bereits im Inventar des Spielers vorhanden Wir können den Wert dieses Schlüssels um die Menge erhöhen. Wenn der Gegenstand noch nicht im Inventar des Spielers vorhanden ist, können wir den Wert auf die Menge festlegen, wodurch auch dieser Eintrag im Wörterbuch erstellt wird. Am Ende drucken wir einfach das Inventar aus , damit wir es sehen können. Im Spielerskript können wir der Interaktionsschaltfläche mehrere kontextsensitive Verwendungsmöglichkeiten geben . nehmen einen Verweis auf den Radius, in dem der Gegenstand aufgenommen wurde, Wir nehmen einen Verweis auf den Radius, in dem der Gegenstand aufgenommen wurde, und deklarieren außerdem eine Variable Gegenstand enthält , der dem Spieler am nächsten ist Wenn wir die Interaktionstaste drücken, weisen wir mithilfe unseres Algorithmus zunächst den Wert des nächstgelegenen Gegenstands dem Objekt zu , das vom Aufnahmeradius am nächsten zurückgegeben wird , das vom Aufnahmeradius Wenn das Abholradius-Skript einen Gegenstand zurückgibt, etwas anderes als Null ist, sollten wir diesen Gegenstand aufheben, ihn dem Inventar des Spielers hinzufügen, den Gegenstand, der befreit werden soll, in die Warteschlange stellen und ihn aus dem Szenenbaum entfernen. Wenn sich jedoch kein Gegenstand in der Reichweite befindet und das Skript Null zurückgegeben hat, können wir mit dem Befehl zur Interaktion mit dem Charakter fortfahren . Was ist, wenn der Spieler beide einem NPC gegenübersteht , mit dem er sprechen möchte, und es gibt einen Gegenstand, den er zu seinen Füßen aufheben kann Wenn du kontextsensitive Befehle erstellst, solltest du berücksichtigen, welchen Kontakten Priorität eingeräumt wird und wie sich das auf das Spielerlebnis auswirkt In diesem Fall wird der Gegenstand durch Drücken der Interaktionstaste zuerst aufgenommen. Dann muss der Spieler die Taste erneut drücken , um mit dem MPC zu sprechen Manchmal ist es vielleicht besser, eine andere Taste zu verwenden , wenn dies für den Spieler bequemer ist Okay. Wenn wir das Spiel starten, hinter die Wand stellen und die Interaktionstaste drücken, ist der Gegenstand blockiert und wir haben den Gegenstand nicht abgeholt Wenn wir uns in den Raum bewegen und die Interaktionstaste ungehindert drücken. Die beiden Heiltränke und die Axt werden dem Inventar des Spielers hinzugefügt, jeweils mit einem separaten Tastendruck und im Ausgabeprotokoll angezeigt Die Heiltränke sind außerdem in einem einzigen Wörterbucheintrag Wir lassen den Spieler jetzt Gegenstände mit einem Knopfdruck aufheben und sie seinem Inventar hinzufügen In der nächsten Lektion zeigen wir Inventar des Spielers auf der Leinwand an. Wir sehen uns in der nächsten Lektion. 5. Inventar: Hallo Freunde. In der vorherigen Lektion haben wir dem Inventar des Spielers Gegenstände per Knopfdruck hinzugefügt . In dieser Lektion zeigen wir den Inhalt des Spielerinventars in einem Menü an. Ein guter Anfang mit Menüs besteht darin, ein Modell der Informationen zusammenzustellen ein Modell der Informationen Sie dem Spieler anzeigen möchten. Auf diese Weise können Sie sich ein Bild davon wie Sie den verfügbaren Speicherplatz am besten nutzen machen, wie Sie den verfügbaren Speicherplatz am besten nutzen können, und Sie können vielleicht Dinge in Betracht ziehen , die Sie sonst nicht berücksichtigt hätten. Beginnen wir mit einem einfachen Panel-Knoten und benennen ihn in Inventar um. Wir benötigen wahrscheinlich ein paar Labelknoten, einen Titel für dieses Panel, um dem Spieler klar zu sagen, wofür es gedacht ist, sowie einen Artikelnamen und eine Artikelbeschreibung des aktuell ausgewählten Gegenstands. Im Titel wird nur Inventar stehen, und ich verwende Blindtext für den Artikelnamen und die Beschreibung Ich werde beide Wraps haben, damit sie außerhalb des Panels nicht buchstabiert Und auch ein Container, normalerweise entweder ein vertikaler Kastencontainer oder ein Rastercontainer, um alle Elemente zu organisieren Welchen Container Sie auch verwenden werden, er wird wahrscheinlich mit Schaltflächen gefüllt sein, jede für ein Objekt oder einen Stapel von Elementen steht. Fügen wir jetzt einen hinzu Als Nächstes erstellen wir ein Thema für dieses Menü. Ich nenne es Inventar. Erstellen Sie einen neuen Ressourcenordner für Themen und fügen Sie ihn zusammen mit dem vorhandenen Thema dort ein. das Design im Inspektorfenster ausdehne, ändere ich die Standardschrift die besser lesbare Schrift, die ich für mein Spiel verwende , und setze die Standardschriftgröße auf 96, was nicht mehr so groß sein wird, wenn ich das Bedienfeld verkleinere Auf der Registerkarte „Thema“ füge ich zunächst das Bedienfeld hinzu. Geben Sie dem Panel dann eine Box-Textur im neuen Stil. Klicken Sie auf die Style-Box-Textur , um sie im Inspektor-Tab zu öffnen. Ich verwende das graue quadratische Boxbild mit Texturrändern von 128 Pixeln auf allen Seiten. Das Bild ist sehr groß, also werde ich es auf ein Viertel verkleinern. Stellen Sie dann die Größe des Panels so ein, dass die Bildschirmauflösung von 12 × 80 mal 720 verdoppelt wird. Es nimmt sowohl in der Breite als auch in der Höhe die Hälfte des Bildschirms ein. Stellen Sie den Drehpunkt auf die Mitte , indem Sie die Hälfte der Größeneigenschaft das Bedienfeld dann in der Bildschirmmitte verankern Wenn das Bedienfeld an der richtigen Position ist, kann ich jetzt jedes der Elemente an verschiedenen Positionen darin verankern an verschiedenen Positionen darin Ich werde den Titel so verankern , dass er horizontal innerhalb des Panels zentriert ist und 10% von oben nach unten zeigt. Wächst horizontal und vertikal in beide Richtungen, sodass es um den Ankerpunkt herum zentriert ist. Ich werde die schickere Schrift und eine größere Schriftgröße von 128 verwenden und eine größere Schriftgröße von Den Artikelnamen und die Artikelbeschreibung lege ich in einen vertikalen Kartoncontainer Verwenden Sie dann benutzerdefinierte Anker, um es auf der rechten Seite des Panels zu positionieren alles horizontal zu 60-95% und vertikal zu 20 bis 90% abzudecken und vertikal zu 20 bis 90% Wenn Sie die Ankerversätze neu einstellen, werden die Grenzen des Steuerelements so angepasst, dass sie mit den Ankerpunkten übereinstimmen Ich verwende ein Theme-Override, um den Modus und zusätzliche 64 Pixel voneinander abzugrenzen Der Label-Node möchte, dass eine benutzerdefinierte Mindestgröße festgelegt wird, also setze ich sie einfach auf eine Höhe von 64 Pixeln, um die Warnungen loszuwerden. Dadurch bleibt die linke Hälfte des Bedienfelds für die Elementliste oder das Raster verfügbar. Auch hier verwende ich benutzerdefinierte Anker, sodass das Raster horizontal 5% bis 58% und vertikal 20 bis 90% bedeckt horizontal 5% bis 58% und vertikal 20 bis 90% Ich gebe meiner Musterschaltfläche eine benutzerdefinierte Mindestgröße von 256 mal 256 Pixeln Ändern Sie dann auch die Schriftart des Artikelnamens, damit er sich besser von der Beschreibung abhebt . Durch Hinzufügen von Schaltflächen zum Inventardesign können wir auch das Erscheinungsbild der Artikelschaltflächen ändern. Ich verwende für die Schaltflächen dasselbe graue Feld wie für das Panel. Ich verwende das gleiche Stilfeld , wenn die Taste gedrückt wird. Schick' es, wenn es deaktiviert ist. Ändere die Taste zu weiß, wenn sie scharf ist, oder zu gelb, wenn der Mauszeiger darüber bewegt wird Ich füge der Schaltfläche eine zerstörte Textur und eine Bezeichnung hinzu, sodass ein Symbol angezeigt wird, das den Gegenstand darstellt, und einen Zähler dafür, wie viele dieser Gegenstände der Spieler derzeit besitzt Ich möchte, dass das Symbol sein Seitenverhältnis beibehält und in der Mitte der Schaltfläche verankert bleibt Was den Label-Knoten betrifft. Ich setze es auf 99, damit ich sehen kann, wie es aussieht. Ich verankere den Zähler in der unteren rechten Ecke der Schaltfläche und gebe ihm einen dicken Umriss, damit er sich vom Symbol abhebt. Aber wenn es sich um eine einstellige Zahl handelt, möchte ich, dass sie horizontal zentriert ist. Für meine Icons verwende ich ein Spritesheet, das von Shashi auf Itch Dot IO erstellt wurde Mithilfe einer Atlas-Textur können wir diese Textur als ein einzelnes S aus einem Blatt definieren die Textureigenschaft als Atlas-Textur festlegen, können wir dann auf die Schaltfläche „Region bearbeiten“ klicken das Spritesheet dann in einzelne Sprites aufteilen Wenn ich einen als Platzhalter auswähle, verwende ich einen Heiltrank und vergrößere ihn, bis Bei diesen Objekten handelt es sich um Pixelgrafiken, die nicht so verschwommen sein sollten Ich muss den Texturfilter auf „ Nächster Nachbar“ ändern , um das entsprechende Aussehen für dieses Symbol zu erhalten entsprechende Aussehen für dieses Symbol Ich stelle die Größe auf 32 mal 32 Pixel ein, und der Drehpunkt soll sich in der Mitte befinden, sodass es sich gut in der Schaltfläche befindet. Nun, da wir einen Musterartikel haben, wollen wir ihn ein paar Mal duplizieren, um zu simulieren, wie ein vollständiges Inventar aussehen wird. Der Grid-Container muss mehr als eine Spalte haben. Fünf Spalten passen gut in den Raum. Aber wir können immer noch nur 20 Elemente im Rastercontainer unterbringen, bevor die Elemente außerhalb des Panels überlaufen Wir erinnern uns an die Ankerwerte, die wir für diesen Container verwendet haben. Wenn wir einen Scroll-Container hinzufügen, kopieren Sie dieselben Anker für den Scroll-Container wie für den Grid-Container Verschachteln Sie dann den Rastercontainer innerhalb des Scroll-Containers Scrollen wird automatisch aktiviert , sodass eine beliebige Anzahl von Objekten gespeichert werden kann Ich setze die Ankerversätze des Scroll-View-Containers zurück, damit er innerhalb der Anker bleibt Wir können jetzt alle Platzhalterschaltflächen bis auf eine löschen. Die letzte Schaltfläche sollten wir als eigene Szene speichern. Eine, die wir als Blaupause verwenden können um das Inventar des Spielers zu erstellen Ich werde es in einem neuen Szenenordner für UI-Szenen speichern. Verschieben Sie dann auch das Einstellungsmenü in diesen Ordner. Als Nächstes können wir die letzte Schaltfläche und den gesamten Platzhaltertext löschen , sodass ein leerer Inventarbildschirm übrig bleibt Unser Inventarfenster sollte auch eine geschlossene Schaltfläche enthalten, falls wir planen, dieses Spiel auf dem PC zu veröffentlichen. Lass uns eine Schaltfläche hinzufügen. Re. Und verankern Sie es in der oberen rechten Ecke des Panels. Unser Design hat bereits eine Einstellung für Schaltflächen, aber wir können das Aussehen dieser Schaltfläche ändern, ohne andere Schaltflächen zu beeinflussen, indem wir eine Typvariante verwenden. Fügen Sie unserem Inventar-Thema jedoch einen neuen Typ und geben Sie diesmal einfach einen benutzerdefinierten Namen für unsere geschlossene Schaltfläche ein. Auf der letzten Registerkarte unseres neuen Typs können wir einen Basistyp für diesen Typ angeben, nämlich die Schaltfläche. dann zur Registerkarte „Stilfeld“ wechseln, können wir ihre Werte überschreiben, um unterschiedliche Stilfelder speziell für geschlossene Schaltflächen zu verwenden unterschiedliche Stilfelder speziell für geschlossene Schaltflächen Mit der vorgefertigten roten X-Schaltfläche aus dem UiPac für den normalen Schaltflächenstatus können wir dann den Knoten für die geschlossene Schaltfläche auswählen und seine Typvariante auf „Schaltfläche schließen“ setzen Es wird diese Theme-Einstellung anstelle der normalen Button-Einstellungen verwenden anstelle der normalen Button-Einstellungen Ich setze die Größe auf 128 Pixel und verankere sie wieder in der oberen rechten Ecke. Ich verwende einfach dasselbe Stilfeld für jeden Schaltflächenstatus für die geschlossene Schaltfläche. Es hängt ein Skript an unser Inventar-Panel an, nennt es Inventar und speichert es im UI-Skriptordner. Es kann von einer Klasse erben, die wir im Grundkursmenü geschrieben haben im Grundkursmenü geschrieben Von der Menüklasse übernommen, kümmern wir uns bereits um das Öffnen und Schließen des Menüs, legen den Fokus auf ein Standard-Fokuselement, wenn das Menü geöffnet wird, und stellen Breadcrumbs bereit, wenn wir dieses Menü von einem anderen Menü aus zugänglich machen dieses Menü von einem anderen Menü aus zugänglich Ich möchte diese Verhaltensweisen jedoch außer Kraft setzen, sodass ich den Spielerknoten deaktivieren kann, solange das Inventar Die Definitionen von Öffnen und Schließen in das Inventarskript kopieren und Schließen in das Inventarskript und die Superdefinitionen aufrufen. Unser Szenenbaum wird jetzt ziemlich groß und komplex, sodass der Knotenpfad zwischen dem Inventar- und dem Spielerknoten mehrere Stufen hochgehen muss. Wenn Sie über einen komplexen Knotenpfad auf einen eindeutigen Knoten zugreifen, ist es besser, den Knoten als einzigartig zu markieren. rechten Maustaste auf den Player-Knoten und wählen Sie Access als eindeutigen Namen aus. Der Knoten ist mit einem Prozentzeichen gekennzeichnet. Wenn wir nun mithilfe von add on re einen Verweis darauf abrufen, wird der Knotenpfad durch das Prozentzeichen ersetzt und ist nun ein direkter Verweis auf diesen spezifischen eindeutigen Knoten. Beim Öffnen des können wir die aktivierte Eigenschaft des Spielerknotens auf Stürze setzen , sodass sich der Spieler weder bewegen noch springen kann. Und wenn der Knoten geschlossen keine Brotkrumen mehr gibt, können wir den Spielerknoten wieder aktivieren sodass der Spieler das Spiel weiterspielen kann Außerdem müssen wir der Eingabekarte der Projekteinstellungen eine Schaltfläche hinzufügen, um das Inventar zu öffnen Ich verwende die Rücktaste oder die Auswahltaste auf meinem Controller Wenn im Spielerskript die Inventartaste gedrückt wird, können wir den Spielmanager anweisen, die Option „ Erfindung“ umzuschalten Der Spieler muss jedoch in der Lage sein, das Inventar zu schließen , während der Spielerknoten deaktiviert ist, sodass die Überprüfung von der Pausefunktion getrennt werden muss von der Pausefunktion getrennt Suchen Sie im Game Manager-Skript nach einem Verweis auf das Inventarmenü Wir können es öffnen, wenn es geschlossen ist, oder es schließen, wenn es geöffnet ist. Das Inventar-Skript muss dann dem Spielmanager mitteilen können , ob es geöffnet ist oder nicht. also eine boolesche Variable deklarieren, wird sie natürlich standardmäßig auf false gesetzt, und wir können sie setzen, wenn das Inventar geöffnet Wenn das Inventarmenü zum ersten Mal geöffnet wird, ist das Inventar des Spielers wahrscheinlich leer, es wird also nichts geben, was den Fokus erregen könnte Wir können dem Menüskript eine if-Anweisung hinzufügen , um zunächst zu überprüfen, ob das Standard-Fokuselement gesetzt wurde , bevor wir ihm sagen, dass es den Fokus übernehmen soll. Jetzt wird sich das Inventar, das kein Standard-Fokuselement hat, nicht mehr Mühe machen, den Fokus zu übernehmen, wenn es leer ist. Lassen Sie uns das Signal zum Drücken der geschlossenen Tasten mit der Schließfunktion des Inventarmenüs verbinden . Und stellen Sie die sichtbare Eigenschaft des Inventars als Standard ein, sodass es standardmäßig geschlossen ist. Lass es uns ausprobieren. Beim Öffnen des Menüs ist das Inventar des Spielers leer und die Bewegung und das Springen des Spielers wurden deaktiviert. Aber wir können das Inventar immer noch mit derselben Taste schließen , mit der es geöffnet wurde, wodurch die Steuerung durch den Spieler wieder aktiviert wird . Wir haben jetzt ein Inventarmenü in unserem Spiel, mit dem wir uns den Inhalt des Spielerinventars anzeigen lassen können . Und in der nächsten Lektion werden wir dieses Menü mit den Gegenständen der Spieler füllen und es dem Spieler ermöglichen sie auszuwählen , um mehr Informationen über sie zu erhalten Wir sehen uns in der nächsten Lektion. 6. Gegenstände: Hallo Freunde. In der vorherigen Lektion haben wir unserem Spiel ein Inventarmenü hinzugefügt. In dieser Lektion werden wir dem Inventarmenü Schaltflächen für Gegenstände hinzufügen . Unsere Artikel benötigen viel mehr Informationen als nur einen Anzeigenamen, und wir möchten nicht, dass diese Informationen an die Drei-D-Szene und das Modell des Artikels gebunden sind. Denn wenn sich der Gegenstand im Inventar des Spielers befindet, wird er nicht in drei D gezogen, sondern er wird im Inventarmenü in zwei D gezogen. Wir können alle Informationen über unsere Gegenstände in einem benutzerdefinierten Ressourcenskript zusammenfassen. Ich lege es in den Ordner für benutzerdefinierte Ressourcen und erstelle einen neuen Ordner für Elemente. Ich nenne es Element, das von der Ressource erbt wird. Dann geben wir dem Skript am Anfang des Skripts einen Klassennamen. Hier können wir alle Variablen exportieren wir zur Beschreibung des Gegenstands benötigen, wie seinen Namen und seine Beschreibung, sowie eine Textur mit zwei D sowie eine Textur mit zwei D, damit sein Symbol im Inventar des Spielers gezeichnet wird. Und wir können auch eine Drei-D-Szene des Gegenstands hinzufügen, aber das brauchen wir noch nicht, und wenn es falsch gemacht wird, machen wir dein Projekt kaputt. Lassen Sie uns vorerst einfach einen Kommentar hinzufügen, besagt, dass wir das später hinzufügen möchten. Speichern Sie das Skript, damit die Engine das Element als Ressourcenklasse erkennt. der rechten Maustaste in den Ordner für neue Elemente klicken, können wir jetzt eine neue Ressource vom Typ Element erstellen und sie nach dem Element benennen. Ich fange mit dem At an. Ich werde verlangen , dass jeder Gegenstand in meinem Spiel einen eindeutigen Namen hat und dass die Ressourcendatei dieses Gegenstands der Einfachheit halber auch die exakte Schreibweise dieses Namens verwendet. Die Ressource sollte automatisch im Inspektorfenster geöffnet werden , wenn sie erstellt wird. Aber wenn nicht, kann es durch Doppelklicken geöffnet werden. Wir können dann seine Eigenschaften anzeigen und bearbeiten. ihm einen Namen und eine Beschreibung geben, können wir das Symbol mit einer Atlas-Textur füllen entsprechende Sprite aus dem Spritesheet auswählen Ich ändere das Spriteslicing in ein Raster von 32 mal 32 Pixeln und wähle das X-Symbol und Ich werde auch die Ressource für den Gegenstand „ Gesundheitstrank“ mit einem Namen, einer Beschreibung und einem Symbol erstellen auch die Ressource für den Gegenstand „ Gesundheitstrank“ mit einem Namen, einer Beschreibung und Aber ich möchte, dass der Heiltrank stapelbar ist. Wir können Vererbung verwenden, um unseren Gegenständen zusätzliche Eigenschaften zu verleihen Lassen Sie uns eine weitere benutzerdefinierte Ressource erstellen von einem Element namens stackable erbt Dieses Skript fügt einen neuen Klassennamen hinzu, stapelbares erweiterbares Element, und es exportiert nur eine zusätzliche Variable, das Stapellimit des Elements, das ich Mit einem Doppelklick auf die potente Ressource Health im Bereich Rf-Counted können wir das Skript, von dem diese Ressource erbt, in das stapelbare Skript ändern von dem diese Ressource erbt, in das Jetzt können wir das Limit für die Stapelgröße festlegen. Bei einigen anderen Variablen werden die Werte dabei möglicherweise zurückgesetzt , und wir müssen sie erneut auffüllen Als Nächstes sollten wir die Artikelszenen öffnen und die alten Artikelskripte bearbeiten, die an sie angehängt Diese Skripte benötigen keinen Anzeigenamen mehr, sondern stattdessen einen Verweis auf die Artikelressource. Den können wir dann im Inspektor für jeden Artikel zuweisen. Als Nächstes, da wir nun ein richtiges Inventar-Skript haben, gehen wir zum Fortschrittsskript, machen die Inventarvariable öffentlich und verschieben die Funktion „Zum Inventar hinzufügen das Inventarskript, wo sie hingehört. Ich benenne es um, um Artikel hinzuzufügen, akzeptiere einen Artikel als Parameter anstelle eines Knotens drei d und lasse den Mengenparameter unverändert. Zurück im Progress-Ressourcenskript möchte ich zulassen, dass mehrere Kopien desselben Gegenstands im Inventar des Spielers erscheinen, was mit einem Wörterbuch etwas schwieriger wäre. Also ändere ich den Typ der Inventarvariablen in ein Array. Aber jedes Element im Inventar-Array benötigt immer noch eine Kennung, den Namen des Artikels, und wenn der Artikel stapelbar ist, dann auch eine Menge Das Inventar wird also eine Reihe von Wörterbüchern sein , wobei jedes Wörterbuch den Artikelnamen und möglicherweise weitere Details wie die Menge in diesem Inventarfeld enthält möglicherweise weitere Details wie Menge in Alle spezifischen Details zu einem Element, die geändert werden können und gespeichert werden müssen, müssten ebenfalls als Wörterbucheintrag aufgenommen werden Wenn der Spieler 98 Heiltränke und zwei Äxte einsammelt, sieht das Inventar am Ende ungefähr so aus Im Inventar-Skript müssen wir in der Lage sein, dem Inventarmenü Gegenstands-Schaltflächen hinzuzufügen , die jeden Gegenstand oder jeden Stapel von Gegenständen im Inventar des Spielers darstellen Stapel von Gegenständen im Inventar des Spielers Dafür benötigen wir eine Schaltfläche für vorgefertigte Gegenstände. Die, die wir in der vorherigen Lektion erstellt und im Ordner UI-Szenen gespeichert haben eine Szenendatei in ein Script ziehen dabei die Strg- oder Befehlstaste gedrückt halten, wird eine Konstante deklariert, die die Szene hält und die Szene wird mit einem Funktionsaufruf vorgeladen, wodurch ein gepackter Szenentyp zurückgegeben Konstanten werden üblicherweise in Großbuchstaben benannt und enthalten Werte, die sich definitionsgemäß Nennen wir das Prefab. Da es einen Bauplan für einen vorgefertigten Knopf enthält, werden wir Sie eine Funktion schreiben , die dem Inventarmenü eine Schaltfläche für einen neuen Artikel hinzufügt , akzeptiert sie einen Artikel und eine Menge als Parameter eine neue Artikelschaltflächenvariable deklarieren, instanziieren wir eine Kopie der vorgefertigten Ändern Sie dann die Textureigenschaft des Symbolknotens das Symbol , das zu diesem Element gehört Wenn die Menge etwas anderes als eins ist, setze ich die Texteigenschaft des Button-Label-Nodes auf die Menge , die in einen String-Typ umgewandelt wurde. Und wenn es eins ist, setze seine Eigenschaft visible auf false, um es auszublenden. Wir benötigen außerdem einen Verweis auf den Containerknoten, der die Schaltflächen enthält. Wir müssen den Typ des Containers oder der Artikel nicht angeben , egal ob es sich um ein vertikales Feld oder ein Raster handelt, sodass es immer noch funktioniert, wenn wir es später ändern möchten. Nachdem die Schaltfläche erstellt wurde, müssen wir sie nur noch zum Container hinzufügen , damit sie im Menü dargestellt wird. Wenn die Spielszene zum ersten Mal geladen wird, müssen wir das Inventar des Spielers so initialisieren , dass es bereits mit dem Inhalt der Inventargegenstände des Spielers gefüllt Inventargegenstände des Spielers Wenn wir jeden Gegenstand im Inventar des Spielers durchgehen, fügen wir dem Container für jeden Eintrag eine neue Gegenstandstaste hinzu Da es sich bei dem Wert, der im Inventar des Spielers gespeichert ist , um den Namen des Gegenstands handelt, müssen wir die Ressource laden, die die eigentlichen Artikelinformationen enthält eine beliebige Elementressource aus dem Dateisystem-Tab in das Skript ziehen dem Dateisystem-Tab in , erhalten wir einen Pfad zu ihr Wir können dann den Objektnamen in dieser Zeichenfolge durch den Namen des Gegenstands im Inventar des Spielers ersetzen dieser Zeichenfolge durch den Namen des , da sie alle genau so benannt sind wie ihr Gegenstandsname Wenn du möchtest, dass mehrere Gegenstände denselben Namen, aber unterschiedliche Eigenschaften haben , dann müsste der im Inventar gespeicherte Wert ein eindeutiger Dateiname sein, nicht der Anzeigename. Wir benötigen auch die Menge des Artikels, wenn der Artikel einen Mengenwert hat. Andernfalls können wir einfach von einer Menge von eins ausgehen. Dadurch werden die Buttons generiert, auf denen die 98 Zaubertränke und zwei Äxte angezeigt die 98 Zaubertränke und werden, mit denen das Spiel beginnen soll Wenn wir einen Gegenstand zum Inventar des Spielers hinzufügen, können wir zunächst feststellen, ob der Gegenstand stapelbar ist oder nicht, da der Prozess sehr unterschiedlich sein wird Rufen Sie dann separate private Funktionen auf, um einen stapelbaren Gegenstand oder einen einzelnen Gegenstand hinzuzufügen einen stapelbaren Gegenstand oder einen einzelnen Gegenstand einen einzelnen Gegenstand hinzufügen, schieben wir einfach ein neues Wörterbuch auf die Rückseite der Inventarliste des Spielers Ein Wörterbuch, das einen Namen enthält, den Artikelnamen. Wir können dann eine neue Artikelschaltfläche für diesen Artikel hinzufügen. Machen wir die Menge optional, indem wir ihr den Standardwert eins geben. Wenn der Artikel stapelbar ist, ist der Vorgang viel komplizierter Wir müssen zuerst das Inventar des Spielers durchsuchen , um vorhandene Stapel desselben Gegenstands zu finden Überprüfe, ob diese Stapel Platz für die hinzugefügten Gegenstände bieten, überprüfe, ob das Stapellimit überschritten wurde, und wiederhole den Vorgang, bis entweder alle Gegenstände zu den vorhandenen Stapeln hinzugefügt wurden oder alle vorhandenen Stapel Wenn es noch Gegenstände gibt, die hinzugefügt werden müssen, müssen wir neue Stapel erstellen, um sie Wir müssen jeden Stapel im Inventar des Spielers nacheinander durchgehen jeden Stapel im Inventar des Spielers nacheinander Wir überprüfen, ob der Name der in Slot I gespeicherten Gegenstände mit dem Namen dieses Gegenstands übereinstimmt Dann müssen wir überprüfen, ob noch Platz im Stapel ist , indem wir die Menge des Stapels mit der Stapelgrößenbeschränkung vergleichen . Dann können wir die Menge zum Stapel hinzufügen. Dann können wir die Menge so einstellen, der Stapelmenge minus der Stapelgrößenbeschränkung entspricht, was jetzt der Anzahl der Artikel entspricht, die die Stapelgrößenbeschränkung überschreiten. Wenn also die Menge jetzt größer als Null ist, wurde die Stapelgrößenbeschränkung überschritten, und wir können die Stapelgröße auf das Limit setzen. Wenn die Menge im Stapel das Limit nicht überschritten hat, sind wir fertig und können aus der Schleife ausbrechen. Menge enthält jetzt die Artikel noch zu einem Stapel hinzugefügt werden müssen, und die Schleife fügt weitere Artikel zu den Stapeln hinzu, bis die Menge aufgebraucht ist oder jeder Stapel voll ist nach Abschluss dieser Schleife Wenn nach Abschluss dieser Schleife noch eine Menge übrig ist, müssen wir neue Artikelstapel generieren, um sie zu lagern. Wir prüfen, ob die Menge kleiner oder gleich dem Stapellimit Wir können einen Stapel mit einer großen Menge erzeugen. Setzen Sie dann die Menge auf Null. Andernfalls können wir einen neuen vollen Stapel erstellen und die Menge um den Grenzwert des Stapels reduzieren und den Vorgang wiederholen. Hinzufügen neuer Schaltflächen zum Inventarmenü für die neuen Stapel Jedes Mal, wenn sich die Anzahl der Artikel in einem Stapel ändert, müssen wir das Etikett auf der Schaltfläche aktualisieren , damit es dem neuen Wert entspricht Lassen Sie uns also eine neue private Funktion erstellen, die die Schaltfläche und die neue Menge als Parameter akzeptiert , wobei die Schaltfläche innerhalb der untergeordneten Container denselben Array-Index hat wie der Inventarindex. Die Menge muss ebenfalls aktualisiert werden, bevor der Kreislauf durchbrochen werden kann. Definition dieser Funktion, wobei dieselben Parameter akzeptiert werden. Wir haben diesen Code bereits geschrieben als wir unsere neuen Artikelschaltflächen erstellt haben. Lassen Sie uns diesen Code in unsere neue Funktion verschieben und ihn auch hier aufrufen. Im Spielerskript können wir dieselbe Methode mit eindeutigen Namen verwenden, um einen Verweis auf das Inventar des Spielers zu erhalten. Wenn Sie dann die Interaktionstaste drücken, fügen Sie die Ressource, die dem nächstgelegenen Gegenstand zugeordnet ist, zum Inventar des Spielers hinzu. Zurück zum Inventar-Skript Um die Artikelinformationen anzuzeigen, müssen wir auch Verweise auf die Knoten Artikelname und Artikelbeschreibung abrufen . Schreiben wir eine weitere Funktion, die die Informationen zu einem Objekt auf der rechten Seite des Bedienfelds anzeigt Informationen zu einem Objekt auf der rechten Seite des Bedienfelds einen Artikel als Parameter akzeptiert. ihr den Standardwert Null geben, können wir dies auch verwenden, um keine Informationen anzuzeigen. Setzen Sie die Texteigenschaft Elementnamen auf den Elementnamen, wenn das Element nicht Null ist, andernfalls eine leere Zeichenfolge, und dasselbe gilt für die Beschreibung. Jedes Mal, wenn dem Menü eine neue Elementschaltfläche hinzugefügt wird, können wir das zugehörige Signal für den eingegebenen Fokus mit dieser Funktion verbinden. Die Funktion benötigt jedoch ein Element als Argument, und das Signal hat keine Argumente. Wir können Argumente mit einem Funktionsaufruf an ein Callable binden und das Element selbst übergeben Schließlich sollten wir beim Öffnen des Inventarmenüs, falls der Container untergeordnete Objekte hat, falls der Container untergeordnete Objekte hat, das oberste Kind anweisen, sich zu konzentrieren Und wenn es keine untergeordneten Elemente hat, werden Artikelinformationen angezeigt. Die Angabe von Null ist das Argument. Lass es uns ausprobieren. Wir beginnen mit 98 Heiltränken und zwei Äxten in unserem Inventar, und die Informationen zu den Heiltränken sind fokussiert, sodass die Informationen auf der rechten Seite angezeigt Nachdem wir die Gegenstände auf dem Tisch eingesammelt hatten, wurde ein Heiltrank zu dem Stapel mit 98 Heiltrank hinzugefügt , während der andere zusammen mit der anderen Axt einen neuen Stapel bildete Da die Tasten fokussiert sind, können sie auch mit den Pfeiltasten der Tastatur oder dem Steuerkreuz des Controllers bedient Wir haben jetzt das Spielerinventar im Menü angezeigt. In der nächsten Lektion wird es dem Spieler ermöglicht Gegenstände im Inventar fallen zu lassen oder zu konsumieren. Wir sehen uns in der nächsten Lektion. 7. Verbrauchsmaterialien: Hallo Freunde. In der vorherigen Lektion haben wir dem Inventar des Spielers Gegenstände hinzugefügt und Gegenstandsinformationen angezeigt. In dieser Lektion ermöglichen wir es dem Spieler, Gegenstände in seinem Inventar fallen zu lassen oder zu konsumieren. Im Inventarmenü müssen wir dem Spieler eine Auswahl seiner Optionen für den ausgewählten Gegenstand präsentieren . Einfachheit halber habe ich lediglich zwei Buttons unter der Artikelbeschreibung in einem horizontalen Feld angeordnet und benenne sie in Auxiliary und Drop um. die Stilfelder entferne, indem ich das Button-Design überschreibe, lasse ich auf der linken Taste nur „ Use“ und auf der rechten Taste „Drop“ stehen Nicht jeder Gegenstand im Spiel wird benutzbar sein, also macht es keinen Sinn, wenn die Axt ausgewählt ist, dass auf der Schaltfläche „ Benutzen“ steht Es wäre sinnvoller, dort Ausrüstung zu sagen. Diese Schaltfläche ist je nach Art des ausgewählten Elements kontextsensitiv . Ich möchte , dass diese Schaltflächen am unteren Rand des Bedienfelds gleichmäßig verteilt am unteren Rand des Bedienfelds gleichmäßig verteilt Ich stelle ihre horizontale Ausrichtung an „Erweitern“ und „Füllen“ ausgerichtet Setze dann auch die Ankerversätze der vertikalen Box zurück, damit sie innerhalb der Anker Außerdem weisen Sie die Beschreibung an, sie das vertikale Feld so weit wie möglich ausdehnen und ausfüllen soll, indem Sie die Schaltflächen an den unteren Rand des Bedienfelds drücken T. In den Projekteinstellungen füge ich Eingabezuordnungen für Ue-Element und Drop-Element Stellen Sie dann die X-Taste auf dem Controller Verwendung und die Y-Taste auf meinem Controller auf Drop Ich werde diese Tastenindikatoren auch zu den Texteigenschaften der Schaltflächen hinzufügen . Der Spieler weiß also , welche Taste auf dem Controller was macht. PC-Spieler können einfach auf die Tasten klicken. Ich würde den X- oder Y-Text entfernen und wahrscheinlich weitere Stilfelder für diese Schaltflächen für den PC-Export des Spiels hinzufügen weitere Stilfelder für diese Schaltflächen . Im Artikelressourcen-Skript können wir eine boolesche Variable hinzufügen, die angibt, ob ein Objekt nutzbar ist oder nicht, und eine weitere, um anzugeben, ob der Artikel verbraucht wird, wenn er verwendet wird Während wir hier sind, benötigen wir auch Zugriff auf die Three-D-Szene, die den eigentlichen Gegenstand enthält, sodass wir, wenn der Spieler den Gegenstand fallen lässt, ihn in der Szene erscheinen lassen können, oder wenn er den Gegenstand benutzt, können wir ihn tatsächlich an der Hand des Charakters erscheinen lassen Wir können nicht sowohl der Drei-D-Szene einen Verweis auf die Ressourcendatei als auch der Ressourcendatei einen Verweis auf die Drei-D-Szene geben der Ressourcendatei einen Verweis auf die Drei-D-Szene Dies ist eine zyklische Referenz, und wir erstellen eine Endlosschleife, die jede Szene unterbricht, die das Objekt enthält T. Stattdessen teilen wir der Artikelressource einfach wo sich die Drei-D-Szene befindet, geben ihr den Pfad dazu als Zeichenfolge, sodass wir sie laden können, wenn sie benötigt wird Dann können wir in der Health Potion-Ressourcendatei den Pfad der Gesundheitstink-Szene kopieren und ihn in das Szenenfeld einfügen Wir können festlegen, dass es nutzbar ist und bei Gebrauch konsumiert wird. Ich habe keine Pläne , ein Element zu implementieren, das nicht verbraucht wird, wenn es verwendet wird, aber es ist eine gute Idee, den Code flexibel zu gestalten. Und wiederhole das für den anderen Artikel. Im Inventarskript. Wir müssen mit Add On Ready einen Verweis auf die Aktionsschaltflächen abrufen . Wenn eine Elementschaltfläche fokussiert ist und Artikelinformationen angezeigt werden, können wir die Texteigenschaft der Zusatzschaltfläche so einstellen , dass sie angibt, ob das Objekt aktiviert ist und ihre deaktivierte Eigenschaft auf False setzen. Andernfalls deaktiviere ich die Schaltfläche vorerst einfach. Lassen Sie uns die Signale der gedrückten Tasten mit dem Inventar-Skript verbinden . Ich werde auch eine Eingabefunktion hinzufügen, die mitteilt, dass das gedrückte Signal der AUX-Taste ausgegeben wird das gedrückte Signal der AUX-Taste ausgegeben wenn die Taste „Objekt verwenden“ gedrückt wird. Aber nur, wenn das Inventarmenü geöffnet ist und die Taste aktiviert ist. Und machen Sie dasselbe, wenn die Drop-Item-Taste auf dem Controller gedrückt wird. Normalerweise würde ich eine Eingabefunktion nicht direkt in ein solches Skript einfügen, aber für einfache Tastenkombinationen halte ich es für in Ordnung, den Schritt der Verwendung eines separaten Skripts zur Eingabebehandlung zu überspringen . Wenn entweder die X-Taste mit dem Controller gedrückt wird oder die Use-Taste im Menü mit der Maus angeklickt wird, wird diese Funktion in beiden Fällen aufgerufen Aber wir müssen wissen, welcher Artikel ausgewählt ist. Und es könnte auch wichtig sein zu wissen, welcher spezifische Gegenstand im Inventar des Spielers befindet, wenn mehrere gleiche Gegenstände hat. Jedes Mal, wenn ein Gegenstand Fokus rückt und seine Informationen angezeigt werden, sollten wir auch die Schaltfläche akzeptieren, die diesen Gegenstand im Inventarmenü darstellt Standardwert Null geben, sodass es optional ist, können wir dieses Argument auch an das Callable binden und die Schaltfläche für das neue Objekt als weiteres Argument übergeben Ebenso wäre es eine gute Idee, wenn diese Schaltflächen den Fokus verlieren , keine Informationen anzuzeigen und die Schaltflächen zu deaktivieren Lassen Sie uns auch ihre ausgegebenen Signale mit derselben Funktion verbinden und die Argumente auf Null setzen Wenn kein Element ausgewählt ist, können wir nicht überprüfen, ob es nutzbar ist, und wir sollten beide Schaltflächen deaktivieren neue private Variablen deklarieren, die das ausgewählte Element und die entsprechende Schaltfläche enthalten sollen, können wir das ausgewählte Element und seine Schaltfläche speichern , wenn sie ausgewählt ist Wenn diese Aktionstasten den Fokus einnehmen, möchte ich der Objekttaste mitteilen, dass sie sofort wieder in den Fokus rückt , damit der Spieler immer weiß, welcher Gegenstand ausgewählt ist verbinden ihre fokussierten eingegebenen Signale, die beide dieselbe Funktion aufrufen können. Nennen wir es bei eingegebenem Action-Button-Fokus. Aber wenn diese Aktionsschaltflächen in den Fokus geraten, hat die ausgewählte Schaltfläche im gleichen Moment den Fokus verlassen Die ausgewählte Schaltfläche hat jetzt den Wert Null. Deklarieren wir eine weitere Variable namens zuvor ausgewählte Schaltfläche, die jedes Mal, wenn sich der Wert der ausgewählten Schaltfläche ändert, auf die ausgewählte Schaltfläche gesetzt wird. Wenn ich also den Fokus von einer Elementschaltfläche zu einer Aktionsschaltfläche ändere , wird die ausgewählte Schaltfläche auf Null gesetzt. Die zuvor ausgewählte Schaltfläche behält jedoch ihre Referenz bei, sodass wir der zuvor ausgewählten Schaltfläche mitteilen können, dass sie den Fokus übernehmen soll. Auf diese Weise kann der Spieler immer noch sehen, welcher Gegenstand ausgewählt wurde, wenn er auf die Aktionstasten klickt. Wenn nun eine der beiden Aktionen ausgeführt wird, können wir leicht auf die Schaltfläche zugreifen, die ausgewählt ist, sowie auf den Gegenstand, den diese Schaltfläche im Inventar des Spielers darstellt. Um ein Objekt zu löschen, können wir, wenn ein Objekt ausgewählt ist, zunächst eine Variable deklarieren, die eine Instanz dieses Elements enthält, und ihren Wert auf „Laden“ setzen, indem wir den Pfad zur Szene, wie er in der Ressourcendatei für das Objekt gespeichert ist, übergeben und instanziieren Fügen Sie dieses Element dann dem Szenenbaum hinzu. Sie möchten wahrscheinlich, dass es ein untergeordnetes Element des Level-Knotens automatisch zusammen mit der Ebene entfernt wird , wenn sie entladen wird Der Einfachheit halber füge ich es einfach dem Game Manager hinzu eine Variable so deklariert eine zufällige Richtung entlang der xd-Ebene repräsentiert, wird sie eine Zufallszahl zwischen Null und T sein. wird sie eine Zufallszahl zwischen Null und T sein. To steht für den vollen Umfang eines Kreises Anschließend legen wir die globale Position des Objekts so fest, dass sie sich in der Nähe der globalen Position des Spielercharakters etwas über dem Boden befindet. Dabei wenden wir Sinus und Kosinus auf die Richtung an, wenden wir Sinus und Kosinus auf um die X- und Z-Werte der neuen wir zunächst sicher, dass wir einen Verweis auf den Spielercharakter haben , der einen eindeutigen Namen verwendet Und entferne den abgeworfenen Gegenstand aus dem Inventar des Spielers, indem du den Gegenstand, der entfernt wurde, eine Menge von eins und den ausgewählten Button, der für den spezifischen Gegenstand steht, weitergibst eine Menge von eins und den ausgewählten Button, . Wenn der Spieler die zusätzliche Aktionstaste drückt, wenn ein Gegenstand ausgewählt ist und dieser Gegenstand verwendet werden kann, können wir eine separate private Funktion aufrufen um den ausgewählten Gegenstand zu verwenden. Wenn andere Verwendungsmöglichkeiten der AUX-Taste relevant werden, können hier weitere Funktionen hinzugefügt werden. Um einen Gegenstand zu verwenden. Wenn der Spielercharakter auf dem Boden liegt und nicht gerade mit etwas anderem beschäftigt ist, verwende ich die Variable kann bewegen, auch wenn sie als privat markiert ist. Dann können wir dem Charakter sagen, dass er den Gegenstand benutzen soll. Wenn der Gegenstand beim Benutzen verbraucht wird, können wir ihn aus dem Inventar des Spielers entfernen, indem wir den ausgewählten Gegenstand, eine Menge von eins und seine Schaltfläche als Argumente weitergeben . Da ich dem Charakter eine E-Item-Animation hinzufügen werde und ich möchte, dass der Spieler sie sieht, schließe ich das Inventar des Spielers, wenn er darum bittet einen Gegenstand zu verwenden, sodass wir sehen können, wie die Animation abgespielt wird. Das Entfernen eines Gegenstands aus dem Inventar des Spielers entspricht weitgehend dem Hinzufügen eines Gegenstands, wobei das Verhalten bei stapelbaren Gegenständen anders ist als eines Gegenstands, wobei das Verhalten bei stapelbaren Gegenständen anders bei einzelnen Gegenständen Wenn also ein einzelnes Objekt entfernt wird und die Schaltfläche nicht Null ist, können wir den Inventareintrag, dessen Index mit dem untergeordneten Index dieser Schaltfläche übereinstimmt, aus dem Array der untergeordneten Objekte des Containers entfernen den Inventareintrag, dessen Index mit dem untergeordneten Index dieser Schaltfläche übereinstimmt, aus dem Array der untergeordneten Objekte des Containers Und entfernen Sie auch die Artikelschaltfläche aus dem Inventarmenü und kehren Sie zurück. Ich mache das in einer anderen privaten Funktion, um auch die korrekte Kontrolle über die ausgewählten und zuvor ausgewählten Button-Referenzen zu behalten korrekte Kontrolle über die ausgewählten und zuvor ausgewählten . Falls der Button nicht zur Verfügung gestellt wurde, müssen wir das Spielerinventar durchsuchen , um diesen Gegenstand zu finden. Sobald wir ihn gefunden haben, können wir ihn aus dem Inventar und den Kindern des Containers entfernen und zurückkehren. Bevor wir eine Artikelschaltfläche entfernen, müssen wir überprüfen, ob diese Schaltfläche ausgewählt wurde oder zuvor ausgewählt wurde. Und wenn ja, setzen Sie diese Verweise auf Null, damit wir nicht versehentlich versuchen, auf Schaltflächen zu verweisen , die nicht mehr existieren. Wir werden hier free anstelle von Q free verwenden, um den Effekt sofort zu erzielen , anstatt das Ende des aktuellen Frames zu warten. Auf diese Weise werden für den Fall, dass mehrere Einträge aus dem Inventar des Spielers entfernt werden müssen, die untergeordneten Container trotzdem mit den Inventarindizes übereinstimmen jedoch diese Schaltfläche entfernen , die derzeit den Fokus hat, müssen wir einer benachbarten Schaltfläche mitteilen, dass sie den Fokus übernehmen soll Also rufe ich eine private Funktion auf, um den Fokus auf das nächste Element in der Liste hier zu verlagern. Wie dies gehandhabt wird, hängt von der Anzahl der Kinder ab, die der Container derzeit hat. Wenn es weniger als zwei Kinder gibt, muss nichts mehr in den Fokus gerückt werden und wir können zurückkehren. Wenn keine Taste als Bezugspunkt angegeben wurde, können wir dem obersten Kind einfach sagen, dass es den Fokus behalten soll. Wenn eine Schaltfläche bereitgestellt wurde, müssen wir ihren untergeordneten Index innerhalb des Containers kennen. Wenn der nächste Index gültig ist, was bedeutet, dass er kleiner ist als die Anzahl der untergeordneten Objekte des Containers, kann das nächste Kind den Fokus übernehmen. Andernfalls ist dies das letzte Kind, und wir möchten stattdessen, dass das vorherige Kind den Fokus übernimmt. Kombinieren wir das zu einer Turn-Re-Aussage. Wir können dann mit dem Entfernen der Elementschaltfläche fortfahren , da sie keinen Fokus mehr hat. Das Entfernen eines stapelbaren Gegenstands wird etwas komplizierter sein. Wenn eine bestimmte Schaltfläche bereitgestellt wurde, können wir ihren untergeordneten Index innerhalb des Containers abrufen Entferne dann die Menge aus dem Stapel im passenden Inventarfach. Wenn das Ergebnis der Subtraktion kleiner oder gleich Null ist, ist der Stapel leer Wenn der neue Mengenwert auf den negativen Wert der aktuellen Stackgröße gesetzt wird, enthält dieser Wert nun den Betrag, den der Stapel die Menge, die wir entfernen wollten, unterschritten So können wir sowohl den Inventarstapel als auch die Schaltfläche, die ihn repräsentiert, aus dem Menü entfernen . Wenn das Ergebnis der Subtraktion eine positive Zahl war, dann ist der Stapel nicht leer, und wir müssen nur seinen neuen Mengenwert aktualisieren Dann kehre zurück, da wir fertig sind. Nachdem wir die vorgeschlagene Schaltfläche überprüft haben, müssen wir, falls noch eine Menge übrig ist, die entfernt werden muss, falls noch eine Menge übrig ist, die entfernt werden muss, das Inventar des Spielers durchsuchen , um weitere Stapel dieses Artikels zu finden Wir können dann dieselbe Logik wie oben wiederholen den Index-Alias I anstelle des Index der Schaltfläche verwenden I anstelle des Index der Schaltfläche Und das Entfernen der passenden Schaltfläche , deren untergeordneter Index mit dem Inventarindex übereinstimmt. Wenn wir jemals eine Menge von Null erreichen, sind wir fertig. Wählen Sie in einer Charakterszene den Animationsbaumknoten in der Zustandsmaschine für verschiedene Zustände aus. Wir können die Animation für den Verwendungszweck hinzufügen. Denn wie andere Animationen hier beginnt und endet sie auch mit der Dopose dieselben Übergangseinstellungen wie bei den anderen Animationen verwendet , der erweiterte Modus für den Übergang in die Animation aktiviert und der Modus für den Übergang aus der Animation auf „Ende“ gesetzt den Übergang in die Animation aktiviert und der Modus für den Übergang aus der Animation auf „Ende Durch Drücken des Play-Symbols können wir eine Vorschau der Animation anzeigen. wir im Skript eine neue öffentliche Funktion hinzu, Fügen wir im Skript eine neue öffentliche Funktion hinzu, um ein Element zu verwenden und ein Element als Parameter zu akzeptieren. Dazu benötigen wir einen Verweis auf die Haupthand des Charakters, damit wir wissen, wo wir den Gegenstand positionieren müssen, der verwendet wird. Dies wird auch die Haupthandposition sein, die zum Ausrüsten von Waffen verwendet wird. also eine neue exportierte Kategorie für Ausrüstung erstelle, exportiere ich eine neue Variable für die Haupthand des Charakters mit einer Art Knochenaufsatz drei D. Wenn ich also eine neue exportierte Kategorie für Ausrüstung erstelle, exportiere ich eine neue Variable für die Haupthand des Charakters mit einer Art Knochenaufsatz drei D. Ich wähle den Wurzelknoten meines Charakters aus. Dieser Ausrüstungsslot für die Haupthand wird derselbe Knotenpunkt für die Knochenbefestigung sein die Haupthand wird derselbe Knotenpunkt für die Knochenbefestigung , auf dem sich zuvor das einhändige X befand. Wenn wir einen Gegenstand verwenden, deklarieren wir eine neue Variable Wenn wir einen Gegenstand verwenden, deklarieren wir eine neue Variable, die eine Instanz des Gegenstands enthält, und weisen seinem Wert den Wert „Laden“ zu. Wir übergeben den Pfad zu den drei D-Szenen, die in der Artikelressource gespeichert sind, als Argument und instanziieren ihn Dadurch wird der Gegenstand erstellt , den wir als untergeordnetes Objekt zum Hauptausrüstungsslot hinzufügen werden Hauptausrüstungsslot Aber dieser Gegenstand hat Physik und Kollisionen. Es wird mit dem Charakter kollidieren und von der Schwerkraft beeinflusst werden Wir müssen seine Freeze-Eigenschaft auf true setzen, damit die Engine all das ignoriert und es einfach so behandelt, als ob es an der Hand des Charakters kleben würde Als Nächstes warten wir auf den Abschluss der Animation mit dem Verwendungsgegenstand. schließlich die Objektinstanz in die Warteschlange stellen, die aus dem Szenenbaum entfernt werden soll, gehen wir einfach davon aus, dass die Hand des Charakters leer ist, bevor all das passiert Hier würden die Effekte der Verwendung des Gegenstands aktiviert, aber wir drucken einfach eine Anweisung aus, die als Platzhalter dient , damit wir wissen, dass sie funktioniert Kleinere Korrekturen im Inventar-Skript. Wir können die Schaltfläche für den vorgeschlagenen Artikel nur einmal entfernen. Wenn Sie mehrere einzelne Artikel entfernen, verwenden wir nach dem ersten jedes Mal null. Und wenn wir der nächsten Schaltfläche sagen, dass sie den Fokus übernehmen soll, sollten wir sie nicht sofort danach auf Null setzen . Lass es uns ausprobieren. Wenn wir das Inventar öffnen, haben wir 98 Zaubertränke. Wir können einen verwenden, der das Inventar schließt, und wir können sehen, wie der Charakter einen Trank in der Hand hält, ihn trinkt und das Inventar erneut öffnen, haben wir jetzt 97 Zaubertränke, und wir können einige Gegenstände fallen lassen und sie aus dem Inventar entfernen, die nun nach dem Schließen des Inventars auf dem Boden um den Charakter herum verstreut sind nach dem Schließen des Inventars auf dem Boden um den Charakter Wir können die Gegenstände sogar wieder aufnehmen und sie wieder dem Inventar des Spielers hinzufügen Wir haben jetzt Gegenstände, die im Inventarmenü des Spiels fallen gelassen oder verwendet werden können . In der nächsten Lektion werden wir es dem Spieler ermöglichen, Rüstung und Waffen auszurüsten. Wir sehen uns in der nächsten Lektion. 8. Ausrüstung: Hallo, Freunde. In der vorherigen Lektion haben wir dem Spieler erlaubt, Gegenstände aus seinem Inventar über das Menü zu verwenden oder fallen zu lassen. In dieser Lektion werden wir es Spielern ermöglichen , ihren Charakter mit Gegenständen auszustatten. Jeder unserer Charaktere hat mehrere verschiedene Gegenstände in der Hand, einen Umhang und einen Hut. Bis auf den Rogue, dessen Motorhaube leider nicht vom Rest des Modells getrennt ist , sodass wir sie nicht als Ausrüstung verwenden können All diese Gegenstände können nach den Methoden der vorherigen Lektionen in Gegenstände umgewandelt werden , die wir dann aufsammeln und dem Inventar des Spielers hinzufügen können aufsammeln und dem Inventar des Spielers hinzufügen Beachten Sie, dass der Schurke keinen Hutknochenaufsatz und der Magier keinen eigenhändigen Knochenaufsatz Wir können das beheben, indem unsere eigenen Knochenansatzknoten hinzufügen Charakter unsere eigenen Knochenansatzknoten hinzufügen und sie an die richtigen Knochen innerhalb des Skeletts anhängen sie an die richtigen Knochen innerhalb des Skeletts In der Mags-Charakterszene können wir dem Skelett einen untergeordneten Knoten vom Typ Bone Attachment Three D hinzufügen vom Typ Bone Attachment Three D und ihn in etwas wie „Offhand“ umbenennen Hängen Sie diesen Knoten dann im Inspektor an die erste Hand an, also links, und jetzt folgt dieser Knoten in allen Animationen automatisch der linken Hand des Charakters der linken Hand des das Buch auf diesen neuen Knochenaufsatz ziehen, können wir sehen, wie es weiterhin der linken Hand folgt Alle anderen Gegenstände, die dazu bestimmt sind, in den Händen des Charakters gehalten zu werden, können wieder in die Fächer für die Haupthand- oder Nebenausrüstung gelegt werden, bevor sie zu ihren eigenen Szenen gemacht werden, um ihre relative Position und Rotation beizubehalten ihre relative Position und Wir können diesen Vorgang dann wiederholen, um einen Hutknochenaufsatz für die Reihenfigur hinzuzufügen einen Hutknochenaufsatz für , die ihrem Kopfbein folgt Außerdem werde ich die Knoten neu organisieren und umbenennen , damit sie exakt denen des Magiers entsprechen Der Mags Hat-Slot unterscheidet sich auch von den anderen Charakteren Er ist höher positioniert und leicht gedreht. Um uns das Leben zu erleichtern, fügen wir einen neuen Knochenknoten hinzu, der dem Kopf der Majes folgt , und verwenden ihn stattdessen als Hüte wir das Hut-Asset von seinem bestehenden Knochenansatz auf den neuen ziehen seinem bestehenden Knochenansatz auf , erhalten wir auch die genaue Position und den Rotationsunterschied dieses Wenn wir die Objekt-Szene mit dem Majes-Hut erstellen, können wir diese Position und Drehung zu einem natürlichen Bestandteil der Szene machen Drehung zu einem natürlichen Bestandteil der Mit diesen Methoden sollten all unsere Charaktere dieselben vier Ausrüstungsplätze haben, und jeder Charakter kann mit jedem Gegenstand ausgerüstet werden Die Ausrüstungsplätze können aus Konsistenzgründen umbenannt werden , wenn ihr das vorzieht, und ungenutzte Knotenpunkte mit drei N Knoten können aus den Charakterszenen gelöscht werden. Aber bei einigen Charakteren schneiden die Haare durch einige Hüte. In einigen Spielen wirst du feststellen, dass dem Charakter Haare entfernt werden , wenn ein Helm oder eine Mütze angebracht ist, um dieses Problem zu beheben. Bei diesen Objekten ist das Haar Teil des Kopfmodells. Wir müssen also entweder einschränken, Wir müssen also entweder einschränken wer welchen Hut tragen darf, den Hut skalieren oder neu positionieren je nachdem, wer ihn trägt, oder das Problem einfach ignorieren Insbesondere bei der Verwendung von Platzhalter-Assets ist es besser, die Einschränkungen zur Kenntnis zu nehmen und sicherzustellen, dass die endgültigen Produktionsressourcen die Probleme lösen, anstatt sie zu replizieren Bevor wir neue Artikelressourcen erstellen, definieren wir zunächst einen neuen Typ von Artikelressource Wir nennen das „Ausrüstung“, also „vom Gegenstand erben“. diese Weise können wir Gegenständen, die unter diese Kategorie fallen, eine neue Variable hinzufügen , nämlich die Art der Ausrüstung, um die es sich handelt, was bestimmt, wie sie ausgerüstet werden können In den Aufzählungen unserer Projekte können wir eine Aufzählung der verschiedenen Ausrüstungsplätze für unser Spiel, Haupthand, Nebenhand, Kopf und Rücken, sowie alle anderen Ausrüstungsplätze hinzufügen der verschiedenen Ausrüstungsplätze für unser Spiel, Haupthand, Nebenhand, Kopf und Rücken, , Die Aufzählung der Gerätetypen kann jetzt als Typ für die Ausrüstungstypvariable verwendet werden , sodass wir sie einfach im Inspektor festlegen können Umschalten des Achsenskripts von Objekt auf Ausrüstung. Es kann als Ausrüstung für den Haupthandplatz des Charakters verwendet werden . Im Charakterskript können wir weitere Variablen für jeden Ausrüstungsplatz hinzufügen weitere Variablen für jeden Ausrüstungsplatz oder die Variable in ein Array von Knochenanhängen umwandeln , die Sockeln genannt werden. Wenn du einen Gegenstand benutzt, ist die Haupthand jetzt Sockel Null. Weisen Sie dann jedem einzelnen Bone-Attachment Sockets in der gleichen Reihenfolge im Array für jedes Zeichen zu. Als Nächstes können wir neue öffentliche Funktionen hinzufügen, um dem Charakter mitzuteilen , ob er Ausrüstungsgegenstände ausführen oder ausführen soll. Für das Anlegen eines Ausrüstungsgegenstands ein Verweis auf den Gegenstand erforderlich, und für das Ablegen wird nur der Steckplatz benötigt Ein Ausrüstungsstück mit D zu versehen ist fast dasselbe, als würde man den Trank instanziieren und in die Hand des Charakters legen Die Haupthandbuchse durch die Steckdose ersetzen , für die der Gegenstand bestimmt ist Beim Dopping müssen wir nur überprüfen, ob die Steckdose ein Kind hat, und wenn ja, das Ding entfernen einen Gegenstand benutzen, können wir nicht mehr davon ausgehen, dass ihre Hände leer sind Deklarieren wir eine neue Variable, die den Inhalt des Charakters enthält , bevor ihm gesagt wurde , dass er das Objekt benutzen soll. Wenn die Haupthandbuchse ein Kind hat, dann ist es das, was sie in der Hand gehalten hat, und wir sollten ihre Eigenschaft sichtbar so einstellen fällt, um sie zu verstecken, wenn sie das Objekt benutzen. Wenn sie etwas in der Hand gehalten haben, bevor sie das Objekt benutzt können wir dessen Eigenschaft visible wieder auf true setzen , nachdem die Verwendung des Elements abgeschlossen ist. In der Fortschrittsressource müssen wir den Überblick über alles behalten, was der Spieler ausgerüstet hat. Eine einfache Möglichkeit, Objekte innerhalb des Inventars zu referenzieren , wäre die Verwendung ihres Array-Index Die Ausrüstung unseres Spielers ist also eine Reihe von ganzen Zahlen, wobei jedes Element in der Reihe den Array-Index der Ausrüstung im Inventar des Spielers enthält Array-Index der Ausrüstung im Inventar des Spielers den Inhalt des Arrays für jeden Eintrag standardmäßig auf minus eins setzen, können wir eine negative Eins als Zeichen dafür verwenden dass der Slot leer Nun verbinden wir das alles mit dem Inventarmenü. Wenn die Schaltfläche eines Gegenstands aktiviert ist, werden die zugehörigen Informationen angezeigt, aber wir müssen separate Felder erstellen , wenn es sich um ein Ausrüstungsstück handelt. Unterteilen Sie dann weiter, je nachdem, ob dieser Gegenstand gerade ausgerüstet ist oder nicht. In beiden Fällen ist die Zusatztaste aktiviert, aber die Drop-Taste sollte deaktiviert sein , wenn der Artikel damit ausgestattet ist. Ändern Sie den AUX-Schalter , um ihn entsprechend auszurüsten oder auszurüsten. Woher wissen wir, ob der ausgewählte Artikel ausgestattet ist? Wir müssen seinen Index innerhalb der untergeordneten Objekte des Containers kennen, da dies die Zahl ist, die im Ausrüstungsfeld der Fortschrittsressource gespeichert ist. Dann können wir überprüfen, ob die Ausrüstungsmatrix an der Indexposition der ausgewählten Objekte diesem Wert entspricht , und dann „Wahr“ oder „Falsch“ zurückgeben. Das alles kann in einer einzigen Codezeile erledigt werden. Ob die Drop-Schaltfläche deaktiviert ist oder nicht, muss auch für Verbrauchsgüter und Nullkisten Wenn die AUX-Taste gedrückt wird dem ausgewählten Gegenstand um Ausrüstung handelt, können wir dieselbe Bedingung verwenden, um den ausgewählten Gegenstand entweder zu entfernen oder auszurüsten Um einen Gegenstand auszurüsten, setzen wir das Ausrüstungsfeld in der Fortschrittsressource auf den Index des Gegenstandsplatzes so dem Array-Index des Gegenstands im Inventar des Spielers entspricht Sag dem Charakter dann , dass er die Ausrüstung machen soll. Ich werde das Etikett auf dem Gegenstand wiederverwenden aber indem ich seinen Standardtext auf ein großes E für Ausrüstung setze und seine sichtbare Eigenschaft auf „Beim Ausrüsten “ setze Ich werde auch den Text der Zusatzschaltflächen aktualisieren und die Drop-Schaltfläche deaktivieren Um einen Gegenstand auszurüsten, setzen wir das Ausrüstungsfeld an der Indexposition des Gegenstandsplatzes auf einen negativen Wert von eins, da es jetzt leer ist. Dadurch wird der Charakter angewiesen, alles zu entfernen, was er in der entsprechenden Buchse hat Blendet das E für ausgerüstet auf der Taste aus, datiert den Text der Hilfstasten und aktiviert die Drop-down-Schaltfläche Bevor wir jedoch einen Gegenstand ausrüsten, müssen wir überprüfen, ob ein Gegenstand in diesem Steckplatz bereits vorhanden ist, was bedeutet, dass der Wert der Ausrüstungsmatrix an der Indexposition des Gegenstandsplatzes alles andere als negativ ist In diesem Fall sollten wir dem Charakter sagen, dass er das tun soll, was er in diesem Sockel hat Suchen Sie dann auch die Schaltfläche im Container , deren Index mit dem Wert des Equipment-Arrays übereinstimmt, sodass wir das E für equipped ausblenden können Wir können dann mit der Ausrüstung des ausgewählten Artikels fortfahren. Damit das funktioniert, müssen die Werte in der Ausrüstungsmatrix immer mit den Array-Indizes der Gegenstände im Inventar des Spielers übereinstimmen der Gegenstände im Inventar des Spielers Die Array-Indizes ändern sich jedoch jedes Mal, wenn eine Gegenstandstaste entfernt wird. Lassen Sie uns den Array-Index als Parameter benötigen wenn wir die Artikelschaltflächen aus dem Inventarmenü entfernen, da wir ihn sowieso jedes Mal finden. Dann können wir das Geräte-Array nach beliebigen Werten durchsuchen , die größer sind als der Index des zu entfernenden Artikels. Wenn ja, können sie um eins reduziert werden, sodass sie immer noch dem Index des ausgerüsteten Gegenstands entsprechen. In meiner Fortschrittsressource beginne ich den Spieler mit einer Reihe neuer Gegenstände in seinem Inventar und habe auch einige davon. Nachdem wir zuerst das Inventar des Spielers initialisiert haben, können wir auch das Ausrüstungsfeld durchgehen Wenn der Ausrüstungsslot etwas anderes als negativ ist, können wir die Schaltfläche finden deren Index mit dem hier gespeicherten Wert übereinstimmt Um die Sache zu vereinfachen, verwende ich einfach vorhandene Funktionen, sage der Taste, dass sie den Fokus übernehmen soll , und rüste den ausgewählten Gegenstand Wenn nun das Inventar initialisiert ist, ist der Spieler auch mit den Gegenständen ausgestattet, die in seiner Datei gespeichert sind . Lass es uns ausprobieren. Der Charakter ist zunächst mit ein paar Gegenständen ausgestattet und beim Öffnen des Inventars stehen uns mehrere zur Auswahl. Wir können Gegenstände ausrüsten, neue ausrüsten. Wenn wir versuchen, einen Gegenstand an einem besetzten Platz auszurüsten, ist der ausgerüstete Gegenstand unausgerüstet, bevor Wenn wir einen Trank trinken, wird der Haupthandgegenstand des Charakters während der Animation versteckt und kommt zurück, wenn er fertig mit Gegenständen ausgestattet werden Der Spielercharakter kann jetzt über das Inventarmenü In der nächsten Lektion werden wir es dem Spieler ermöglichen, Gegenstände mit einem NPC zu tauschen Wir sehen uns in der nächsten Lektion. 9. Shop: Hallo Freunde. In der vorherigen Lektion haben wir dem Spieler erlaubt, Gegenstände aus dem Menü auszurüsten. In dieser Lektion lassen wir sie Gegenstände von einem NPC kaufen und verkaufen Um Zeit zu sparen, werde ich dasselbe Inventarmenü wiederverwenden , um den Shop zu erstellen Ich benenne den vertikalen Box-Container in Info um und dupliziere ihn, um ein weiteres Steuerelement mit denselben Ankern und derselben Größe zu erstellen , und benenne es in Shop um Statt des Namens und der Beschreibung des Gegenstands wird der Shop einen Scrollcontainer enthalten, der einen Rastercontainer mit dem Lagerbestand des Ladens enthält , genau wie den, der die Gegenstände des Spielers Der Scrollcontainer kann den Raum füllen, indem du die Knöpfe nach unten drückst. Anstelle der Zusatzschaltfläche werde ich ein Münzsymbol dem Preis des aktuell ausgewählten Artikels und eine kontextsensitive Transaktionsschaltfläche zum Kauf oder Verkauf des ausgewählten Artikels verwenden. Das Münzsymbol kann sein Seitenverhältnis beibehalten, passt aber proportional in den dafür vorgesehenen Bereich Ich werde herausfinden, wie viel Platz der Preis maximal einnehmen könnte , und diesen als benutzerdefinierte Mindestgröße verwenden Dann kann die Schaltfläche den Rest des Platzes nutzen. Ich füge außerdem einen Abstand von 32 Pixeln zwischen diesen drei Steuerelementen innerhalb des horizontalen Box-Containers und ändere die Texteigenschaft der Transaktion wie folgt: Lassen Sie uns den Lagerbestand mit ein paar Scheinartikeln füllen , um zu sehen, wie es aussieht Die Rasterspalten sollten gut in den Raum passen. Um zwischen der Inventaransicht und der Shop-Ansicht zu wechseln, müssen wir lediglich die Sichtbarkeit zwischen den Knoten Info und Shop umschalten die Sichtbarkeit zwischen den Knoten Info und Shop Außerdem können wir auch den Titel ändern Wenn du mit deinem Shop minus Layout zufrieden bist, kannst du die Dummy-Artikel aus dem Ladenbestand löschen Im Skript muss ich den Knotenpfad zum Info-Node aktualisieren , damit er seinen neuen Namen wiedergibt Wir benötigen Verweise auf den Titel-, Info- und Shop-Nodes, damit wir sie hin und her austauschen können, sowie auf den Container, der den Lagerbestand, das Preislabel und die Transaktionsschaltfläche enthält. Unser Inventar-Skript wird etwas umfangreich. Eine nützliche Methode, um längere Skripte organisieren, besteht darin, Codebereiche mithilfe von Kommentaren zu erstellen. Mit einem Regionskommentar über einem Codeblock, der die Region benennt , und einem Kommentar zur Endregion am Ende der Region. Die Region kann reduziert und erweitert werden , um das Skript besser zu organisieren. Fügen wir eine neue öffentliche Funktion hinzu, die das Inventarmenü als Shop öffnet. Wir ändern den Titel in Shop statt Inventar, setzen die Eigenschaft visible der Info-Ansicht auf false und die Sichtbarkeit der Shop-Ansicht auf true. Wir können dann unsere bestehende Öffnungsfunktion aufrufen , um auch den Rest dieser anderen Dinge zu erledigen. Wir müssen auch eine Funktion erstellen, um das Menü im Inventarmodus zu öffnen, Titel wieder auf Inventar zurückzusetzen und die Sichtbarkeit der Info- und Shop-Knoten rückgängig zu Sichtbarkeit der Info- und Shop-Knoten rückgängig Der Spielmanager öffnet das Menü als Inventar, wenn die Inventartaste gedrückt Mithilfe des Event-Management-Systems, das wir im vorherigen Kurs entwickelt haben, können wir jedem Charakter in unserer Level-Szene einen D-Node mit Bereich drei zuordnen und ihn in Shop umbenennen. als Kind eine Kollisionsform mit drei D hinzugefügt haben, können wir ihr eine Größe und Form geben, die der Spieler mit seiner Interact-Neufassung leicht ins Visier nehmen Der Bereich Drei D muss nichts überwachen, sondern muss auf der Kollisionsebene speziell auf Interaktionen beschränkt sein und hat keine Kollisionsmaske und hat keine Weitere Informationen zu Interaktionsereignissen finden Sie im vorherigen Kurs „Dialog und Veranstaltungen Lassen Sie uns ein neues Skript für diesen Knoten erstellen, im Ordner mit den Veranstaltungsskripten gespeichert wird. Vom Interaktionsereignis erben. In diesem Skript können wir eine Reihe von Artikeln exportieren, um den Bestand an Artikeln darzustellen , die zum Kauf angeboten werden Wie bei jedem Event-Skript schreiben wir eine Run-Event-Funktion, die den Eventmanager als Parameter akzeptiert, der alle Objektreferenzen enthält, die unsere Ereignisse möglicherweise benötigen, um ihre Aufgabe zu erfüllen. In diesem Fall benötigt der Eventmanager einen Verweis auf das Inventar des Spielers und den Shop, falls du dafür ein separates Menü verwendest. Auf diese Weise kann der Eventmanager bei Bedarf auch während Events oder Dialogen Gegenstände zum Inventar des Spielers hinzufügen oder daraus entfernen Gegenstände zum Inventar des Spielers hinzufügen oder daraus . Das Shop-Skript kann dann den Eventmanager bitten , das Shop-Menü zu öffnen. Übergabe eines Verweises an sich selbst ist ein Argument, sodass das Inventar Zugriff auf den Bestand und alle anderen von Ihnen gewünschten öffentlichen Variablen hat. Geben wir dem den Klassennamen Shop, damit das Inventar-Skript einen Shop als Parameter akzeptieren kann , wenn das Menü als Shop geöffnet wird. Um den Await-Befehl während des Events verwenden zu können, unsere Funktion „Als Shop öffnen muss unsere Funktion „Als Shop öffnen“ auch ein Awart-Signal zurückgeben. den Shop als Parameter akzeptieren, können wir einen Verweis darauf speichern , wenn wir das Inventarmenü als Shop öffnen. Das Signal wird zurückgegeben, wenn das Inventarmenü geschlossen wird. Wir können dieses Signal jedes Mal ausgeben, wenn das Fenster geschlossen ist, auch wenn niemand darauf hört, wenn das Menü als Inventar des Spielers geöffnet wird. Um unsere Shops einzigartiger zu machen, sollten wir auch eine Dialogzeile für den Verkäufer als Intro und eine weitere als Outro exportieren Intro und eine weitere als Outro Fügen Sie diese dann der Run-Event-Funktion als zusätzlichen Dialog hinzu, bevor und nachdem der Shop aufgerufen wurde Und sag dem Game Manager , dass er das Event beenden soll. Wir können sogar einen Wertmultiplikator namens Markup exportieren , um verschiedenen Anbietern unterschiedliche Preise für ihre Artikel zu geben unterschiedliche Preise für ihre Ich lege den Standardaufschlag auf das Zehnfache des Werts fest. Lasst uns den Nachtladen mit dem Heiltrank und der Axt Heiltrank und der Eine sowie eine Intro- und Outro-Dialoglinie. In unserer benutzerdefinierten Artikelressource können wir jedem Artikel einen Wert als Ganzzahl mit einem Standardwert von einer Münze zuweisen Ganzzahl mit einem Standardwert von einer Jedem Gegenstand im Spiel kann dann ein anderer Wert zugewiesen werden , der in diesem Fall dem Betrag entspricht, für den der Spieler einen Gegenstand verkaufen kann. Aber wir kaufen für das Zehnfache dieses Preises. Zurück im Inventar-Skript wäre es auch nützlich, die Münzen des Spielers anzuzeigen. Machen wir daraus einen einzigartigen Knoten und schnappen wir uns auch diesen. Wir können den Wallet-Zähler öffnen wenn das Inventar geöffnet wird, und ihm sagen, dass er geöffnet bleiben soll, indem wir true als Argument übergeben. Sagen Sie ihm dann, dass er geschlossen werden soll, wenn das Inventar geschlossen ist. Im Gegensatz zum Inventar des Spielers, wo wir die vielen Schaltflächen beim Laden initialisieren und dann Schaltflächen hinzufügen oder entfernen, dann Schaltflächen hinzufügen oder entfernen Gegenstände zum Inventar hinzugefügt oder daraus entfernt werden Der Lagerbestand muss jedes Mal generiert werden, wenn der Spieler mit dem Verkäufer interagiert, und er muss vollständig gelöscht werden, wenn er mit dem Einkaufen jedes Mal generiert werden, wenn der Spieler mit dem Verkäufer interagiert, und er muss vollständig gelöscht werden, wenn er mit dem Das Löschen des Warenbestands ist ganz einfach . Man durchsucht einfach jedes der untergeordneten Objekte des Lagercontainers und reiht sie in die Warteschlange, bis sie vom Szenenbaum befreit werden Wir können Shop auch hier oder in der geschlossenen Funktion auf Null setzen hier oder in der geschlossenen Funktion auf Null Wir können den Bestand jederzeit löschen, wenn das Inventarmenü geschlossen ist. Wenn das Inventarmenü als Erfinder und nicht als Shop geöffnet wurde , der Lagerbestandsinhalt sowieso leer. Das Generieren des Inventars ist fast der gleiche Vorgang wie das Generieren des ursprünglichen Inventars des Spielers, dem jeder Artikel in der Lagerliste des Ladens durchgegangen dann die Schaltfläche „Artikel hinzufügen Wir benötigen jedoch ein neues Argument, um anzugeben, zu welchem Container die Schaltfläche hinzugefügt wird Fügen Sie dann den entsprechenden Parameter zur Funktion geben Sie ihm den Standardwert des Gegenstands-Containers des Spielers. Diese Information darüber, in welchem Container sich diese Schaltfläche befindet auch relevant für , ist auch relevant für die Anzeige der Artikelinformationen sowie wenn die Transaktionstaste gedrückt wird. Wir können diese Informationen in den Metadaten des Knotens speichern. Fügen wir den Metadaten unserer neu erstellten Schaltfläche einen neuen Eintrag hinzu , der den Namen im Inventar enthält und angibt, ob der Container, zu dem er hinzugefügt wird , dem Gegenstands-Container des Spielers entspricht. Jetzt weiß jeder Button , auf welcher Seite des Shop-Menüs er sich befindet. Wenn bei der Anzeige von Artikelinformationen eine Schaltfläche ausgewählt ist, können wir ihre Metadaten mithilfe derselben Kennung abrufen , die sich im Inventar befindet. Wenn sich der Artikel im Inventar des Spielers befindet, können wir das Preislabel auf den Wert des Artikels und die Texteigenschaft der Transaktionsschaltfläche auf x sell setzen . Einfachheit halber erlaube ich dem Spieler nicht, Gegenstände zu verkaufen, mit denen er ausgerüstet ist, und deaktiviere in diesem Fall die Transaktionsschaltfläche. Wenn der Artikel im Shop vorrätig ist, entspricht der Preistext dem Artikelwert multipliziert mit dem Aufschlag des Ladens Und der Text der Transaktionsschaltflächen wurde auf x von geändert. Ob die Schaltfläche deaktiviert ist oder nicht, hängt davon ab , ob die aktuellen Münzen des Spielers unter dem Preis liegen. Wenn wir überprüfen, ob der gewählte Gegenstand ausgerüstet ist, wir sicherstellen, dass es einen ausgewählten Gegenstand gibt und dass es sich auch um einen Ausrüstungsgegenstand handelt. die Shop-Variable in der Eingabefunktion Wenn die Shop-Variable in der Eingabefunktion nicht Null ist, können wir zurückkehren, um zu verhindern, dass die Funktionen Artikel verwenden oder Artikel löschen überprüft werden. Wenn die Schaltfläche „Artikel verwenden“ gedrückt wird, was wir hier wiederverwenden um die Kauf - oder Verkaufsaktion auszulösen, , solange die Transaktionstaste nicht deaktiviert ist können wir das entsprechende Signal ausgeben das gedrückte Signal der Transaktionstaste mit dem Skript verbinde , verschiebe ich es in den Shop-Bereich Wenn kein Artikel ausgewählt ist oder mit keinem Shop gerade interagiert wird, können wir einfach zurückkehren Wenn sich die gewählte Schaltfläche im Inventar des Spielers befindet, wird über die Transaktionsschaltfläche der aktuell ausgewählte Artikel verkauft Erhöht die Münzen des Spielers um den Wert des Gegenstands und entfernt ihn aus dem Inventar des Spielers. Andernfalls muss sich der gewählte Button im Bestand des Ladens befinden, was bedeutet, dass er mit der Transaktionsschaltfläche gekauft wird. Dabei werden die Münzen des Spielers um den Wert des Artikels multipliziert mit dem Ladenaufschlag reduziert , der Artikel dem Inventar des Spielers hinzugefügt und erneut überprüft, der Artikel dem Inventar des Spielers hinzugefügt und erneut überprüft, ob der Kaufen-Button deaktiviert werden soll oder nicht der Kaufen-Button deaktiviert werden soll Eine kleine Korrektur bei der Aktualisierung der Stückzahl einer Schaltfläche erfordert, dass die Eigenschaft visible auf true gesetzt wird Im Progress-Skript. Ich fange den Spieler mit etwas Geld an. Ich ignoriere auch die Warnung bei der Konvertierung von Schmalflügeln , die bei der Umwandlung dieses Floats in eine Ganzzahl generiert wird. Denken Sie daran, dass das Inventarmenü zunächst geschlossen sein sollte . Lass es uns ausprobieren. Apropos Nacht: Wir werden vor der Eröffnung des Ladens mit einer Dialogzeile begrüßt , in der auch unsere Münzen ausgestellt sind. der Auswahl unserer Artikel wird auf der Transaktionsschaltfläche „ Verkaufen“ angezeigt Bei der Auswahl unserer Artikel wird auf der Transaktionsschaltfläche „ Verkaufen“ angezeigt. Sie ist jedoch deaktiviert, wenn der ausgewählte Artikel ausgestattet ist. Wir können Gegenstände aus unserem Inventar verkaufen, wodurch wir mehr Gold erhalten. Die Transaktionsschaltfläche zeigt „Kaufen , wenn wir Artikel im Shop auswählen ist jedoch deaktiviert, wenn wir nicht genug Geld haben , um den Artikel zu kaufen. Wir können Artikel vom Verkäufer kaufen, indem wir unser Gold ausgeben. Und wenn wir jetzt den Laden schließen, dankt uns die Nacht. Wir haben jetzt einen Shop in unserem Spiel, in dem der Spieler Gegenstände von einem NPC kaufen und verkaufen kann 10. Was kommt als Nächstes?: Hallo Freunde. Bevor wir anfangen, solltest du ein Projekt mit einem Spielercharakter haben , der sich in einer Umgebung bewegen kann , und einigen Feinden, gegen die er kämpfen kann. Vielleicht möchtest du auch ein Inventarmenü haben dem du Gegenstände ausrüsten kannst, darunter mindestens eine Mala-Waffe, eine arrangierte Waffe und einen Schild Im Laufe dieses Kurses werden wir unserem Projekt Steuerungen, Mechaniken und Animationen hinzufügen , um ein Ziel anzuvisieren, anzugreifen, auszuweichen, zu blockieren und