Los eventos son ocurrencias dentro de tu juego que puedes escuchar y a las que puedes responder. Muchos servicios y objetos de Roblox tienen eventos incorporados que se activan automáticamente en respuesta a acciones o cambios específicos.
Por ejemplo, cuando el Character de un jugador toca un BasePart, se activa automáticamente un evento Touched. Cada vez que un jugador se une a tu juego, se activa el evento Players.PlayerAdded.
Debido a la gran cantidad de eventos y a la arquitectura cliente-servidor, la programación en Roblox a menudo se refiere como dirigida por eventos. Este enfoque es diferente al de muchos otros motores de juego, que enfatizan la ejecución de código en base a cada fotograma.
No es necesario que escuches eventos o actúes en respuesta a ellos, pero los eventos se están activando y están disponibles de todos modos. Cuando sí quieras responder a un evento, debes conectar una función a él.
Conectar funciones a eventos
Conectas una función a un evento utilizando Connect() para ejecutar código cada vez que se activa el evento. La mayoría de los eventos pasan argumentos a sus funciones conectadas. Por ejemplo, el evento BasePart.Touched pasa el objeto que tocó la parte (como una mano izquierda o una rueda de coche), y el evento Players.PlayerAdded pasa el Player que se unió a tu juego.
El siguiente ejemplo de código demuestra cómo conectar una función llamada onPartTouched() al evento Touched de una parte:
-- Asume que el script está parentado a la parte
local part = script.Parent
-- La función que deseas ejecutar
local function onPartTouched(object)
print("La parte fue tocada por", object:GetFullName())
end
-- Conecta la función al evento Touched de la parte
part.Touched:Connect(onPartTouched)
También puedes conectar funciones anónimas a eventos cuando quieras usar variables en el ámbito padre y no necesites usar la función en otro lugar. Por ejemplo, este ejemplo de código evita la incómoda función intermedia del ejemplo similar en Services:
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
-- Función anónima que llama a saveProgress() cuando un personaje es removido
-- del juego (en este caso, cuando el jugador se va).
Players.PlayerAdded:Connect(function(player)
player.CharacterRemoving:Connect(saveProgress)
end)
Desconectar funciones de eventos
El método Connect() devuelve un objeto RBXScriptConnection. Si conectas una función a un evento, pero no quieres llamar a la función la próxima vez que se active un evento (por ejemplo, después de que se cumpla cierta condición), desconéctala llamando a Disconnect() en el objeto RBXScriptConnection.
El siguiente ejemplo de código muestra cómo conectar y desconectar una función del evento Part.Touched:
local Workspace = game:GetService("Workspace")
local part = Workspace.Part
local targetPart = Workspace.TargetPart
-- Declara una variable de marcador de posición vacía para la conexión
local connection
local function onPartTouched(otherPart)
if otherPart == targetPart then
print("¡La parte golpeó el objetivo!")
-- Desconecta la conexión
connection:Disconnect()
end
end
-- Conecta la función anterior al evento Touched
connection = part.Touched:Connect(onPartTouched)
Esperar a que se activen eventos
Si deseas que un script se suspenda hasta que un evento específico se active, utiliza el método Wait(). Este método devuelve los argumentos del evento, que puedes asignar a variables para su uso posterior:
local Workspace = game:GetService("Workspace")local part = Workspace.Partlocal touchedPart = part.Touched:Wait()print("La parte fue tocada por", touchedPart:GetFullName())
Otros tipos de eventos
Los eventos enlazables te permiten comunicarte entre scripts en el mismo lado de la frontera cliente-servidor.
Los eventos remotos te permiten comunicarte a través de la frontera cliente-servidor.
Los eventos de motor diferido posponen los manejadores de eventos hasta ciertos puntos de reanudación.