Criar uma coleta 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 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.

Edit in Studio option from the experience's main page

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.

  1. Em Serviço de Script de Servidor , 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 a coleta e a própria coleta.


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

  5. Se tiver um humanoide, defina sua propriedade de Saúde 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

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.

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

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

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.

  1. No loop for, conecte o evento Tocado 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 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.

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

  2. 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") 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

Desabilite a coleta

A coleta deve fornecer feedback visual de que está desativada - uma maneira comum de indicar isso é torná-la ligeiramente transparente.

  1. 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 = 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 o Transparency da captura 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 a quantidade 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 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