A lo largo de los tutoriales de programación básica, has escrito partes individuales para crear escenas reproducibles.Con el método anterior, si duplicas las partes, también tendrás scripts duplicados.Esto haría que la actualización de los scripts fuera tediosa ya que las modificaciones tendrían que hacerse script por script.
En este tutorial, se usará un patrón diferente para crear una serie de recogidas de salud, con solo una copia del script que determina el comportamiento de recogida de salud.Cuando se toque la recogida, se restaurará la salud del jugador, desaparecerá ligeramente y se desactivará por un corto período de tiempo.
Establecer
Primero, necesitarás una parte o un modelo para usar como recogida.El mundo de ejemplo de ciudad de enfrentamiento incluye muchos puntos de salud repartidos por todo el mapa.

Cada recogida de salud es una unión de dos partes rectangulares con un punto de luz verde dentro.Todos se almacenan en una carpeta en el espacio de trabajo llamada Recogidas de salud , que es donde el script los buscará.Si agregas más al mapa, es esencial asegurarte de que también se almacenen en esta carpeta.


Restaurar la salud
Para empezar, el script debe restaurar la salud de un jugador. Este patrón debería ser familiar para ti desde el tutorial Lava mortal.
En ServerScriptService , agregue un script llamado PickupManager .
En este script, declare una constante llamada MAX_HEALTH con el valor 100 .
Crea una función llamada onTouchHealthPickup con parámetros para la otra parte que tocó la recogida y la recogida misma.
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)endEn la función, obtenga el modelo de personaje del padre de otherPart . A continuación, verifique si tiene un Humanoid usando FindFirstChildWhichIsA() .
Si tiene un humanoide, establece su propiedad de Salud a >.
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 recogidas
La carpeta que contiene las recogidas de salud puede no haberse cargado en el juego para el momento en que se ejecute el script. WaitForChild se puede usar para pausar el script y obtener la carpeta HealthPickups cuando se cargue.
Cuando se llama a una carpeta, la función GetChildren devolverá un array de los contenidos de la carpeta.
Debajo de MAX_HEALTH, declare una variable llamada healthPickupsFolder y use la función WaitForChild para obtener la carpeta HealthPickups del espacio de trabajo.
Crea una variable llamada para almacenar el resultado de llamar a la función en >.
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 recogida de salud en el matriz/lista. Para hacer esto de manera eficiente, se usará 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 matriz/lista.No necesitas especificar dónde comienza y termina el bucle.Un bucle A usando ipairs se define como sigue:
- Índice : esto es equivalente a la variable de control en un bucle regular.
- Valor : se llenará con cada elemento en el array a medida que se repita el bucle.Es una buena idea nombrar la variable de valor después de lo que realmente contendrá.
- Array : el array que desea iterar se pasa a la función ipairs.
En el siguiente código, no necesitas el índice para nada, por lo que se puede dejar en blanco con _ .Crea un bucle para 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
end
Se necesitará una función envolvente para pasar la recogida de salud a la función onTouchHealthPickup cuando se conecta 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 llamando 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 la recogida de salud restaura tu salud.Primero tendrás que dañar a tu jugador - intenta permanecer en la ventilación junto al punto de generación.
Una barra de salud debe aparecer en la parte superior derecha que desaparecerá cuando el jugador esté curado.
Tiempo de reutilización de recogida
Actualmente, la recogida sanará indefinidamente a cualquier jugador que la toque.Sería más efectivo en un juego si solo se pudiera recoger una vez, con un corto tiempo de reutilización antes de que se pueda volver a usar.
Primero, necesitas registrar si la recogida está en el período de espera o no.El patrón a continuación debería ser familiar de trampa de desaparición - esta vez, el debounce se logrará al establecer un atributo en la recogida de salud.
En el bucle for, establece un nuevo atributo llamado a .
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 la recogida
La recogida debe proporcionar retroalimentación visual de que está deshabilitada: una forma común de indicar esto es hacerla ligeramente transparente.
Declare tres constantes en la parte superior del script (siéntase libre de ajustar cada valor a su 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 el Transparency de la recogida en DISABLED_TRANSPARENCY y el valor del atributo Enabled en falso.
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() llamando a COOLDOWN como la cantidad a esperar.
Establecer 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 recogida de nuevo: deberías encontrar que cuando tocas la recogida se restaura tu salud, se vuelve transparente, y luego vuelve a estar lista para ser utilizada de nuevo.
Si quieres hacer que los comentarios sean más impactantes para el jugador cuando se recoge la recogida, intenta recortar el brillo del punto de luz en la recogida cuando cambias la transparencia.
Prueba usar estas recogidas 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