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 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.

Opción Editar en Studio desde la página principal del juego

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.

  1. En ServerScriptService, agrega un script llamado PickupManager.

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

  3. 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 = 100
    local function onTouchHealthPickup(otherPart, healthPickup)
    end
  4. En la función, obtén el modelo del personaje desde el padre de otherPart. A continuación, verifica si tiene un Humanoid usando 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

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.

  1. Debajo de MAX_HEALTH, declara una variable llamada healthPickupsFolder y usa 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 usando ipairs se define de la siguiente manera:

for index, value in ipairs(array) do

  • Í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
end

Se necesitará una función envoltura 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 sobre el ventilador junto al punto de aparición.

Ventilador humeante en el mundo de ejemplo a la derecha del 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.

  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

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.

  1. 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 = 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 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") 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 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
©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.