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 mudanças teriam que ser feitas script por script.
Neste tutorial, um padrão diferente será usado para criar vários itens de cura, com apenas uma única cópia do script que determina o comportamento do item de cura. Quando o item for tocado, ele restaurará a saúde do jogador, irá desvanecer levemente e será desativado por um curto período de tempo.
Configuração
Primeiro, você precisará de uma parte ou modelo para usar como item de cura. O exemplo de mundo Showdown Town inclui muitos itens de cura espalhados pelo mapa.

Cada item de cura é uma União de duas partes retangulares com uma luz verde PointLight dentro. Eles estão todos 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. Esse padrão deve ser familiar para você do tutorial Lava Mortal.
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 cura.
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 possui um Humanoid usando FindFirstChildWhichIsA().
Se 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 cura pode não ter carregado na experiência 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 chamado 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 cura 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:

- Índice: isso é equivalente à variável de controle em um loop for regular.
- Valor: isso será preenchido com cada elemento do 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 percorrer é passado para a função ipairs.
No código a seguir, você não precisa do índice para nada, então pode deixá-lo 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 cura para a função onTouchHealthPickup ao se 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 cura restaura sua saúde. Você precisará danificar seu jogador primeiro - experimente ficar em cima do duto 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 curará indefinidamente qualquer jogador que tocá-lo. 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 Trampolim Desvanecente - desta vez, o debounce será alcançado definindo um atributo no item de cura.
No loop for, defina um novo atributo chamado "Enabled" para 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
Desabilitar 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 a seu gosto):
- 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 false.
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 aguardar.
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, quando toca o 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 cura em seus próprios projetos ou altere a aparência e o efeito para fornecer um tipo diferente de power-up para 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