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.

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.
No ServerScriptService, adicione um script chamado PickupManager.
Neste script, declare uma constante chamada MAX_HEALTH com o valor 100.
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 = 100local function onTouchHealthPickup(otherPart, healthPickup)endNa função, obtenha o modelo do personagem a partir do pai de otherPart. Em seguida, verifique se ele tem um Humanoid usando FindFirstChildWhichIsA().
Se ele tiver um humanoide, defina a propriedade Health dele para MAX_HEALTH.
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)local character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHendend
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.
Abaixo de MAX_HEALTH, declare uma variável chamada healthPickupsFolder e use a função WaitForChild para obter a pasta HealthPickups do Workspace.
Crie uma variável chamada healthPickups para armazenar o resultado da chamada da função GetChildren em 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
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:

- 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
endUma função wrapper será necessária para passar o item de recuperação para a função onTouchHealthPickup ao conectar ao evento Touched.
No loop for, conecte o evento Touched a uma função anônima com um parâmetro chamado otherPart.
Chame a função onTouchHealthPickups, passando tanto o parâmetro otherPart quanto o healthPickup.
for _, healthPickup in ipairs(healthPickups) dohealthPickup.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.

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.
No loop for, defina um novo atributo chamado "Enabled" como true.
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") 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
Desativar o item
O item deve fornecer um feedback visual de que está desativado - uma maneira comum de indicar isso é torná-lo ligeiramente transparente.
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 = 100local ENABLED_TRANSPARENCY = 0.4local DISABLED_TRANSPARENCY = 0.9local COOLDOWN = 10local healthPickupsFolder = workspace:WaitForChild("HealthPickups")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") thenlocal character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHhealthPickup.Transparency = DISABLED_TRANSPARENCYhealthPickup:SetAttribute("Enabled", false)endendendChame a função task.wait(), passando COOLDOWN como o tempo a esperar.
Defina Transparency de volta para ENABLED_TRANSPARENCY e Enabled de volta para 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
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