Criar um item de recuperação de saúde

*Este conteúdo é traduzido por IA (Beta) e pode conter erros. Para ver a página em inglês, clique aqui.

Ao longo dos tutoriais de Scripting Básico, você scriptou partes individuais para criar cenas jogáveis. Com o método anterior, se você duplicasse as partes, também teria scripts duplicados. Isso tornaria a atualização dos scripts tediosa, pois as alterações teriam que ser feitas script por script.

Neste tutorial, um padrão diferente será usado para criar vários itens de recuperação de saúde, com apenas uma cópia do script que determina o comportamento do item de recuperação de saúde. Quando o item é tocado, ele restaurará a saúde do jogador, desvanecerá ligeiramente e será desativado por um curto período de tempo.

Configuração

Primeiro, você precisará de uma parte ou um modelo para usar como um item de recuperação. O exemplo de mundo Showdown Town inclui muitos itens de recuperação de saúde espalhados por todo o mapa.

Opção Editar no Studio na página principal do jogo

Cada item de recuperação de saúde é uma união de duas partes retangulares com uma PointLight verde dentro. Todos eles estão armazenados em uma pasta no Workspace chamada HealthPickups, que é onde o script irá procurá-los. Se você adicionar mais ao mapa, é essencial garantir que eles também estejam armazenados nesta pasta.

Restaurar saúde

Para começar, o script precisa restaurar a saúde de um jogador. Este padrão deve ser familiar para você do tutorial Deadly Lava.

  1. No ServerScriptService, adicione um script chamado PickupManager.

  2. Neste script, declare uma constante chamada MAX_HEALTH com o valor 100.

  3. Crie uma função chamada onTouchHealthPickup com parâmetros para a outra parte que tocou o item e o próprio item de recuperação.

    local MAX_HEALTH = 100
    local function onTouchHealthPickup(otherPart, healthPickup)
    end
  4. Na função, obtenha o modelo do personagem a partir do pai de otherPart. Em seguida, verifique se ele tem um Humanoid usando FindFirstChildWhichIsA().

  5. Se ele tiver um humanoide, defina a propriedade Health dele para 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

Obter a pasta de itens

A pasta que contém os itens de recuperação de saúde pode não ter sido carregada no jogo até o momento em que o script é executado. WaitForChild pode ser usado para pausar o script e obter a pasta HealthPickups quando ela carregar.

Quando chamada em uma pasta, a função GetChildren retornará um array do conteúdo da pasta.

  1. Abaixo de MAX_HEALTH, declare uma variável chamada healthPickupsFolder e use a função WaitForChild para obter a pasta HealthPickups do Workspace.

  2. Crie uma variável chamada healthPickups para armazenar o resultado da chamada da função GetChildren em 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

Loop com ipairs

onTouchHealthPickup precisa ser chamado para cada item de recuperação no array. Para fazer isso de forma eficiente, um novo tipo de sintaxe de loop será usado.

ipairs é uma função que pode ser usada com um loop for para percorrer cada elemento de um array. Você não precisa especificar onde o loop começa e termina. Um loop for usando ipairs é definido da seguinte forma:

for index, value in ipairs(array) do

  • Index: isso é equivalente à variável de controle em um loop for regular.
  • Value: isso será preenchido com cada elemento no array à medida que o loop itera. É uma boa ideia nomear a variável de valor de acordo com o que ela realmente conterá.
  • Array: o array que você deseja iterar é passado para a função ipairs.

No código a seguir, você não precisa do índice para nada, então ele pode ser deixado em branco com _. Crie um for loop usando a função ipairs, passando 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

Uma função wrapper será necessária para passar o item de recuperação para a função onTouchHealthPickup ao conectar ao evento Touched.

  1. No loop for, conecte o evento Touched a uma função anônima com um parâmetro chamado otherPart.

  2. Chame a função onTouchHealthPickups, passando tanto o parâmetro otherPart quanto o healthPickup.

    for _, healthPickup in ipairs(healthPickups) do
    healthPickup.Touched:Connect(function(otherPart)
    onTouchHealthPickup(otherPart, healthPickup)
    end)
    end

Teste seu código agora e você deve descobrir que o item de recuperação restaura sua saúde. Você precisará danificar seu jogador primeiro - tente ficar em cima do ventilador próximo ao ponto de spawn.

Ventilador fumegante no mundo de exemplo à direita do ponto de spawn

Uma barra de saúde deve aparecer no canto superior direito, que desaparecerá quando o jogador for curado.

Tempo de recarga do item

Atualmente, o item irá curar indefinidamente qualquer jogador que o toque. Seria mais eficaz se ele pudesse ser coletado apenas uma vez, com um curto tempo de recarga antes de poder ser usado novamente.

Primeiro, você precisa registrar se o item está ou não no período de recarga. O padrão abaixo deve ser familiar do Fade Trap - desta vez, o debounce será alcançado definindo um atributo no item de recuperação.

  1. No loop for, defina um novo atributo chamado "Enabled" como true.

  2. Envolva o código dentro de onTouchHealthPickup em uma declaração if com a condição 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

Desativar o item

O item deve fornecer um feedback visual de que está desativado - uma maneira comum de indicar isso é torná-lo ligeiramente transparente.

  1. Declare três constantes no topo do script (sinta-se à vontade para ajustar cada valor conforme sua preferência):

    • 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. Na declaração if em onTouchHealthPickup, defina a Transparency do item para DISABLED_TRANSPARENCY, e o valor do atributo Enabled para 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. Chame a função task.wait(), passando COOLDOWN como o tempo a esperar.

  4. Defina Transparency de volta para ENABLED_TRANSPARENCY e Enabled de volta para 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

Teste seu item novamente: você deve descobrir que, ao tocar no item, ele restaura sua saúde, fica transparente e depois volta a estar pronto para ser usado novamente.

Se você quiser tornar o feedback mais impactante para o jogador quando o item for coletado, tente reduzir o brilho da PointLight no item quando você mudar a transparência.

Tente usar esses itens de recuperação de saúde em seus próprios projetos ou mude a aparência e o efeito para dar um tipo diferente de power-up aos seus jogadores.

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, o logotipo Roblox e Powering Imagination estão entre nossas marcas registradas e não registradas nos EUA e em outros países.