¡Bienvenido a este Codelab sobre cómo agregar interacciones personalizadas en Roblox! Anteriormente, aprendimos a agregar interacciones predefinidas, es decir, aquellas que vienen integradas en la herramienta, como sentarse, puntos de aparición, o eventos básicos. Sin embargo, para enriquecer aún más la experiencia del usuario, podemos crear interacciones personalizadas adaptadas a nuestras necesidades específicas.
Esta será la primera interacción que aprenderemos. Aquí, agregaremos un techo automático para nuestra sala, de modo que al acercarse a cierto punto se abra y al alejarse se cierre. Veamos cómo se puede hacer eso.
Con todos los componentes seleccionados, presiona CTRL + G para agruparlos. Verás que se crea un nuevo grupo automáticamente. Renombra este grupo a "Techo"
Para configurar el Hitbox correctamente, sigue estos pasos:
Buscaremos el componente Script y lo seleccionaremos
Borraremos ese código y pegaremos el siguiente:
local doortween1 = script.Parent.Parent.Tween1
local doortween2 = script.Parent.Parent.Tween2
local techo = script.Parent.Parent.Techo
local isTouching = false
function onTouched(hit)
if not hit or not hit.Parent then return end
local human = hit.Parent:FindFirstChild("Humanoid")
if human and human:IsA("Humanoid") and not isTouching then
isTouching = true
game.TweenService:Create(techo, TweenInfo.new(0.3, Enum.EasingStyle.Sine, Enum.EasingDirection.In), {CFrame = doortween1.CFrame}):Play()
end
end
function onTouchEnded(hit)
if not hit or not hit.Parent then return end
local human = hit.Parent:FindFirstChild("Humanoid")
if human and human:IsA("Humanoid") and isTouching then
isTouching = false
game.TweenService:Create(techo, TweenInfo.new(0.3, Enum.EasingStyle.Sine, Enum.EasingDirection.In), {CFrame = doortween2.CFrame}):Play()
end
end
script.Parent.Touched:Connect(onTouched)
script.Parent.TouchEnded:Connect(onTouchEnded)
return go(f, seed, [])
}
A continuación explicaremos el código:
Este código controla el movimiento de nuestro objeto Techo. La idea es que cuando el avatar del jugador toque el HitBox, Techo se mueva a una posición específica, y cuando el avatar deje de tocarlo, Techo vuelva a su posición original.
Todo esto se maneja con dos eventos de contacto (Touched y TouchEnded) y un sistema de animación suave llamado Tween.
Declaración de Variables:
Función onTouched:
Función onTouchEnded:
Conexión de Eventos:
Ahora aprenderemos a agregar y configurar luces automáticas para que cada vez que nuestro avatar cruce por cierta zona se activen, y al dejar de estar en esa zona se apaguen.
Para hacer esto haremos lo siguiente:
Entonces, Insertaremos en nuestra escena una nueva pieza y cambiaremos su nombre a "DetectorLuz":
local detector = script.Parent -- El detector que detectará el toque
local luzObjeto = detector.Parent:FindFirstChild("Luz") -- Referencia al objeto "Luz" que contiene el PointLight
local luz
-- Tabla para rastrear los objetos en contacto
local objetosEnContacto = {}
-- Verificamos si encontramos el objeto "Luz" y luego buscamos PointLight en su interior
if luzObjeto then
luz = luzObjeto:FindFirstChild("PointLight")
end
-- Aseguramos que la luz esté apagada al iniciar
if luz then
luz.Enabled = false
end
-- Función para cuando algo toca el detector
local function onTouched(hit)
if hit.Parent:FindFirstChild("Humanoid") then
-- Añadir el objeto a la tabla de contacto si no está ya registrado
if not objetosEnContacto[hit] then
objetosEnContacto[hit] = true
end
-- Encender la luz si es el primer contacto
luz.Enabled = true
end
end
-- Función para cuando algo deja de tocar el detector
local function onTouchEnded(hit)
if hit.Parent:FindFirstChild("Humanoid") then
-- Eliminar el objeto de la tabla de contacto
if objetosEnContacto[hit] then
objetosEnContacto[hit] = nil
end
-- Si no quedan objetos en contacto, apagar la luz
if next(objetosEnContacto) == nil then
luz.Enabled = false
end
end
end
-- Conectar los eventos de toque
detector.Touched:Connect(onTouched)
detector.TouchEnded:Connect(onTouchEnded)
A continuación, explicaremos el código que controla el encendido y apagado de la luz cuando el avatar interactúa con el DetectorLuz. Este sistema asegura que la luz reaccione correctamente al contacto del avatar sin parpadeos, usando una tabla para rastrear todos los objetos en contacto.
Declaración de Variables
Función onTouched
Esta función se activa cada vez que un objeto toca el DetectorLuz.
Proceso:
Función onTouchEnded
Esta función se activa cuando un objeto deja de tocar el DetectorLuz.
Proceso:
Resultado:
La luz se apaga solo si no quedan objetos en contacto con el detector.
13. Listo, ahora podremos probar nuestro detector de luz:
Ahora crearemos una imagen dinámica, es decir, una imagen que al momento de acercarse un avatar, cambie por otra. Para hacer esto aprovecharemos el detecto que hemos agregado en el punto anterior y editaremos su Script.
Ahora, el avatar al colisionar no solo editará su imagen, sino en cambio, también cambiará la imagen con el logo de VIVI que tenemos en el fondo.
La imagen que se actualizará puede ser cualquiera de nuestra elección, para subirla lo haremos desde el Gestor de Recursos como hemos aprendido antes.
local detector = script.Parent -- El detector que detectará el toque
local luzObjeto = detector.Parent:FindFirstChild("Luz") -- Referencia al objeto "Luz" que contiene el PointLight
local luz
local decalPart = game.Workspace.Part -- Referencia a la pieza que contiene el Decal
local decal = decalPart:FindFirstChild("Decal") -- Referencia al Decal
local objetosEnContacto = {} -- Tabla para rastrear los objetos en contacto
-- Verificamos si encontramos el objeto "Luz" y luego buscamos PointLight en su interior
if luzObjeto then
luz = luzObjeto:FindFirstChild("PointLight")
end
-- Aseguramos que la luz esté apagada al iniciar
if luz then
luz.Enabled = false
end
-- Cambiar imagen del Decal
local originalDecalTexture = "rbxassetid://100000000001" -- Cambia esto al ID original de la textura
local collisionDecalTexture = "rbxassetid://10000000000" -- Cambia esto al ID de la textura para la colisión
if decal then
decal.Texture = originalDecalTexture -- Configurar el Decal con la textura original al inicio
end
-- Función para cuando algo toca el detector
local function onTouched(hit)
if hit.Parent:FindFirstChild("Humanoid") then
-- Añadir el objeto a la tabla de contacto si no está ya registrado
if not objetosEnContacto[hit] then
objetosEnContacto[hit] = true
end
-- Encender la luz si es el primer contacto
luz.Enabled = true
-- Cambiar la textura del Decal
if decal then
decal.Texture = collisionDecalTexture
end
end
end
-- Función para cuando algo deja de tocar el detector
local function onTouchEnded(hit)
if hit.Parent:FindFirstChild("Humanoid") then
-- Eliminar el objeto de la tabla de contacto
if objetosEnContacto[hit] then
objetosEnContacto[hit] = nil
end
-- Si no quedan objetos en contacto, apagar la luz y restaurar la textura
if next(objetosEnContacto) == nil then
luz.Enabled = false
-- Restaurar la textura original del Decal
if decal then
decal.Texture = originalDecalTexture
end
end
end
end
-- Conectar los eventos de toque
detector.Touched:Connect(onTouched)
detector.TouchEnded:Connect(onTouchEnded)
local originalDecalTexture = "rbxassetid://100000000001" -- Cambia esto al ID original de la textura
local collisionDecalTexture = "rbxassetid://10000000000" -- Cambia esto al ID de la textura para la colisión
Nuevas variables:
Cambios en onTouched:
Cuando el avatar toca el DetectorLuz, cambia la textura del Decal a collisionDecalTexture (nueva imagen).
Cambios en onTouchEnded:
Cuando el avatar deja de tocar, restaura la textura del Decal a originalDecalTexture (imagen original).
¡Felicidades por completar este Codelab! Ahora dominas las bases para agregar interacciones personalizadas en Roblox, desde elementos dinámicos como techos automáticos y luces inteligentes, hasta imágenes interactivas que cambian al paso del avatar. Estas habilidades te permiten llevar tus proyectos al siguiente nivel, añadiendo elementos dinámicos e inmersivos que mejoran la experiencia del usuario.