Bir sağlık alma oluştur

*Bu içerik, yapay zekâ (beta) kullanılarak çevrildi ve hatalar içerebilir. Sayfayı İngilizce görüntülemek için buraya tıkla.

Temel Kodlama eğitimleri boyunca, oynanabilir sahneler oluşturmak için bireysel parçalar kodladınız.Önceki yöntemle, parçaları yeniden yaparsanız, ayrıca yinelenen senaryolara da sahip olursunuz.Bu, senaryoları güncellemenin zahmetli hale gelmesini sağlayacaktır, çünkü değişikliklerin her biri bir senaryo bazında yapılmalıdır.

Bu eğitimde, sağlık alma davranışını belirleyen yalnızca bir kopya ile bir dizi sağlık alma olayı oluşturmak için farklı bir model kullanılacaktır.Toplama dokunduğunda, oyuncunun sağlığını yenileyecek, biraz solacak ve kısa bir süre için devre dışı bırakılacak.

Kurulum

Öncelikle, bir alma olarak kullanmak için bir parça veya model gerekecek.The Karşılaşma Kasabası örnek dünyası haritanın her yerine yayılan çok fazla sağlık alımı içerir.

Edit in Studio option from the experience's main page

Her sağlık alımı içinde yeşil bir NoktaIşığı olan iki dikdörtgen parçanın birleşimi.Hepsi SağlıkToplamaları adlı çalışma alanındaki bir klasörde saklanıyor, senaryonun onları arayacağı yer.Haritaya daha fazla eklersem, bu klasörde depolandıklarından emin olmalısınız.

Sağlığı yenile

Öncelikle, senaryonun bir oyuncunun sağlığını yeniden yüklemesi gerekiyor. Bu model, Ölümcül Lav eğitiminden tanıdığınız olmalıdır.

  1. In ServerScriptService , PickupManager adlı bir senaryo ekleyin.

  2. Bu senaryoda, değeri MAX_HEALTH olan sabit bir değer ilan edin **** .

  3. Alıcıyı ve alıcının kendisini dokunan diğer parçanın parametlerini içeren bir işlev oluştur onTouchHealthPickup ile alıcı ve alıcının kendisi.


    local MAX_HEALTH = 100
    local function onTouchHealthPickup(otherPart, healthPickup)
    end
  4. Fonksiyonda, karakter modelini otherPart 'nin ebeveyninden alın. Sonra, Humanoid kullanarak bir FindFirstChildWhichIsA() var olup olmadığını kontrol edin.

  5. Bir insansı varsa, Sağlık özelliklerini MAX_HEALTH olarak ayarlayın.


    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

Alıntı klasörünü alın

Sağlık alımlarını tutan klasör, senaryo çalıştığı sırada oyuna yüklenmedi olabilir.WaitForChild kullanılarak senaryo duraklatılabilir ve yüklendiğinde SağlıkToplama klasörü alınabilir.

Bir klasöre çağrıldığında, GetChildren fonksiyonu klasörün içeriğinin bir dizi döndürecektir.

  1. MAX_HEALTH'ün altında, healthPickupsFolder adlı bir değişken ilan edin ve çalışma alanından WaitForChild klasörünü almak için **** fonksiyonunu kullanın.

  2. Sonucu healthPickups fonksiyonunu çağırmak için GetChildren işlevinin sonucunu depolamak için bir değişken oluştur 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

Ipaarlarla döngü

onTouchHealthPickup düzenekteki her sağlık alımı için çağrılması gerekir. Bunu verimli bir şekilde yapmak için yeni bir döngü söz dizimi kullanılacaktır.

