A lo largo de los tutoriales de Scripting Básico, has programado partes individuales para crear escenas jugables. Con el método anterior, si duplicabas las partes, también tendrías scripts duplicados. Esto haría que actualizar los scripts fuera tedioso, ya que los cambios tendrían que hacerse script por script.
En este tutorial, se utilizará un patrón diferente para crear varios objetos de salud, con solo una copia del script que determina el comportamiento del objeto de salud. Cuando se toque el objeto, restaurará la salud del jugador, se desvanecerá ligeramente y se desactivará por un corto período de tiempo.
Configuración
Primero, necesitarás una parte o un modelo para usar como objeto de salud. El ejemplo del mundo Showdown Town incluye muchos objetos de salud repartidos por todo el mapa.

Cada objeto de salud es una unión de dos partes rectangulares con una PointLight verde en su interior. Todos están almacenados en una carpeta en el Workspace llamada HealthPickups, que es donde el script los buscará. Si agregas más al mapa, es esencial que te asegures de que también estén almacenados en esta carpeta.


Restaurar salud
Para comenzar, el script necesita restaurar la salud de un jugador. Este patrón debería ser familiar para ti del tutorial de Lava Mortal.
En ServerScriptService, agrega un script llamado PickupManager.
En este script, declara una constante llamada MAX_HEALTH con el valor 100.
Crea una función llamada onTouchHealthPickup con parámetros para la otra parte que tocó el objeto y el objeto de salud en sí.
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)endEn la función, obtén el modelo del personaje desde el padre de otherPart. A continuación, verifica si tiene un Humanoid usando FindFirstChildWhichIsA().
Si tiene un humanoide, establece su propiedad Health en MAX_HEALTH.
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)local character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHendend
Obtener la carpeta de objetos
La carpeta que contiene los objetos de salud puede no haberse cargado en el juego para cuando se ejecute el script. WaitForChild se puede usar para pausar el script y obtener la carpeta HealthPickups cuando se carga.
Cuando se llama a una carpeta, la función GetChildren devolverá un array del contenido de la carpeta.
Debajo de MAX_HEALTH, declara una variable llamada healthPickupsFolder y usa la función WaitForChild para obtener la carpeta HealthPickups del Workspace.
Crea una variable llamada healthPickups para almacenar el resultado de llamar a la función GetChildren en healthPickupsFolder.
local MAX_HEALTH = 100local healthPickupsFolder = workspace:WaitForChild("HealthPickups")local healthPickups = healthPickupsFolder:GetChildren()local function onTouchHealthPickup(otherPart, healthPickup)local character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHendend
Bucle con ipairs
onTouchHealthPickup necesita ser llamado para cada objeto de salud en el array. Para hacer esto de manera eficiente, se utilizará un nuevo tipo de sintaxis de bucle.
ipairs es una función que se puede usar con un bucle for para recorrer cada elemento de un array. No necesitas especificar dónde comienza y termina el bucle. Un bucle for usando ipairs se define de la siguiente manera:

- Índice: esto es equivalente a la variable de control en un bucle for regular.
- Valor: esto se llenará con cada elemento en el array a medida que el bucle itera. Es una buena idea nombrar la variable de valor según lo que realmente contendrá.
- Array: el array que deseas iterar se pasa a la función ipairs.
En el siguiente código, no necesitas el índice para nada, así que se puede dejar en blanco con _. Crea un for loop usando la función ipairs, pasando healthPickups.
local function onTouchHealthPickup(otherPart, healthPickup)
local character = otherPart.Parent
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
if humanoid then
humanoid.Health = MAX_HEALTH
end
end
for _, healthPickup in ipairs(healthPickups) do
endSe necesitará una función envoltura para pasar el objeto de salud a la función onTouchHealthPickup al conectarse al evento Touched.
En el bucle for, conecta el evento Touched a una función anónima con un parámetro llamado otherPart.
Llama a la función onTouchHealthPickups, pasando tanto el parámetro otherPart como el healthPickup.
for _, healthPickup in ipairs(healthPickups) dohealthPickup.Touched:Connect(function(otherPart)onTouchHealthPickup(otherPart, healthPickup)end)end
Prueba tu código ahora y deberías encontrar que el objeto de salud restaura tu salud. Necesitarás dañar a tu jugador primero; intenta pararte sobre el ventilador junto al punto de aparición.

