Bir Sağlık Alışkanlığı Oluşturulması

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

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.

Edit in Studio option from the experience's main page

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.

  1. In ServerScriptService , PickupManager adında bir skript ekleyin.

  2. Bu senaryoda, değer MAX_HEALTH ile bir sürekli MAX_HEALTH ilan edin.

  3. 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 = 100
    local function onTouchHealthPickup(otherPart, healthPickup)
    end
  4. İş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

  5. Eğer bir insanoid'e sahipse, onların Sağlık özelliğini MAX_HEALTH olarak ayarlar.


    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

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.

  1. 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.

  2. healthPickups adlı değişkeni oluşturarak GetChildren işlevini healthPickupsFolder üzerinde çağırma sonucunu depolayın.


    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 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.

  1. For döngüsünde, Touched etkinliğini otherPart adlı anonim bir işlevye bağlayın.

  2. Call the onTouchHealthPickups function, passing both the otherPart parameter and the healthPickup .


    for _, healthPickup in ipairs(healthPickups) do
    healthPickup.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.

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

  2. Kodu onTouchHealthPickup ile kondisyonlu bir ifade 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

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.

  1. 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 = 100
    local ENABLED_TRANSPARENCY = 0.4
    local DISABLED_TRANSPARENCY = 0.9
    local COOLDOWN = 10
    local healthPickupsFolder = workspace:WaitForChild("HealthPickups")
  2. 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") 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. Library.task.wait() işlevini çağırın, COOLDOWN olarak bekleyeceğiniz miktarı verin.

  4. Set Transparency back to ENABLED_TRANSPARENCY ve Enabled back to 1> true1> .


    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

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