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.

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.
ServerScriptService içinde PickupManager adında bir script ekleyin.
Bu scriptte, değeri 100 olan bir MAX_HEALTH sabiti tanımlayın.
Pickup ve dokunan diğer parça için parametreler içeren onTouchHealthPickup adında bir fonksiyon oluşturun.
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)endFonksiyon içinde otherPart'ın ebeveyninden karakter modelini alın. Daha sonra, bunun bir Humanoid içerip içermediğini FindFirstChildWhichIsA() kullanarak kontrol edin.
Eğer bir humanoid varsa, Health özelliğini MAX_HEALTH olarak ayarlayın.
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)local character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHendend
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.
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.
healthPickupsFolder üzerinde GetChildren fonksiyonunu çağırarak sonucu depolamak için healthPickups adında bir değişken oluşturun.
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
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:

- İ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.
For döngüsünde, Touched olayını otherPart adında bir parametreye sahip anonim bir fonksiyona bağlayın.
onTouchHealthPickups fonksiyonunu çağırarak hem otherPart parametresini hem de healthPickup'ı geçirin.
for _, healthPickup in ipairs(healthPickups) dohealthPickup.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.

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.
For döngüsünde, yeni bir özellik olan "Enabled"'ı true olarak ayarlayın.
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") 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
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.
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 = 100local ENABLED_TRANSPARENCY = 0.4local DISABLED_TRANSPARENCY = 0.9local COOLDOWN = 10local healthPickupsFolder = workspace:WaitForChild("HealthPickups")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") thenlocal character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHhealthPickup.Transparency = DISABLED_TRANSPARENCYhealthPickup:SetAttribute("Enabled", false)endendendtask.wait() fonksiyonunu çağırarak COOLDOWN kadar beklemesini sağlayın.
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") 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
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