Orta seviye öğreticiler

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 Scripting eğitimleri boyunca, oynanabilir sahneler oluşturmak için bireysel parçaları kodladınız. Önceki yöntemle, parçaları çoğaltırsanız, aynı zamanda kopya scriptleriniz de olurdu. Bu durum, güncellemeleri zorlaştırır çünkü değişikliklerin her script için ayrı ayrı yapılması gerekirdi.

Bu eğitimde, sağlık alımlarının birden fazla kopyasını oluşturmak için farklı bir desen kullanılacak; bu alımların davranışını belirleyen tek bir script olacak. Alıma dokunulduğunda, oyuncunun sağlığını geri yükleyecek, hafif solacak ve kısa bir süre için devre dışı kalacak.

Kurulum

Öncelikle, bir alım olarak kullanılacak bir parça veya model almanız gerekecek. Showdown Town örnek dünyası, harita genelinde yayılmış birçok sağlık alımı içeriyor.

Deneyimin ana sayfasından Stüdyoda 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şimidir. Hepsi, scriptin onları arayacağı HealthPickups adlı bir klasörde Workspace içinde saklanmaktadır. Haritaya daha fazla eklerseniz, bunların da bu klasörde saklandığından emin olmalısınız.

Sağlığı geri yükleme

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

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

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

  3. Pickup ve dokunan diğer parça için parametreler içeren onTouchHealthPickup adında bir fonksiyon oluşturun.


    local MAX_HEALTH = 100
    local function onTouchHealthPickup(otherPart, healthPickup)
    end
  4. Fonksiyon içinde otherPart'ın ebeveyninden karakter modelini alın. Daha sonra, bunun bir Humanoid içerip içermediğini FindFirstChildWhichIsA() kullanarak 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ü alma

Sağlık alımlarını içeren klasör, script çalışmadan önce deneyime yüklenmemiş olabilir. İlgili klasörü almak için WaitForChild fonksiyonu kullanılabilir.

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

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

  2. healthPickupsFolder üzerinde GetChildren fonksiyonunu çağırarak sonucu depolamak 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, dizi içindeki 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 dizinin her elemanını geçmek için kullanılabilecek bir işlevdir. Döngünün nereden başlayıp nerede biteceğini belirtmenize gerek yoktur. ipairs ile kullanılan bir for döngüsü şu şekilde tanımlanır:

for index, value in ipairs(array) do

  • İndeks: bu, normal bir for döngüsündeki kontrol değişkenine eşdeğerdir.
  • Değer: bu, döngü ilerledikçe dizideki her eleman ile doldurulacaktır. Değer değişkeninin adını içereceği şeyin adıyla adlandırmak iyi bir fikirdir.
  • Dizi: iterasyona tabi tutulacak dizi ipairs fonksiyonuna geçirilir.

Aşağıdaki kodda, indekse ihtiyaç duyulmadığı için _ ile boş bırakılabilir. healthPickups parametresini geçirerek ipairs fonksiyonu 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

Touched olayına bağlandığında sağlık alımını onTouchHealthPickup fonksiyonuna geçirmek için bir sarmalayıcı fonksiyona ihtiyaç duyulacak.

  1. For döngüsünde, Touched olayını otherPart adında bir parametreye sahip 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; sağlık alımının sağlığınızı geri yüklediğini göreceksiniz. Öncelikle oyuncunuzu hasar vermeniz gerekecek - doğma noktasının yanındaki havalandırmaya basmayı deneyin.

Doğma noktasının sağ tarafında örnek dünyada havalandırma

Sağlık barı, oyuncu iyileştiğinde kaybolacaktır.

Alımın beklemesi

Şu anda, alım dokunan her oyuncuyu sonsuz bir şekilde iyileştirecektir. Ancak, yalnızca bir kez alınabilmesi ve tekrar kullanılmadan önce kısa bir bekleme süresine sahip olması daha etkili olurdu.

Öncelikle, alımın bekleme süresinde olup olmadığını kaydetmelisiniz. Aşağıdaki desen, Fade Trap eğitiminden tanıdık olmalıdır - bu sefer, bekleme süresi sağlık alımındaki bir özellik ayarlandırılarak gerçekleştirilecektir.

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

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

Alım devre dışı kaldığında görsel geri bildirim sağlamalıdır - bunun yaygın bir yolu, hafif saydam hale getirmektir.

  1. Scriptin en üstüne üç 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 yapı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ğırarak COOLDOWN kadar beklemesini sağlayın.

  4. Transparency değerini tekrar ENABLED_TRANSPARENCY ve Enabled değerini tekrar true olacak şekilde 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, şeffaflaştığını ve tekrar kullanılmaya hazır hale geldiğini görmelisiniz.

Alım alındığında oyuncuya geri bildirimin daha etkili olması için, şeffaflığı 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üç artışı sağlamaya çalışın.

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.