ipairs bir döngü ile her bir düğmeyi geçmek için kullanılabilecek bir işlevdir. bir düğmeyi geçmek için kullanılabilecek bir döngü.Döngünün başladığı ve bitirdiği yeri belirtmenize gerek yoktur.ipairs kullanarak döngü için bir A tanımlanır:

  • İndeks : bu, düzenli bir döngüdeki kontrol değişkenine eşdeğerdir.
  • Değer : döngü döndüğünde düzen içindeki her bir elemanla doldurulacak.Değer değişkeninin gerçekte ne içereceğiyle adlandırılması iyi bir fikirdir.
  • Dizilim : döndürmek istediğiniz dizi, ipairs işlevine geçer.

Aşağıdaki kodda, herhangi bir şey için indeks gerekmiyor, bu yüzden boş bırakılabilir _ .Create a for döngüsünü kullanarak ipairs fonksiyonu, healthPickups geçerek oluşturun.


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

Sağlık alımını onTouchHealthPickup işlevine geçirmek için bir sarıcı işlevine ihtiyaç duyulacaktır, çünkü Touched etkinliğine bağlanırken.

  1. For döngüsünde, dokunulan olayı otherPart adlı bir parametre ile anonim bir işlevle bağlayın.

  2. onTouchHealthPickups fonksiyonunu çağırın, her ikisini de geçerek otherPart ve healthPickup parametrelerini geçin.


    for _, healthPickup in ipairs(healthPickups) do
    healthPickup.Touched:Connect(function(otherPart)
    onTouchHealthPickup(otherPart, healthPickup)
    end)
    end

Kodunuzu şimdi test edin ve sağlık alımının sağlığınızı geri yüklediğini bulmalısınız.Önce oyuncunuza hasar vermeniz gerekecek - oluşturma noktasının yanındaki havalandırmaya ayak basmayı deneyin.

Bir sağlık çubuğu, oyuncu iyileştiğinde kaybolacak olan sağ üstte görünmelidir.

Alma bekleme süresi

Şu anda, alınma süresiz olarak dokunduğu herhangi bir oyuncuyu iyileştirecek.Bir oyunda sadece bir kez alınabilirse ve tekrar kullanılmadan önce kısa bir bekleme süresi olursa daha etkili olurdu.

Öncelikle, alımın soğuma süresinde olup olmadığını kaydetmeniz gerekir.Aşağıdaki model Fade Trap'dan tanıdık olmalıdır - bu kez, debounce, sağlık alımı üzerinde bir öznitelik ayarlayarak elde edilecektir.

  1. for döngüsünde, yeni bir öznitelik adında "Enabled" olan yeni bir öznitelik ayarlayın true .

  2. Kodu koşul healthPickup:GetAttribute("Enabled") ile bir if ifadesine sarın içine onTouchHealthPickup .


    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

Alımı devre dışı bırak

Toplama, devre dışı olduğu için görsel geri bildirim sağlamalıdır - bunu göstermenin yaygın bir yolu, biraz şeffaf hale getirmektir.

  1. Senaryonun başında üç sabit ilan edin (her değeri beğeninize göre ayarlamakta özgür olun):

    • 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. onTouchHealthPickup 'deki if ifadesinde, alımın Transparency 'sını DISABLED_TRANSPARENCY 'ya ayarlayın ve Enabled özniteliğinin değerini yalan olarak ayarlayın.


    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. task.wait() fonksiyonunu çağırın, bekleme miktarı olarak COOLDOWN geçerek.

  4. Set Transparency geri ENABLED_TRANSPARENCY ve Enabled geri true olarak ayarlayın.


    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

Alımınızı tekrar test edin: alım dokunduğunuzda sağlığınızı yenileyecek, şeffaf olacak, sonra tekrar kullanılmaya hazır olarak geri dönecek.

Geri bildirimin toplandığında oyuncuya daha etkili hale getirmek istiyorsanız, transparansı değiştirdiğinizde Pickup'ta NoktaIşığı'nın parlaklığını kesmeyi deneyin.

Kendi projelerinize bu sağlık alımlarını kullanmayı deneyin veya oyuncularınıza farklı bir güç artışı vermek için görünümü ve etkiyi değiştirin.

Final kodu


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