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