Ao longo dos tutoriais de Script Básico, você teve peças individuais scriptadas para criar cenas jogáveis. Com o método anterior, se você duplicasse as peças, você 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 restaura a saúde do jogador, pisca ligeiramente e é desativada por um curto período de tempo.
Configurando
Primeiro, você precisará de uma peça ou modelo para usar como um pickup. O Showdown Town example world inclui muitos pickups de saúde espalhados por todo o mapa.
Cada pickup de saúde é uma união de duas peças retangulares com um ponto de luz verde dentro delas. Eles são todos armazenados em um pasta na Workspace chamada HealthPickups , que é onde o script procurará por eles. Se você adicionar mais ao mapa, é essencial que você tenha certeza de que eles também estejam armazenados nesta pasta.
Restaurando 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 o pickup e o próprio pickup.
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 possui um Humanoid usando FindFirstChildWhichIsA() .
Se tiver um humanóide, configure sua propriedade Vida 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
Obtendo o Pasta de Recolha
O pasta que contém os pickups 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 pasta HealthPickups quando ele for carregado.
Quando chamado em um pasta, a função GetChildren retornará um array dos conteúdos do pasta.
Embaixo de MAX_HEALTH, declare uma variável chamada healthPickupsFolder e use a função WaitForChild para obter o HealthPickups pasta do Workspace.
Crie uma variável chamada healthPickups para armazenar o resultado de chamar a função GetChildren no 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
Looping com ipairs
onTouchHealthPickup precisa ser chamado para cada pickup de saúde na matriz / lista. Para fazer isso de forma eficiente, um novo tipo de síntese de loop será usado.
ipairs é uma função que pode ser usada com um for loop para passar por cada elemento de uma matriz / lista. Você não precisa especificar onde o loop começa e termina. Um for loop usando ipairs é definido da seguinte maneira:
- Índice : isso é equivalente à variável de controle em um loop regular.
- Valor : isso será preenchido com cada elemento na matriz à medida que o loop itera. É uma boa ideia nomear a variável de valor depois do que ela realmente conterá.
- Array: : o array que você deseja repetir é passado 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 loop usando a função ipairs, passando 2> healthPickups2>.
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 subprocesso será necessária para passar o pickup de saúde para a função onTouchHealthPickup quando se conectar ao evento Touched.
Na força, 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 encontrar que a coleta 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 desaparece quando o jogador é curado.
Tempo de Recarga
Atualmente, o pickup irá indefinidamente curar qualquer jogador que o tocar. Seria mais eficaz em um jogo se pudesse ser escolhido apenas uma vez, com um cooldown curto antes de poderes ser usado novamente.
Primeiro, você precisa registrar se a pickup está no período de cooldown ou não. O padrão abaixo deve ser familiar de Armadilha Fugaz - desta vez, o debounce será alcançado ao definir um atributo na pickup de saúde.
Na força, defina um novo atorributo chamado Enable para true .
Wrap the code inside onTouchHealthPickup in an if statement with the condition 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
Desabilitando o Pickup
O pickup deve fornecer feedback visual que está desativado - uma maneira comum de indicar isso é torná-lo um pouco transparente.
Declare três constantes na parte superior do script (sinta-se à vontade para ajustar cada valor à 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, definir o Transparency do pickup para DISABLED_TRANSPARENCY e o valor do atributo 1> Enabled1> 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 para esperar.
Definir Transparency de volta para ENABLED_TRANSPARENCY e Enabled de volta para 1> true1> .
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 pickup novamente: você deve encontrar que quando você toca no pickup, ele restaura sua saúde, torna-se transparente e depois retorna pronto para ser usado novamente.
Se você quiser tornar o feedback mais impactante para o jogador quando a coleta for coletada, tente cortar a brilhanceza do PointLight no pickup quando você alterar a transparência.
Tente usar essas pickups 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