Tutoriales intermedios

Crear un objeto de salud

*Este contenido se traduce usando la IA (Beta) y puede contener errores. Para ver esta página en inglés, haz clic en aquí.

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 que duplicar los scripts. Esto haría que actualizar los scripts fuera tedioso, ya que tendrías que hacer cambios 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 deshabilitará durante un corto período.

Configuración

Primero, necesitarás una parte o un modelo para usar como objeto de salud. El mundo de ejemplo de Showdown Town incluye muchos objetos de salud repartidos por todo el mapa.

Opción Editar en Studio desde la página principal de la experiencia

Cada objeto de salud es una unión de dos partes rectangulares con una luz de punto verde dentro. Todos están almacenados en una carpeta en el Workspace llamada HealthPickups, que es donde el script buscará. Si agregas más al mapa, es esencial que también se almacenen 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.

  1. En ServerScriptService, añade un script llamado PickupManager.

  2. En este script, declara una constante llamada MAX_HEALTH con el valor 100.

  3. Crea una función denominada onTouchHealthPickup con parámetros para la otra parte que tocó el objeto y el objeto de salud mismo.


    local MAX_HEALTH = 100
    local function onTouchHealthPickup(otherPart, healthPickup)
    end
  4. En la función, obtén el modelo de carácter del padre de otherPart. Luego, verifica si tiene un Humanoid utilizando Instance:FindFirstChildWhichIsA().

  5. Si tiene un humanoide, establece su propiedad Health en MAX_HEALTH.


    local MAX_HEALTH = 100
    local function onTouchHealthPickup(otherPart, healthPickup)
    local character = otherPart.Parent
    local humanoid = character:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    humanoid.Health = MAX_HEALTH
    end
    end

Obtener la carpeta de objetos de salud

Es posible que la carpeta que contiene los objetos de salud no se haya cargado en la experiencia para cuando se ejecute el script. WaitForChild se puede utilizar 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.

  1. Debajo de MAX_HEALTH, declara una variable llamada healthPickupsFolder y utiliza la función WaitForChild para obtener la carpeta HealthPickups del Workspace.

  2. Crea una variable llamada healthPickups para almacenar el resultado de llamar a la función GetChildren en healthPickupsFolder.


    local MAX_HEALTH = 100
    local healthPickupsFolder = workspace:WaitForChild("HealthPickups")
    local healthPickups = healthPickupsFolder:GetChildren()
    local function onTouchHealthPickup(otherPart, healthPickup)
    local character = otherPart.Parent
    local humanoid = character:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    humanoid.Health = MAX_HEALTH
    end
    end

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 que utiliza ipairs se define de la siguiente manera:

for index, value in ipairs(array) do

  • Índice: este es equivalente a la variable de control en un bucle for regular.
  • Valor: este se poblará con cada elemento del array a medida que el bucle itera. Es una buena idea nombrar la variable 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 utilizando 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 el objeto de salud a la función onTouchHealthPickup al conectarse al evento Touched.

  1. En el bucle for, conecta el evento Touched a una función anónima con un parámetro llamado otherPart.

  2. Llama a la función onTouchHealthPickups, pasando tanto el parámetro otherPart como el healthPickup.


    for _, healthPickup in ipairs(healthPickups) do
    healthPickup.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 en el ventilador al lado del punto de aparición.

Ventilador humeante en el mundo de ejemplo a la derecha del punto de aparición

Debería aparecer una barra de salud en la parte superior derecha que desaparecerá cuando el jugador sea curado.

Tiempo de recarga del objeto

Actualmente, el objeto curará indefinidamente a cualquier jugador que lo toque. Sería más efectivo si se pudiera recoger solo una vez, con un breve tiempo de recarga antes de que se pueda usar de nuevo.

Primero, necesitas registrar si el objeto está en el período de recarga o no. 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.

  1. En el bucle for, establece un nuevo atributo llamado "Enabled" en true.

  2. 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") then
    local character = otherPart.Parent
    local humanoid = character:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    humanoid.Health = MAX_HEALTH
    end
    end
    end
    for _, healthPickup in ipairs(healthPickups) do
    healthPickup:SetAttribute("Enabled", true)
    healthPickup.Touched:Connect(function(otherPart)
    onTouchHealthPickup(otherPart, healthPickup)
    end)
    end

Deshabilitar el objeto

El objeto debe proporcionar retroalimentación visual de que está deshabilitado; una forma común de indicar esto es hacerlo ligeramente transparente.

  1. Declara tres constantes en la parte superior del script (no dudes en ajustar cada valor a tu gusto):

    • ENABLED_TRANSPARENCY = 0.4
    • DISABLED_TRANSPARENCY = 0.9
    • COOLDOWN = 10

    local MAX_HEALTH = 100
    local ENABLED_TRANSPARENCY = 0.4
    local DISABLED_TRANSPARENCY = 0.9
    local COOLDOWN = 10
    local healthPickupsFolder = workspace:WaitForChild("HealthPickups")
  2. En la declaración if de onTouchHealthPickup, establece la Transparency del objeto en DISABLED_TRANSPARENCY y el valor del atributo Enabled en falso.


    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)
    end
    end
    end
  3. Llama a la función task.wait(), pasando COOLDOWN como la cantidad a esperar.

  4. Establece Transparency de nuevo a ENABLED_TRANSPARENCY y Enabled de nuevo a true.


    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

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 ser usado nuevamente.

Si deseas hacer la retroalimentación más impactante para el jugador cuando se recoge el objeto, intenta reducir el brillo de la luz de punto en el objeto de salud cuando cambies la transparencia.

Prueba 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
©2026 Roblox Corporation. Roblox, el logotipo de Roblox y "Powering Imagination" son algunas de nuestras marcas registradas y no registradas en los Estados Unidos y otros países.