Buat pengambilan kesehatan

*Konten ini diterjemahkan menggunakan AI (Beta) dan mungkin mengandung kesalahan. Untuk melihat halaman ini dalam bahasa Inggris, klik di sini.

Sepanjang tutorial Pemrograman Dasar, Anda telah memprogram bagian-bagian individu untuk membuat adegan yang dapat dimainkan. Dengan metode sebelumnya, jika Anda menggandakan bagian-bagian tersebut, Anda juga akan memiliki skrip yang terduplikasi. Ini akan membuat pembaruan skrip menjadi membosankan karena perubahan harus dilakukan satu per satu.

Dalam tutorial ini, pola yang berbeda akan digunakan untuk membuat sejumlah pengambilan kesehatan, dengan hanya satu salinan skrip yang menentukan perilaku pengambilan kesehatan. Ketika pengambilan disentuh, itu akan memulihkan kesehatan pemain, memudar sedikit dan dinonaktifkan selama periode waktu yang singkat.

Persiapan

Pertama, Anda perlu bagian atau model untuk digunakan sebagai pengambilan. Dunia contoh Showdown Town mencakup banyak pengambilan kesehatan yang tersebar di seluruh peta.

Opsi Edit di Studio dari halaman utama pengalaman

Setiap pengambilan kesehatan adalah Gabungan dari dua bagian persegi panjang dengan PointLight hijau di dalamnya. Semuanya disimpan dalam satu folder di Workspace yang disebut HealthPickups, yang merupakan tempat skrip akan mencarinya. Jika Anda menambahkan lebih banyak ke peta, sangat penting untuk memastikan bahwa mereka juga disimpan di folder ini.

Memulihkan kesehatan

Untuk memulai, skrip perlu memulihkan kesehatan pemain. Pola ini harus familiar bagi Anda dari tutorial Deadly Lava.

  1. Di ServerScriptService, tambahkan skrip yang disebut PickupManager.

  2. Di skrip ini, deklarasikan konstanta yang disebut MAX_HEALTH dengan nilai 100.

  3. Buat fungsi yang disebut onTouchHealthPickup dengan parameter untuk bagian lain yang menyentuh pengambilan dan pengambilan itu sendiri.


    local MAX_HEALTH = 100
    local function onTouchHealthPickup(otherPart, healthPickup)
    end
  4. Di dalam fungsi, dapatkan model karakter dari induk otherPart. Selanjutnya, periksa apakah itu memiliki Humanoid menggunakan FindFirstChildWhichIsA().

  5. Jika memiliki humanoid, setel properti Health mereka ke MAX_HEALTH.


    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

Dapatkan folder pengambilan

Folder yang menyimpan pengambilan kesehatan mungkin belum dimuat ke dalam permainan pada saat skrip dijalankan. WaitForChild dapat digunakan untuk menghentikan skrip dan mendapatkan folder HealthPickups ketika dimuat.

Ketika dipanggil pada sebuah folder, fungsi GetChildren akan mengembalikan array dari isi folder tersebut.

  1. Di bawah MAX_HEALTH, deklarasikan variabel yang disebut healthPickupsFolder dan gunakan fungsi WaitForChild untuk mendapatkan folder HealthPickups dari Workspace.

  2. Buat variabel bernama healthPickups untuk menyimpan hasil panggilan fungsi GetChildren pada healthPickupsFolder.


    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

Loop dengan ipairs

onTouchHealthPickup perlu dipanggil untuk setiap pengambilan kesehatan dalam array. Untuk melakukannya dengan efisien, sintaksis loop jenis baru akan digunakan.

ipairs adalah fungsi yang dapat digunakan dengan loop for untuk melalui setiap elemen dari sebuah array. Anda tidak perlu menetapkan di mana loop dimulai dan diakhiri. Sebuah loop for menggunakan ipairs didefinisikan sebagai berikut:

