Jetzt, da du eine 3D-Welt hast, ist es an der Zeit, dein erstes Skript hinzuzufügen. In diesem Abschnitt wirst du eine Münzsammlungsmechanik erstellen, die es den Spielern ermöglicht, Münzen zu sammeln und die Münzen vorübergehend zu deaktivieren, nachdem sie gesammelt wurden.
Erstelle die Münzen
Bevor du etwas skriptieren kannst, benötigst du Platzhalterobjekte in der Welt, die du als deine Münzen verwenden kannst. Wie die Plattformen aus Meeresstapeln, die du im vorherigen Abschnitt erstellt hast, können die Münzen einfache Part-Objekte sein.
Erstelle die MünzenIn Workspace > World erstelle einen neuen Ordner namens Coins.Erstelle im Coins-Ordner einen Zylinder-Part namens Coin mit BrickColor auf Gold, Material auf Metall, Größe 0.6, 8, 4 und Orientierung 90, 0, 0.Deaktiviere CanCollide und aktiviere Anchored.Dupliziere dann den Coin-Part mehrmals und verteile die Duplikate auf der Insel und auf den Plattformen, damit sie von den Meeresstapel-Niveaus aus erreichbar sind.Halte jedes Duplikat den Namen Coin.
Erstelle das Skript
Als Nächstes lässt du die Münzen auf die Spieler reagieren. Die Roblox-Engine kann erkennen, wann etwas eine Münze berührt, aber du musst ein Skript verwenden, um zu definieren, wie die Münze reagieren sollte.
Erstelle CoinServiceIn ServerScriptService erstelle ein Skript namens CoinService mit dem folgenden Code:```lua-- Initialisierung von Diensten und Variablenlocal Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local coinsFolder = Workspace.World.Coinslocal coins = coinsFolder:GetChildren()local COOLDOWN = 10-- Definieren des Ereignis-Handlerslocal function onCoinTouched(otherPart, coin)if coin:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- Spieler hat eine Münze berührtcoin.Transparency = 1coin:SetAttribute("Enabled", false)print("Spieler hat die Münze gesammelt")task.wait(COOLDOWN)coin.Transparency = 0coin:SetAttribute("Enabled", true)endendend-- Einrichten der Ereignis-Listenerfor _, coin in coins docoin:SetAttribute("Enabled", true)coin.Touched:Connect(function(otherPart)onCoinTouched(otherPart, coin)end)end```
Jetzt, wann immer ein Spieler eine Münze berührt, verschwindet die Münze für 10 Sekunden, und das Ausgabenprotokoll gibt Spieler hat die Münze gesammelt aus.
Die folgenden Abschnitte beschreiben, wie das Skript im Detail funktioniert.
Dienste und Variablen initiieren
Wie bei einem Großteil des Codes, den du wahrscheinlich in anderen Programmiersprachen geschrieben hast, definierst du oben im Skript die Variablen, die du später benötigst. Unser Code tut Folgendes:
- Referenzen auf alle Münzen erhalten - Das Skript fragt dann den 3D-Arbeitsbereich nach allen Referenzen auf Münzobjekte mit der Methode GetChildren(). Diese Methode gibt ein Array zurück, das alles enthält, was dem Objekt, mit dem es verbunden ist, untergeordnet ist, in diesem Fall also dem Ordner Workspace.World.Coins, den du zuvor erstellt hast.
- Definiert eine globale Variable - Die Variable COOLDOWN wird später verwendet, um festzulegen, wie lange eine Münze nach dem Sammeln deaktiviert ist.
Initialisierung von Diensten und Variablenlocal Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local coinsFolder = Workspace.World.Coinslocal coins = coinsFolder:GetChildren()local COOLDOWN = 10...
Definiere den Ereignis-Handler
Die Roblox-Engine simuliert die 3D-Welt physisch und übernimmt viel der Logik, um Ereignisse im Zusammenhang mit Rendering, Physik und Networking zu behandeln. Wenn du daran interessiert bist, deine eigene Logik während einiger dieser Ereignisse zu skripten, kannst du auf sie hören und sie verarbeiten, während du der Engine den Rest überlässt. In diesem Fall hörst du auf und bearbeitest Ereignisse im Zusammenhang mit berührten Münzen. Das Skript definiert die Logik zur Behandlung dieses Ereignisses in der Methode onCoinTouched(), die Folgendes tut:
- Erkennt, ob die Münze aktiviert ist - Jede Instance hat ein Enabled-Boolean-Attribut, das definiert, ob das Objekt in der 3D-Welt existiert oder nicht. Du kannst Instanzattribute mit der Methode GetAttribute() abrufen.
- Erkennt, ob ein Spieler die Münze berührt hat - Wenn eine Münze aktiviert ist, verwendet die Methode den Spielerdienst, um zu überprüfen, ob das Objekt, das die Münze berührt hat, tatsächlich ein Spieler war. Wenn ein Berührungsevent auftritt, übergibt die Roblox-Engine das Objekt, das die Münze berührt hat, als otherPart-Parameter. Das Skript überprüft, ob der Elternteil von otherPart einem Spieler gehört.
- Deaktiviert die Münze, wenn ein Spieler sie berührt hat, und aktiviert sie nach 10 Sekunden erneut - Schließlich, wenn ein Spieler die Münze berührt hat, deaktiviert die Methode die Münze, wartet 10 Sekunden und aktiviert die Münze dann wieder zur Sammlung. task.wait() wird anstelle von wait() verwendet, da es eine bessere Leistung bietet, indem es die Codeausführung nicht vollständig pausiert und es anderen Threads ermöglicht, gleichzeitig zu laufen.
Definieren des Ereignis-Handlers
local function onCoinTouched(otherPart, coin)
if coin:GetAttribute("Enabled") then
local character = otherPart.Parent
local player = Players:GetPlayerFromCharacter(character)
if player then
-- Spieler hat eine Münze berührt
coin.Transparency = 1
coin:SetAttribute("Enabled", false)
print("Spieler hat die Münze gesammelt")
task.wait(COOLDOWN)
coin.Transparency = 0
coin:SetAttribute("Enabled", true)
end
end
end
Verbinde den Ereignis-Handler
Alle simulierten 3D-Objekte erben von BasePart und haben daher ein Touched()-Ereignis. Die folgende Schleife verbindet den onTouchedEvent()-Handler mit dem Berührungsereignis jeder Münze, indem sie Folgendes tut:
- Schleife durch alle Münzen - Durchlaufe jede der Münzen mit einer allgemeinen Iteration.
- Verbinde den Handler mit dem Ereignis - In jeder Iteration der Schleife wird die Münze standardmäßig aktiviert, damit sie während des Spielstarts in der 3D-Welt sichtbar ist. Die Methode onCoinTouched() wird auch mit dem Touched-Ereignis der Münze verbunden, damit sie jedes Mal ausgeführt wird, wenn das Ereignis auftritt. Wenn die Engine eine Berührung erkennt, wird auch das Objekt, das das Objekt berührt hat, otherPart, übergeben.
Verbinden des Ereignis-Handlers
for _, coin in coins do
coin:SetAttribute("Enabled", true)
coin.Touched:Connect(function(otherPart)
onCoinTouched(otherPart, coin)
end)
end
Teste die Mechanik
Wähle Test aus dem Dropdown-Menü und klicke auf Play. Bewege deinen Charakter, um eine Münze zu berühren. Wenn alles funktioniert, verschwindet die Münze, das Output-Fenster gibt Spieler hat die Münze gesammelt aus, und die Münze erscheint 10 Sekunden später wieder.
