Gli eventi sono occorrenze nel tuo gioco che puoi ascoltare e rispondere. Molti servizi e oggetti di Roblox hanno eventi incorporati che scattano automaticamente in risposta a specifiche azioni o modifiche.
Ad esempio, il Character di un giocatore che tocca un BasePart fa automaticamente scattare un evento Touched. Ogni volta che un giocatore entra nel tuo gioco, scatta l'evento Players.PlayerAdded.
A causa del numero elevato di eventi e dell'architettura client-server, la programmazione in Roblox è spesso definita guidata dagli eventi. Questo approccio è diverso dalla maggior parte delle altre motori di gioco, che enfatizzano l'esecuzione del codice su base frame per frame.
Non è necessario ascoltare gli eventi o intraprendere alcuna azione in risposta a essi, ma gli eventi si attivano e sono disponibili comunque. Quando desideri rispondere a un evento, colleghi una funzione a esso.
Collega funzioni agli eventi
Colleghi una funzione a un evento usando Connect() per eseguire codice ogni volta che l'evento scatta. La maggior parte degli eventi passa argomenti alle loro funzioni collegate. Ad esempio, l'evento BasePart.Touched passa l'oggetto che ha toccato il pezzo (come una mano sinistra o una ruota di auto), e l'evento Players.PlayerAdded passa il Player che è entrato nel tuo gioco.
Il seguente esempio di codice dimostra come collegare una funzione chiamata onPartTouched() all'evento Touched di un pezzo:
-- Presuppone che lo script sia parentato al pezzo
local part = script.Parent
-- La funzione che vuoi eseguire
local function onPartTouched(object)
print("Il pezzo è stato toccato da", object:GetFullName())
end
-- Collega la funzione all'evento Touched del pezzo
part.Touched:Connect(onPartTouched)
Puoi anche collegare funzioni anonime agli eventi quando desideri utilizzare variabili nell'ambito genitore e non hai bisogno di utilizzare la funzione altrove. Ad esempio, questo esempio di codice evita l'ingombrante funzione intermedia del campione simile in Servizi:
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
-- Funzione anonima che chiama saveProgress() quando un personaggio viene rimosso
-- dal gioco (in questo caso, quando il giocatore esce).
Players.PlayerAdded:Connect(function(player)
player.CharacterRemoving:Connect(saveProgress)
end)
Disconnetti le funzioni dagli eventi
Il metodo Connect() restituisce un oggetto RBXScriptConnection. Se colleghi una funzione a un evento, ma non vuoi chiamare la funzione la prossima volta che si attiva un evento (ad esempio, dopo che si verifica una certa condizione), disconnettilo chiamando Disconnect() sull'oggetto RBXScriptConnection.
Il seguente esempio di codice mostra come collegare e disconnettere una funzione dall'evento Part.Touched:
local Workspace = game:GetService("Workspace")
local part = Workspace.Part
local targetPart = Workspace.TargetPart
-- Dichiarare una variabile di segnaposto vuota per la connessione
local connection
local function onPartTouched(otherPart)
if otherPart == targetPart then
print("Il pezzo ha colpito il bersaglio!")
-- Disconnetti la connessione
connection:Disconnect()
end
end
-- Collega la funzione sopra all'evento Touched
connection = part.Touched:Connect(onPartTouched)
Aspetta che gli eventi si attivino
Se desideri che uno script attenda finché non si attiva un evento specifico, usa il metodo Wait(). Questo metodo restituisce gli argomenti dell'evento, che puoi assegnare a variabili per un utilizzo successivo:
local Workspace = game:GetService("Workspace")local part = Workspace.Partlocal touchedPart = part.Touched:Wait()print("Il pezzo è stato toccato da", touchedPart:GetFullName())
Altri tipi di eventi
Eventi bindabili ti permettono di comunicare tra script sul stesso lato del confine client-server.
Eventi remoti ti permettono di comunicare attraverso il confine client-server.
Eventi dell'engine differiti rinviano i gestori degli eventi fino a determinati punti di ripresa.