for index, value in ipairs(array) do

  • Indeks: ini setara dengan variabel kontrol dalam loop for biasa.
  • Nilai: ini akan diisi dengan setiap elemen dalam array saat loop beriterasi. Adalah ide yang baik untuk memberi nama variabel nilai setelah apa yang sebenarnya akan diisikan.
  • Array: array yang ingin Anda iterasi dilalui fungsi ipairs.

Dalam kode berikut, Anda tidak memerlukan indeks untuk apa pun, jadi bisa dibiarkan kosong dengan _. Buat sebuah for loop menggunakan fungsi ipairs, mengoper healthPickups.


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

Sebuah fungsi wrapper diperlukan untuk mengoper pengambilan kesehatan ke fungsi onTouchHealthPickup saat terhubung ke event Touched.

  1. Di dalam loop for, sambungkan event Touched ke fungsi anonim dengan parameter bernama otherPart.

  2. Panggil fungsi onTouchHealthPickups, mengoper parameter otherPart dan healthPickup.


    for _, healthPickup in ipairs(healthPickups) do
    healthPickup.Touched:Connect(function(otherPart)
    onTouchHealthPickup(otherPart, healthPickup)
    end)
    end

Uji kode Anda sekarang dan Anda harus menemukan bahwa pengambilan kesehatan memulihkan kesehatan Anda. Anda perlu merusak pemain Anda terlebih dahulu - coba berdiri di atas ventilasi di samping titik spawn.

Vent yang mengeluarkan uap di dunia contoh di sebelah kanan titik spawn

Bilah kesehatan harus muncul di sudut kanan atas yang akan menghilang saat pemain disembuhkan.

Waktu tunggu pengambilan

Saat ini, pengambilan akan terus menerus menyembuhkan pemain yang menyentuhnya. Akan lebih efektif dalam permainan jika hanya bisa diambil sekali, dengan waktu tunggu singkat sebelum bisa digunakan lagi.

Pertama, Anda perlu mencatat apakah pengambilan berada dalam periode waktu tunggu. Pola di bawah ini harus familiar dari tutorial Fade Trap - kali ini, debounce akan dicapai dengan menetapkan atribut pada pengambilan kesehatan.

  1. Dalam loop for, setel atribut baru yang disebut "Enabled" ke true.

  2. Bungkus kode di dalam onTouchHealthPickup dalam sebuah pernyataan if dengan kondisi healthPickup:GetAttribute("Enabled").


    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

Nonaktifkan pengambilan

Pengambilan harus memberikan umpan balik visual bahwa itu dinonaktifkan - cara umum untuk menunjukkan ini adalah dengan membuatnya sedikit transparan.

  1. Deklarasikan tiga konstanta di bagian atas skrip (silakan sesuaikan setiap nilai sesuai dengan keinginan Anda):

    • 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. Di dalam pernyataan if dalam onTouchHealthPickup, atur Transparency pengambilan ke DISABLED_TRANSPARENCY, dan nilai atribut Enabled ke 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. Panggil fungsi task.wait(), mengoper COOLDOWN sebagai jumlah yang ingin ditunggu.

  4. Setel Transparency kembali ke ENABLED_TRANSPARENCY dan Enabled kembali ke true.


    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

Uji pengambil Anda lagi: Anda harus menemukan bahwa ketika Anda menyentuh pengambilan, itu memulihkan kesehatan Anda, menjadi transparan, lalu kembali siap digunakan lagi.

Jika Anda ingin membuat umpan balik lebih berdampak bagi pemain saat pengambilan dikumpulkan, coba kurangi kecerahan PointLight di dalam pengambilan saat Anda mengubah transparansi.

Cobalah menggunakan pengambilan kesehatan ini di proyek Anda sendiri, atau ubah penampilan dan efek untuk memberikan jenis peningkatan kekuatan yang berbeda kepada pemain Anda.

Kode akhir


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

Di halaman ini