Wydarzenia to zdarzenia w Twojej grze, na które możesz nasłuchiwać i na które możesz reagować. Wiele usług i obiektów w Robloxie ma wbudowane wydarzenia, które automatycznie wyzwalają się w odpowiedzi na określone działania lub zmiany.
Na przykład, gdy Character gracza dotyka BasePart, automatycznie wyzwala się wydarzenie Touched. Za każdym razem, gdy gracz dołącza do Twojej gry, wyzwala się wydarzenie Players.PlayerAdded.
Ze względu na ogromną liczbę wydarzeń i architekturę klient-serwer, skryptowanie w Robloxie często określane jest jako sterowane wydarzeniami. To podejście różni się od wielu innych silników gier, które kładą nacisk na uruchamianie kodu na zasadzie klatka po klatce.
Nie musisz nasłuchiwać na wydarzenia ani podejmować żadnych działań w odpowiedzi na nie, ale wydarzenia są wyzwalane i dostępne mimo wszystko. Kiedy chcesz zareagować na jakieś wydarzenie, łączysz z nim funkcję.
Łączenie funkcji z wydarzeniami
Łączysz funkcję z wydarzeniem za pomocą Connect(), aby wykonać kod za każdym razem, gdy wydarzenie zostanie wyzwolone. Większość wydarzeń przekazuje argumenty do swoich połączonych funkcji. Na przykład, wydarzenie BasePart.Touched przesyła obiekt, który dotknął części (np. lewą rękę lub koło samochodu), a wydarzenie Players.PlayerAdded przesyła Player, który dołączył do Twojej gry.
Poniższy przykład kodu pokazuje, jak połączyć funkcję o nazwie onPartTouched() z wydarzeniem Touched części:
-- Zakłada, że skrypt jest podpięty do części
local part = script.Parent
-- Funkcja, którą chcesz uruchomić
local function onPartTouched(object)
print("Część została dotknięta przez", object:GetFullName())
end
-- Połącz funkcję z wydarzeniem Touched części
part.Touched:Connect(onPartTouched)
Możesz również łączyć anonimowe funkcje z wydarzeniami, gdy chcesz użyć zmiennych z zakresu nadrzędnego i nie trzeba używać tej funkcji w innym miejscu. Na przykład, ten przykład kodu unika niewygodnej funkcji pośredniej z podobnego przykładu w Usługach:
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
-- Anonimowa funkcja, która wywołuje saveProgress() po usunięciu postaci
-- z gry (w tym przypadku, gdy gracz opuszcza).
Players.PlayerAdded:Connect(function(player)
player.CharacterRemoving:Connect(saveProgress)
end)
Rozłączanie funkcji z wydarzeniami
Metoda Connect() zwraca obiekt RBXScriptConnection. Jeśli połączysz funkcję z wydarzeniem, ale nie chcesz wywoływać tej funkcji następnym razem, gdy wydarzenie zostanie wyzwolone (np. po spełnieniu jakiegoś warunku), rozłącz ją, wywołując Disconnect() na obiekcie RBXScriptConnection.
Poniższy przykład kodu pokazuje, jak połączyć i rozłączyć funkcję z wydarzeniem Part.Touched:
local Workspace = game:GetService("Workspace")
local part = Workspace.Part
local targetPart = Workspace.TargetPart
-- Deklaracja pustej zmiennej placeholder dla połączenia
local connection
local function onPartTouched(otherPart)
if otherPart == targetPart then
print("Część uderzyła w cel!")
-- Rozłącz połączenie
connection:Disconnect()
end
end
-- Połącz powyższą funkcję z wydarzeniem Touched
connection = part.Touched:Connect(onPartTouched)
Czekanie na wyzwolenie wydarzeń
Jeśli chcesz, aby skrypt czekał aż konkretne wydarzenie się wyzwoli, użyj metody Wait(). Ta metoda zwraca argumenty wydarzenia, które możesz przypisać do zmiennych do późniejszego użycia:
local Workspace = game:GetService("Workspace")local part = Workspace.Partlocal touchedPart = part.Touched:Wait()print("Część została dotknięta przez", touchedPart:GetFullName())
Inne rodzaje wydarzeń
Wydarzenia wywołujące pozwalają na komunikację między skryptami po tej samej stronie granicy klient-serwer.
Wydarzenia zdalne umożliwiają komunikację przez granicę klient-serwer.
Odwlekane wydarzenia silnika odwlekają obsługujące zdarzenia do określonych punktów wznowienia.