Basit Kodlama eğitimlerinde, oynanabilir sahneler oluşturmak için bireysel parçaları kodlamışsınız. Bu yöntemle, eğer parçaları kopyalarsanız, kodların kopyalanması gerektiğinden dolayı kodların kopyalanması gerekecektir. Bu, kodların güncellenmesi tediosolet olurdu.
Bu öğretici, bir dizi sağlık alanını oluşturmak için sadece bir kopya kullanılacak, sağlık alanı davranışını belirleyen tek bir kopya kullanılacak. Pickup'ın dokunulduğunda, oyuncunun sağlığını geri kurtaracak, kaybolturacak ve kısa bir süre için devre dışı bırakacak.
Yükleme
Öncelikle, bir seçim olarak kullanmak için bir parça veya bir model gerekecek. Şehir Örneği dünyası, haritanın her yerindeki birçok sağlık örneği içerir.
Her sağlık alışıklığı, içindeki Yeşil bir NoktaIşığı ile iki dikdörtgen parçanın birleşimidir. Tüm bunlar Workspace'ta bulunan SağlıkPickups adındaki bir klasörde saklanır. Eğer haritaya eklerseniz, tüm bunların da bu klasörde saklandığından emin olmalısınız.
Sağlığı Geri Yükleme
Başlamak için, kodun bir oyuncunun sağlığını geri kazanması gerekir. Bu patron, Ölümcül Lav öğretiminden tanıdığınız olmalıdır.
In ServerScriptService , PickupManager adında bir skript ekleyin.
Bu senaryoda, değer MAX_HEALTH ile bir sürekli MAX_HEALTH ilan edin.
Alıcıyı ve alıcıyı kendisiyle bağlayan diğer parçayı etkileyen özellikleri olan bir işlev oluşturun onTouchHealthPickup ile.
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)endİşlevde, otherPart 'in ebeveyninden karakter modelini alın. Ardından, Class.Instance:FindFirstChild WhichIsA()|FindFirstChild WhichIsA() 'i kullanarak Class.Humanoid 'i gösterip gösterip gösterip gösterip gösterip gösterip gösterip gösterip gösterip gösterip gösterip gösterip gösterip gösterip gösterip gösterip gösterip gösterip gösterip g
Eğer bir insanoid'e sahipse, onların Sağlık özelliğini MAX_HEALTH olarak ayarlar.
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)local character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHendend
Pickup'lar Klasörünü almak
Sağlık alanının toplanmasına kaldığı klasör oyuna yüklendiğinde oyuna yüklendiğinde oyunu durdurabilir ve HealthPickups klasörünü yüklemeyi sağlayabilirsiniz. WaitForChild kullanılabilir, oyun yüklendiğinde oyunu durdurabilir ve HealthPickups klasörünü yüklemeyi sağlayabilirsiniz.
Bir klasöre çağrıldığında, GetChildren işlevi klasörenin içeriğinin bir matrisi döndürür.
MAX_HEALTH altında, healthPickupsFolder adında bir değişken ilan et ve WaitForChild işlevini kullanarak çalışma alanındaki SağlıkPickups klasörünü al.
healthPickups adlı değişkeni oluşturarak GetChildren işlevini healthPickupsFolder üzerinde çağırma sonucunu depolayın.
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 yuvarlama
onTouchHealthPickup her sağlık alışverişinde aranır. Bu işi verimli bir şekilde yapmak için yeni bir dizi bağlantı biçimi kullanılacaktır.
ipairs bir for döngüsü kullanarak her bir elementin bir dizi içinde geçmesi için kullanılan bir işlevdir. Bir for döngüsü kullanarak ipairs olarak belirlenir:
- indeks : bu, döngü için normaldeki kontrol çeşnağına eşdeğer.
- Değer : bu, döngü iterecek her elemanın arkasında değer olarak doldurulacaktır. Değer değişkenini aslında içinde ne olduğundan sonra isimlendirmeniz iyi bir fikirdir.
- Matris : itelemek istediğin matris işlevine geçer.
Aşağıdaki kodda herhangi bir indekse ihtiyacınız yoktur, bu yüzden _ ile boş bırakılabilir. for bir çevirimi kullanarak ipairs işlevini oluşturun, 1> healthPickups1> de dahil olmak üzere.
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 alanını onTouchHealthPickup etkinliğine bağlantı kurarken Touched işlevine geçirmek için birWraper işlevi gerekecektir.
For döngüsünde, Touched etkinliğini otherPart adlı anonim bir işlevye bağlayın.
Call the onTouchHealthPickups function, passing both the otherPart parameter and the healthPickup .
for _, healthPickup in ipairs(healthPickups) dohealthPickup.Touched:Connect(function(otherPart)onTouchHealthPickup(otherPart, healthPickup)end)end
Kodunuzu şimdi test edin ve sağlık çıkarma düğmesinin sağlığınızı geri kazandığını bulmalısınız. önce oyuncunuzu hasar vermeniz gerekecek - oyununuzu oluşturma noktasının yanındaki havalandırma üzerinde durun.
Oyuncu iyileştiğinde oluşan sağ üstte bir sağlık çubuğu görünmelidir.
Alma Süresi
Mevcut olarak, toplama geçici olarak herhangi bir oyuncuyu iyileştirecek. Bu, bir oyun içinde sadece bir kez toplanabilir, kısa bir bekleme süresiyle birlikte kullanılabilirse daha etkili olurdu.
Önce, alımın soğumada olup olmadığını kaydetmeniz gerekir. Aşağıdaki patron Kırılma Trapı - bu sefer, debounce sağlanmak için bir özellikte sağlık alımını ayarlayın.
For döngüsünde, benzer bir özellik olarak adlandırılan yeni bir özellik ayarlayın "Enabled" bir true .
Kodu onTouchHealthPickup ile kondisyonlu bir ifade 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
Pickup'ı devre dışı bırakma
Kaldırma, devre dışı bırakıldığını gösteren görsel bir geri bildirim sağlamalıdır - bunu göstermenin yaygın bir yolu, bunu biraz açık hale getirmektir.
Yukarıdaki kodun üstünde üç değer ilan et (her değerin hoşuna gitmek için herhangi bir değeri ayarla):
- 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")In the if statement in onTouchHealthPickup , set the Transparency of the pickup to DISABLED_TRANSPARENCY , and the value of the 1> Enabled1> attribute to false.
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)endendendLibrary.task.wait() işlevini çağırın, COOLDOWN olarak bekleyeceğiniz miktarı verin.
Set Transparency back to ENABLED_TRANSPARENCY ve Enabled back to 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
Yeniden alma işleminizi test edin: almayı dokununca sağlığınızı yeniden kurtaracağınızı, görünür olmayı ardından tekrar kullanılabilir hale gelmeyi bulmalısınız.
Oyuncunun toplandığında geri bildirimin daha etkili hale gelmesini istiyorsanız, transparansı değiştirirken Pickup'ta Nokta Işığının parlaklığını kesin.
Bu sağlık kazanımlarını kendi projelerinizde kullanmayı deneyin veya görünümü ve etkisini değiştirerek oyuncularınıza farklı bir güçlendirmeyi 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