Una barra de salud debería aparecer en la parte superior derecha, que desaparecerá cuando el jugador sea curado.
Tiempo de reutilización del objeto
Actualmente, el objeto curará indefinidamente a cualquier jugador que lo toque. Sería más efectivo si solo pudiera recogerse una vez, con un corto tiempo de reutilización antes de que pueda usarse nuevamente.
Primero, necesitas registrar si el objeto está o no en el período de reutilización. El patrón a continuación debería ser familiar del tutorial de Trampa de Desvanecimiento; esta vez, el debounce se logrará estableciendo un atributo en el objeto de salud.
En el bucle for, establece un nuevo atributo llamado "Enabled" en true.
Envuelve el código dentro de onTouchHealthPickup en una declaración if con la condición healthPickup:GetAttribute("Enabled").
local function onTouchHealthPickup(otherPart, healthPickup)if healthPickup:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHendendendfor _, healthPickup in ipairs(healthPickups) dohealthPickup:SetAttribute("Enabled", true)healthPickup.Touched:Connect(function(otherPart)onTouchHealthPickup(otherPart, healthPickup)end)end
Desactivar el objeto
El objeto debería proporcionar una retroalimentación visual de que está desactivado; una forma común de indicar esto es hacerlo ligeramente transparente.
Declara tres constantes en la parte superior del script (siéntete libre de ajustar cada valor a tu gusto):
- ENABLED_TRANSPARENCY = 0.4
- DISABLED_TRANSPARENCY = 0.9
- COOLDOWN = 10
local MAX_HEALTH = 100local ENABLED_TRANSPARENCY = 0.4local DISABLED_TRANSPARENCY = 0.9local COOLDOWN = 10local healthPickupsFolder = workspace:WaitForChild("HealthPickups")En la declaración if en onTouchHealthPickup, establece la Transparency del objeto en DISABLED_TRANSPARENCY, y el valor del atributo Enabled en false.
local function onTouchHealthPickup(otherPart, healthPickup)if healthPickup:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHhealthPickup.Transparency = DISABLED_TRANSPARENCYhealthPickup:SetAttribute("Enabled", false)endendendLlama a la función task.wait(), pasando COOLDOWN como la cantidad a esperar.
Establece Transparency de nuevo a ENABLED_TRANSPARENCY y Enabled de nuevo a true.
local function onTouchHealthPickup(otherPart, healthPickup)if healthPickup:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHhealthPickup.Transparency = DISABLED_TRANSPARENCYhealthPickup:SetAttribute("Enabled", false)task.wait(COOLDOWN)healthPickup.Transparency = ENABLED_TRANSPARENCYhealthPickup:SetAttribute("Enabled", true)endendend
Prueba tu objeto de salud nuevamente: deberías encontrar que cuando tocas el objeto, restaura tu salud, se vuelve transparente y luego vuelve a estar listo para usarse nuevamente.
Si deseas hacer que la retroalimentación sea más impactante para el jugador cuando se recoge el objeto, intenta reducir el brillo de la PointLight en el objeto cuando cambies la transparencia.
Intenta usar estos objetos de salud en tus propios proyectos, o cambia la apariencia y el efecto para dar un tipo diferente de potenciador a tus jugadores.
Código final
local MAX_HEALTH = 100
local ENABLED_TRANSPARENCY = 0.4
local DISABLED_TRANSPARENCY = 0.9
local COOLDOWN = 10
local healthPickupsFolder = workspace:WaitForChild("HealthPickups")
local healthPickups = healthPickupsFolder:GetChildren()
local function onTouchHealthPickup(otherPart, healthPickup)
if healthPickup:GetAttribute("Enabled") then
local character = otherPart.Parent
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
if humanoid then
humanoid.Health = MAX_HEALTH
healthPickup.Transparency = DISABLED_TRANSPARENCY
healthPickup:SetAttribute("Enabled", false)
task.wait(COOLDOWN)
healthPickup.Transparency = ENABLED_TRANSPARENCY
healthPickup:SetAttribute("Enabled", true)
end
end
end
for _, healthPickup in ipairs(healthPickups) do
healthPickup:SetAttribute("Enabled", true)
healthPickup.Touched:Connect(function(otherPart)
onTouchHealthPickup(otherPart, healthPickup)
end)
end