Ao longo dos tutoriais de programação básica, você programou partes individuais para criar cenas tocáveis.Com o método anterior, se você duplicasse as peças, 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 uma série de coletas de saúde, com apenas uma cópia do script que determina o comportamento de coleta de saúde.Quando a coleta for tocada, ela restaurará a saúde do jogador, desaparecerá ligeiramente e será desativada por um curto período de tempo.
Preparar
Primeiro, você precisará de uma peça ou de um modelo para usar como uma coleta.O mundo de exemplo da Vila de Confronto inclui muita coleta de saúde espalhada por todo o mapa.

Cada coleta de saúde é uma União de duas partes retangulares com um Ponto de Luz verde dentro.Todos eles são armazenados em um diretório no Workspace chamado HealthPickups , que é onde o script irá procurá-los.Se você adicionar mais ao mapa, é essencial garantir que eles também sejam armazenados neste diretório.


Restaurar a saúde
Para começar, o script precisa restaurar a saúde de um jogador. Este padrão deve ser familiar para você do TutorialLava Mortal.
Em Serviço de Script de Servidor , 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 a coleta e a própria coleta.
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)endNa função, obtenha o modelo de personagem do pai de otherPart . Em seguida, verifique se ele tem um Humanoid usando FindFirstChildWhichIsA() .
Se tiver um humanoide, defina sua propriedade de Saúde 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
Obtenha a pasta de coletas
O diretório que contém as coletas de saúde pode não ter sido carregado no jogo até o momento em que o script é executado.WaitForChild pode ser usado para pausar o script e obter o diretório HealthPickups quando for carregado.
Ao ser chamada em uma pasta, a função retornará um array dos conteúdos da pasta.
Abaixo de MAX_HEALTH, declare uma variável chamada healthPickupsFolder e use a função WaitForChild para obter o diretório HealthPickups do Workspace.
Crie uma variável chamada healthPickups para armazenar o resultado de chamar a função GetChildren na 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
Ciclo com ipairs
onTouchHealthPickup precisa ser chamado para cada coleta de saúde na matriz / lista. Para fazer isso de forma eficiente, será usada uma nova síntese de loop.
ipairs é uma função que pode ser usada com um loop for para percorrer cada elemento de um matriz / lista.Você não precisa especificar onde o loop começa e termina.Um ciclo for usando ipairs é definido da seguinte forma:
- Índice : isso é equivalente à variável de controle em um ciclo regular.
- Valor : isso será preenchido com cada elemento no array à medida que o loop itera.É uma boa ideia nomear a variável de valor depois do que ela realmente conterá.
- Matriz : a matriz que você deseja iterar é passada para a função ipairs.
No seguinte código, você não precisa do índice para nada, então ele pode ser deixado em branco com _ .Crie um para ciclo 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 de embalagem será necessária para passar a coleta de saúde para a função onTouchHealthPickup quando se conectar ao evento Touched.
No loop for, conecte o evento Tocado 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 encontrar que a recuperação de saúde restaura sua saúde.Você precisará danificar seu jogador primeiro - tente ficar em pé na ventilação ao lado do ponto de spawn.
Uma barra de saúde deve aparecer no canto superior direito que desaparecerá quando o jogador for curado.
Tempo de espera de recolha
Atualmente, a coleta vai curar indefinidamente qualquer jogador que a tocar.Seria mais eficaz em um jogo se pudesse ser coletado apenas uma vez, com um curto tempo de espera antes que possa ser usado novamente.
Primeiro, você precisa registrar se o pickup está ou não no período de espera.O padrão abaixo deve ser familiar de Armadilha de Desaparecimento - desta vez, o debounce será alcançado ao definir um atributo na coleta de saúde.
No loop for, defina um novo atributo **** chamado "Enabled" para true.
Envolva o código dentro de onTouchHealthPickup dentro de 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
Desabilite a coleta
A coleta deve fornecer feedback visual de que está desativada - uma maneira comum de indicar isso é torná-la ligeiramente transparente.
Declare três constantes no topo do script (sinta-se à vontade para ajustar cada valor ao 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 o Transparency da captura 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 a quantidade 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 sua coleta novamente: você deve encontrar isso quando tocar na coleta ela restaurará sua saúde, ficará transparente e depois voltará pronta para ser usada novamente.
Se você quiser tornar o feedback mais impactante para o jogador quando a coleta for feita, tente cortar a brilhante do PointLight na coleta quando você mudar a transparência.
Tente usar esses pontos de saúde em seus próprios projetos ou altere 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