Ereignisse sind Vorkommnisse in deinem Spiel, auf die du hören und auf die du reagieren kannst. Viele Roblox-Dienste und -Objekte verfügen über integrierte Ereignisse, die automatisch ausgelöst werden, als Reaktion auf bestimmte Aktionen oder Änderungen.
Wenn beispielsweise das Character eines Spielers ein BasePart berührt, wird automatisch ein Touched-Ereignis ausgelöst. Jedes Mal, wenn ein Spieler deinem Spiel beitritt, wird das Players.PlayerAdded-Ereignis ausgelöst.
Aufgrund der Vielzahl von Ereignissen und der Client-Server-Architektur wird das Roblox-Scripting oft als ereignisgesteuert bezeichnet. Dieser Ansatz unterscheidet sich von vielen anderen Spiel-Engines, die das Ausführen von Code auf einer Frame-für-Frame-Basis betonen.
Du musst nicht auf Ereignisse hören oder darauf reagieren, aber die Ereignisse werden trotzdem ausgelöst und sind verfügbar. Wenn du auf ein Ereignis reagieren möchtest, verbindest du eine Funktion damit.
Verbinde Funktionen mit Ereignissen
Du verbindest eine Funktion mit einem Ereignis, indem du Connect() verwendest, um Code auszuführen, jedes Mal, wenn das Ereignis ausgelöst wird. Die meisten Ereignisse übergeben Argumente an ihre verbundenen Funktionen. Beispielsweise übergibt das BasePart.Touched-Ereignis das Objekt, das den Teil berührt hat (wie eine linke Hand oder ein Autoreifen), und das Players.PlayerAdded-Ereignis übergibt den Player, der deinem Spiel beigetreten ist.
Das folgende Codebeispiel zeigt, wie man eine Funktion namens onPartTouched() mit dem Touched-Ereignis eines Teils verbindet:
-- Geht davon aus, dass das Skript dem Teil zugewiesen ist
local part = script.Parent
-- Die Funktion, die du ausführen möchtest
local function onPartTouched(object)
print("Teil wurde berührt von", object:GetFullName())
end
-- Verbinde die Funktion mit dem Touched-Ereignis des Teils
part.Touched:Connect(onPartTouched)
Du kannst auch anonyme Funktionen mit Ereignissen verbinden, wenn du Variablen im übergeordneten Bereich verwenden möchtest und die Funktion nicht anderswo benötigen. Dieses Codebeispiel vermeidet die umständliche Zwischenfunktion aus dem ähnlichen Beispiel in Dienste:
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SaveManager = require(ReplicatedStorage:WaitForChild("SaveManager"))
local function saveProgress(character)
local position = character:FindFirstChild("HumanoidRootPart").Position
SaveManager.saveData(character, position)
end
-- Anonyme Funktion, die saveProgress() aufruft, wenn ein Charakter aus dem Spiel entfernt wird
-- (in diesem Fall, wenn der Spieler das Spiel verlässt).
Players.PlayerAdded:Connect(function(player)
player.CharacterRemoving:Connect(saveProgress)
end)
Trenne Funktionen von Ereignissen
Die Methode Connect() gibt ein RBXScriptConnection-Objekt zurück. Wenn du eine Funktion mit einem Ereignis verbindest, aber nicht möchtest, dass die Funktion beim nächsten Auslösen eines Ereignisses aufgerufen wird (zum Beispiel, nachdem eine Bedingung erfüllt ist), trenne sie, indem du Disconnect() auf dem RBXScriptConnection-Objekt aufrufst.
Das folgende Codebeispiel zeigt, wie man eine Funktion mit dem Part.Touched-Ereignis verbindet und trennen kann:
local Workspace = game:GetService("Workspace")
local part = Workspace.Part
local targetPart = Workspace.TargetPart
-- Deklariere eine leere Platzhaltervariable für die Verbindung
local connection
local function onPartTouched(otherPart)
if otherPart == targetPart then
print("Das Teil hat das Ziel getroffen!")
-- Trenne die Verbindung
connection:Disconnect()
end
end
-- Verbinde die obige Funktion mit dem Touched-Ereignis
connection = part.Touched:Connect(onPartTouched)
Warte auf das Auslösen von Ereignissen
Wenn du möchtest, dass ein Skript wartet, bis ein bestimmtes Ereignis ausgelöst wird, verwende die Methode Wait(). Diese Methode gibt die Argumente des Ereignisses zurück, die du Variablen für eine spätere Verwendung zuweisen kannst:
local Workspace = game:GetService("Workspace")local part = Workspace.Partlocal touchedPart = part.Touched:Wait()print("Das Teil wurde berührt von", touchedPart:GetFullName())
Andere Arten von Ereignissen
Bindbare Ereignisse ermöglichen dir die Kommunikation zwischen Skripten auf der gleichen Seite der Client-Server-Grenze.
Remote-Ereignisse ermöglichen dir die Kommunikation über die Client-Server-Grenze hinweg.
Verschobene Engine-Ereignisse verschieben Ereignis-Handler bis zu bestimmten Wiederaufnahme-Punkten.