Datenstrukturen sind die Art und Weise, wie Coder ganze Daten-Sets speichern und organisieren. In Lua werden Datenstrukturen mit Tabellen erstellt. Tabellen können jede Anzahl von Werten enthalten.
Dieser Artikel behandelt die Verwendung von Arrays , einer bestimmten Tabelle, um einen sprechenden Charakter zu erstellen.
Tabellen
Tabelle(n) sind Daten типы, die mehrere Werte enthalten können. Andere Daten типы, die ein einzelnes Werte speichern, haben keine feste Größe und können eine Mischung verschiedener Werte Arten enthalten. Mit Tabelle(n) können Sie Gegenstände in einem Spieler:inInventar speichern oder eine Liste von Tausenden von Spieler-Namen erstellen.
Matrix
Es gibt verschiedene Arten von Tabellen. Ein Typ ist ein Array , der Tabellen von Werten in einer bestimmten Reihenfolge speichert. Um ein Array zu erstellen, erstellen Sie eine Variable und weisen Sie sie mit { } separat auf. Separate Werte innerhalb der Tabelle mit Kommas wie unten:
local myArray = {"item1", "item2", 10, workspace.Part, myVariable}
Erstellen eines sprechenden Charakters
Um Arrays zu erkunden, arbeitest du mit einem nicht spielbaren Charakter (NPC), der, wenn er angeklickt wird, eine andere Dialogzeile anzeigt.
Dieses Projekt wird ein vordefiniertes NPC-Modell verwenden, das ein teilweise Skript und einen Dialog-Detektor enthält, aber keinen Dialog fehlt.
In Explorer, importieren Sie den NPC, indem Sie mit der rechten Maustaste auf Arbeitsbereich > Datei herunterladen und ausgewählen Sie den heruntergeladenen Datei.
Dialog-Matrix codieren
Diese Schritte verwenden ein Array, um verschiedene Phrasen für den NPC zu speichern, wenn Spieler mit ihm interagieren.
In dem Explorer gehen Sie zu NPC > ProximityPrompt > ChatManager.
In ChatManager, wo in dem Skript, das. PL: die Skriptsmarkiert, erstellen Sie ein leeres Array , um Dialogoptionen zu speichern.
-- Zyklen Sie durch den Chat-Dialog, wenn der Prompt verwendet wirdlocal Chat = game:GetService("Chat")local prompt = script.Parentlocal npc = prompt.Parentlocal characterParts = npc.CharacterPartslocal head = characterParts.Head-- Füge hier ein Array hinzulocal dialogueArray = {}local function speak()local dialogue = "I've got one thing to say!"Chat:Chat(head, dialogue)endprompt.Triggered:Connect(speak)Innerhalb der Klammern {} des gerade erstellten Arrays, geben Sie mindestens drei Dialogzeilen ein, die durch Kommataren getrennt sind.
local dialogueArray = {"Hi!", "Do I know you?", "Goodbye!"}
Verwendung von Arrays
Jeder Wert in der Matrix wird einer index Nummer zugewiesen. Indizes werden an Werte in der Reihenfolge gespeichert, in der die Werte gespeichert sind. Der erste Wert ist bei Index 1, der zweite bei Index 2 und so weiter.
Einige Codierungs Sprachen, wie Java, starten Indizes bei 0.
In dem gerade erstellten Array ist "Hi" an Index 1 und "Goodbye!" an Index 3.
Verzeichnis | Wert |
---|---|
1 | Hallo |
2 | Heute ist ein guter Tag! |
3 | Tschüss! |
Verwendung bestimmter Indexwerte
Verwenden Sie Indexwerte, um bestimmte Elemente des Dialogs dem NPC zuzuweisen. Um einen Wert an einem bestimmten Index zu verwenden, fügen Sie den Index direkt nach dem Namen des Arrays hinzu, wie z. B. dialogueArray[1].
Ersetzen Sie den Standardwert der Variable dialogue mit der Index 2.
local dialogueArray = {"Hi!", "Do I know you?", "Goodbye!"}local function speak()local dialogue = dialogueArray[2]Chat:Chat(head, dialogue)endSpieltest und klicke auf den NPC. Der zweite Array-Wert sollte in der Chat-Blase erscheinen. Versuche, den Code zu ändern, um jeden Wert in der Tabelle zu testen.
Dialogzeilen ändern
Wenn der Spieler mit dem Nicht-Spieler-Charakterinteragiert, wird der NPC immer die gleiche Zeile sagen. Das ist langweilig. Stattdessen verwenden Sie eine Variable, um zu aktualisieren, welche Indexwert zu verwenden.
Wenn ein Spieler mit dem NPC interagiert, erhöht die Variable den Wert um 1, um die folgende Dialogzeile anzuzeigen.
Um den aktuellen Index zu verfolgen, füge eine neue Variable namens dialogueIndex hinzu. Setzen Sie die Variable auf 1, um am Beginn des Arrays zu starten.
local dialogueArray = {"Hi!", "Do I know you?", "Goodbye!"}local dialogueIndex = 1In speak() , replace die Indexnummer in dialogueArray[2] mit der Variable, die du gerade erstellt hast.
local function speak()local dialogue = dialogueArray[dialogueIndex]Chat:Chat(head, dialogue)endAm unteren Rand der Funktion füge 1 zu dialogueIndex hinzu. Beim nächsten Aufruf von speak() wird der Dialog den nächsten String anzeigen.
local function speak()local dialogue = dialogueArray[dialogueIndex]Chat:Chat(head, dialogue)dialogueIndex += 1endTeste den NPC und klicke auf die jeweilige Dialogzeile aus der Array.
Beachten Sie, dass ein Fehler im Ausgabefenster auftritt, sobald das Skript das Ende des Arrays erreicht.
Du behebst dies in der nächsten Sektion, damit der Dialog vom Anfang an neu startet, nachdem er die letzte Stringanzeigt hat.
Matrixgrößen
Sie können die Größe des Arrays verwenden, um zu wissen, wann der gewünschte Index auf 1 zurückgesetzt werden soll, finden Sie die Größe eines Arrays durch das Schreiben von # , ohne Leerstellen, vor dem Namen eines Arrays.
Zum Beispiel: #dialogueArray
Überprüfen Sie die Größe des Arrays gegen den aktuellen Wert der Variable, um zu wissen, wann es Zeit ist, wieder am Anfang zu starten.
Dialog neu starten
Verwenden Sie die Größe des Arrays, um zu überprüfen, wann es Zeit ist, zum ersten Element des Dialogs zurückzukehren.
Fügen Sie eine if-Anweisung hinzu und überprüfen Sie, ob dialogueIndex``#dialogueArray , die Gesamtwoße dieses Arrays. Wenn so, dann setzen Sie dialogueIndex auf 1.
local function speak()local dialogue = dialogueArray[dialogueIndex]Chat:Chat(head, dialogue)if dialogueIndex == #dialogueArray thendialogueIndex = 1enddialogueIndex += 1endWenn dialogueIndex nicht am beendenist, sollte es immer noch 1 zu dialogueIndex hinzufügen. Verschieben Sie dialogueIndex += 1 unter einer anderen Anweisung.
local function speak()local dialogue = dialogueArray[dialogueIndex]Chat:Chat(head, dialogue)if dialogueIndex == #dialogueArray thendialogueIndex = 1elsedialogueIndex += 1endendSpielen und bestätigen Sie, dass Sie durch und wieder starten den Dialog.
Zusammenfassung
Datenstrukturen sind wie Sets von Daten gespeichert. Lua verwendet Tabellen, um Datenstrukturen zu erstellen. Arrays sind eine Art Tabelle, die sortierte Tabellen enthalten. Jeder Wert innerhalb der Matrix wird mit der Indexnummer 1 zugewiesen.
Dieses Skript verwendet ein Array, um eine Liste möglicher Dialogzeilen für einen nicht spielbaren Charakter (NPC) zu erstellen.
Abgeschlossenes Skript, das. PL: die Skripts
-- Zyklen Sie durch den Chat-Dialog, wenn der Prompt verwendet wird
local Chat = game:GetService("Chat")
local prompt = script.Parent
local npc = prompt.Parent
local characterParts = npc.CharacterParts
local head = characterParts.Head
-- Füge hier ein Array hinzu
local dialogueArray = {"Hi!", "Do I know you?", "Goodbye!"}
local dialogueIndex = 1
local function speak()
local dialogue = dialogueArray[dialogueIndex]
Chat:Chat(head, dialogue)
if dialogueIndex == #dialogueArray then
dialogueIndex = 1
else
dialogueIndex += 1
end
end
prompt.Triggered:Connect(speak)
Troubleshooting-Tipps
Wenn der Charakter nicht durch die Dialogreihe geht, versuchen Sie die folgenden Fehlerbehebungstipps.
- Überprüfen Sie die if-Anweisung, dass dialogueIndex auf 1 zurückgesetzt wird. Im anderen Absatz überprüfen Sie, dass dialogueIndex 1 zu sich selbst hinzugefügt hat.
- Wenn Sie die Größe des Arrays erhalten, stellen Sie sicher, dass es keine Leerstellen nach dem # in #dialogueArray gibt.
Optionale Herausforderungen
Versuchen Sie eine der optionalen Herausforderungen unten.
- Kodieren Sie das Skript, damit der Dialog des NPCs durch die Arrayzurückgeht. Der DialogIndex sollte an der Matrix starten und jedes Mal hinzuzufügen, anstatt hinzuzufügen.
- Statt Dialoge in der Reihenfolge anzuzeigen, zeigt der NPC jedes Mal eine zufällige Dialogzeile mit Random.new() . Ein Beispielskript ist unten enthalten, um aufzureferenz
local randomGenerator = Random.new()
-- Zeigt einen neuen Dialog jedes Mal an, wenn der NPC angeklickt wird
local function speak()
local randomIndex = randomGenerator:NextInteger(1, #dialogueArray)
local dialogue = dialogueArray[randomIndex]
Chat:Chat(head, dialogue)
end