Sağlık alımı oluşturma

*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 Script yazma eğitimleri boyunca, oynanabilir sahneler oluşturmak için bireysel parçaları scriptlediniz. Önceki yöntemde, parçaları çoğaltırsanız, aynı zamanda çoğaltılmış scriptler de elde edersiniz. Bu, scriptleri güncellemeyi zahmetli hale getirir çünkü değişiklikler her bir scriptte ayrı ayrı yapılmalıdır.

Bu eğitimde, sağlık alımlarını oluşturmak için farklı bir desen kullanılacak ve sağlık alım davranışını belirleyen yalnızca bir kopya script olacak. Alım dokunulduğunda, oyuncunun sağlığını geri yükleyecek, hafifçe solacak ve kısa bir süreliğine devre dışı kalacaktır.

Kurulum

Öncelikle, bir alım olarak kullanmak için bir parça veya model gerekecek. Showdown Town örnek dünyası, harita üzerinde yayılmış birçok sağlık alımı içerir.

Oyunun ana sayfasından Stüdyo'da düzenleme seçeneği

Her sağlık alımı, içinde yeşil bir PointLight bulunan iki dikdörtgen parçanın Birleşimi'dir. Hepsi, scriptin onları arayacağı HealthPickups adlı Workspace içinde bir klasörde saklanmaktadır. Haritaya daha fazla eklediğinizde, bunların da bu klasörde saklandığından emin olmanız önemlidir.

Sağlığı geri yükle

Öncelikle, scriptin bir oyuncunun sağlığını geri yüklemesi gerekiyor. Bu desen, Ölümcül Lav eğitiminden tanıdık gelmelidir.

  1. ServerScriptService içinde PickupManager adında bir script ekleyin.

  2. Bu scriptte, değeri 100 olan MAX_HEALTH adında bir sabit tanımlayın.

  3. Alımın dokunulduğu diğer parçayı ve alımı parametre olarak alan onTouchHealthPickup adında bir fonksiyon oluşturun.

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

  5. Eğer bir humanoid varsa, Health özelliğini 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ımlar klasörünü al

Sağlık alımlarını tutan klasör, script çalıştığında oyuna yüklenmemiş olabilir. WaitForChild fonksiyonu, scripti duraklatmak ve HealthPickups klasörünü yüklenirken almak için kullanılabilir.

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

  1. MAX_HEALTH'ın altında, healthPickupsFolder adında bir değişken tanımlayın ve HealthPickups klasörünü Workspace'ten almak için WaitForChild fonksiyonunu kullanın.

  2. healthPickupsFolder üzerinde GetChildren fonksiyonunu çağırarak sonucu saklamak için healthPickups adında bir değişken oluşturun.

    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

ipairs ile döngü

onTouchHealthPickup, dizideki her sağlık alımı için çağrılmalıdır. Bunu verimli bir şekilde yapmak için, yeni bir döngü sözdizimi türü kullanılacaktır.

ipairs, bir for döngüsü ile bir dizinin her elemanını geçmek için kullanılabilecek bir fonksiyondur. Döngünün nereden başlayıp nerede biteceğini belirtmenize gerek yoktur. ipairs kullanan bir for döngüsü şu şekilde tanımlanır:

for index, value in ipairs(array) do

  • Index: bu, normal bir for döngüsündeki kontrol değişkenine eşdeğerdir.
  • Value: bu, döngü ilerledikçe dizideki her elemanla doldurulacaktır. Değer değişkenini, gerçekten ne içereceğine göre adlandırmak iyi bir fikirdir.
  • Array: üzerinde yinelemek istediğiniz dizi, ipairs fonksiyonuna geçirilir.

Aşağıdaki kodda, indekse ihtiyacınız yok, bu yüzden boş bırakılabilir _ ile. healthPickups'ı geçirerek ipairs fonksiyonunu kullanarak bir for döngüsü 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

onTouchHealthPickup fonksiyonuna sağlık alımını geçirmek için bir sarmalayıcı fonksiyona ihtiyaç duyulacaktır.

  1. For döngüsünde, Touched olayını otherPart adında bir parametre ile anonim bir fonksiyona bağlayın.

  2. onTouchHealthPickups fonksiyonunu çağırarak hem otherPart parametresini hem de healthPickup'ı geçirin.

    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 göreceksiniz. Önce oyuncunuzu hasar vermeniz gerekecek - doğum noktasının yanındaki havalandırmanın üstünde durmayı deneyin.

Doğum noktasının sağındaki örnek dünyadaki buharlaşan havalandırma

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

Alım soğuma süresi

Şu anda, alım, ona dokunan herhangi bir oyuncuyu sonsuz bir şekilde iyileştirecektir. Tekrar kullanılmadan önce yalnızca bir kez alınabilmesi daha etkili olurdu.

Öncelikle, alımın soğuma süresinde olup olmadığını kaydetmeniz gerekiyor. Aşağıdaki desen, Fade Trap eğitiminden tanıdık gelmelidir - bu sefer, debounc'u sağlık alımında bir özellik ayarlayarak gerçekleştireceğiz.

  1. For döngüsünde, "Enabled" adında yeni bir özellik'yi true olarak ayarlayın.

  2. onTouchHealthPickup içindeki kodu, healthPickup:GetAttribute("Enabled") koşuluna sahip bir if ifadesinin içine sarı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
    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

Alım, devre dışı olduğunu görsel olarak belirtmelidir - bunu göstermek için yaygın bir yol, onu hafifçe saydam hale getirmektir.

  1. Scriptin en üstünde üç sabit tanımlayın (her bir değeri istediğiniz gibi ayarlayabilirsiniz):

    • 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 içindeki if ifadesinde, alımın Transparency değerini DISABLED_TRANSPARENCY olarak ayarlayın ve Enabled özelliğinin değerini false 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 ve COOLDOWN'u bekleme süresi olarak geçirin.

  4. Transparency'yi tekrar ENABLED_TRANSPARENCY ve Enabled'ı tekrar 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ıma dokunduğunuzda sağlığınızı geri yüklediğini, saydamlaştığını ve sonra tekrar kullanılabilir hale geldiğini görmelisiniz.

Alım toplandığında oyuncuya geri bildirimi daha etkili hale getirmek istiyorsanız, saydamlığı değiştirdiğinizde alımın içindeki PointLight'ın parlaklığını azaltmayı deneyin.

Bu sağlık alımlarını kendi projelerinizde kullanmayı deneyin veya görünümünü ve etkisini değiştirerek oyuncularınıza farklı bir güçlendirme verin.

Nihai kod

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
©2026 Roblox Corporation. Roblox, the Roblox logo and Powering Imagination are among our registered and unregistered trademarks in the U.S. and other countries.