Sepanjang tutorial Basic Scripting, 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 ganda. Ini akan membuat pembaruan skrip menjadi membosankan karena perubahan harus dilakukan skrip demi skrip.
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 untuk jangka waktu pendek.
Siapkan
Pertama-tama, Anda perlu sebuah bagian atau model untuk digunakan sebagai pengambilan. Dunia contoh Showdown Town menyertakan banyak pengambilan kesehatan yang tersebar di seluruh peta.

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


Pulihkan kesehatan
Untuk memulai, skrip perlu memulihkan kesehatan pemain. Pola ini seharusnya sudah familiar bagi Anda dari tutorial Deadly Lava.
Di ServerScriptService, tambahkan skrip bernama PickupManager.
Dalam skrip ini, deklarasikan sebuah konstanta bernama MAX_HEALTH dengan nilai 100.
Buatlah sebuah fungsi bernama onTouchHealthPickup dengan parameter untuk bagian lain yang menyentuh pengambilan dan pengambilan itu sendiri.
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)endDalam fungsi tersebut, ambil model karakter dari parent otherPart. Selanjutnya, periksa apakah itu memiliki Humanoid menggunakan FindFirstChildWhichIsA().
Jika memiliki humanoid, setel properti Health mereka menjadi MAX_HEALTH.
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)local character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHendend
Dapatkan folder pengambilan
Folder yang menyimpan pengambilan kesehatan mungkin belum dimuat ke dalam pengalaman saat skrip dijalankan. WaitForChild dapat digunakan untuk menghentikan skrip dan mendapatkan folder HealthPickups saat dimuat.
Ketika dipanggil pada sebuah folder, fungsi GetChildren akan mengembalikan array dari konten folder tersebut.
Di bawah MAX_HEALTH, deklarasikan sebuah variabel bernama healthPickupsFolder dan gunakan fungsi WaitForChild untuk mendapatkan folder HealthPickups dari Workspace.
Buat sebuah variabel bernama healthPickups untuk menyimpan hasil pemanggilan fungsi GetChildren pada healthPickupsFolder.
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
Loop dengan ipairs
onTouchHealthPickup perlu dipanggil untuk setiap pengambilan kesehatan dalam array. Untuk melakukannya dengan efisien, akan digunakan sintaks loop yang baru.
ipairs adalah sebuah fungsi yang bisa digunakan dengan loop for untuk melalui setiap elemen dari sebuah array. Anda tidak perlu menentukan di mana loop dimulai dan diakhiri. Loop for menggunakan ipairs didefinisikan sebagai berikut:

- Index: ini setara dengan variabel kontrol dalam loop for biasa.
- Value: ini akan diisi dengan setiap elemen dalam array saat loop beriterasi. Sebaiknya beri nama variabel value sesuai dengan apa yang akan ia isi.
- Array: array yang ingin Anda iterasi akan diberikan ke fungsi ipairs.
Dalam kode berikut, Anda tidak membutuhkan index untuk apa pun, sehingga dapat dibiarkan kosong dengan _. Buatlah sebuah for loop menggunakan fungsi ipairs, melewatkan 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 pembungkus diperlukan untuk melewatkan pengambilan kesehatan ke fungsi onTouchHealthPickup saat menyambungkan ke event Touched.
Dalam loop for, sambungkan event Touched ke fungsi anonim dengan parameter bernama otherPart.
Panggil fungsi onTouchHealthPickups, melewatkan parameter otherPart dan healthPickup.
for _, healthPickup in ipairs(healthPickups) dohealthPickup.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.

Bar kesehatan harus muncul di kanan atas yang akan menghilang saat pemain sembuh.
Waktu tunggu pengambilan
Saat ini, pengambilan akan terus-menerus menyembuhkan pemain yang menyentuhnya. Akan lebih efektif jika hanya bisa diambil sekali, dengan waktu tunggu singkat sebelum bisa digunakan lagi.
Pertama, Anda perlu mencatat apakah pengambilan berada dalam periode waktu tunggu atau tidak. Pola di bawah ini seharusnya sudah familiar dari Fade Trap - kali ini, debouncenya akan dicapai dengan mengatur atribut pada pengambilan kesehatan.
Di dalam loop for, atur atribut baru bernama "Enabled" menjadi true.
Bungkus kode di dalam onTouchHealthPickup dalam pernyataan if dengan kondisi healthPickup:GetAttribute("Enabled").
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
Nonaktifkan pengambilan
Pengambilan harus memberikan umpan balik visual bahwa itu dinonaktifkan - cara umum untuk menunjukkan ini adalah dengan membuatnya sedikit transparan.
Deklarasikan tiga konstanta di bagian atas skrip (silakan sesuaikan setiap nilainya sesuai keinginan Anda):
- 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")Dalam pernyataan if di onTouchHealthPickup, atur Transparency pengambilan menjadi DISABLED_TRANSPARENCY, dan nilai atribut Enabled menjadi 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)endendendPanggil fungsi task.wait(), melewatkan COOLDOWN sebagai jumlah waktu yang di tunggu.
Setel Transparency kembali ke ENABLED_TRANSPARENCY dan Enabled kembali ke true.
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
Uji pengambilan Anda lagi: Anda harus menemukan bahwa ketika Anda menyentuh pengambilan, itu memulihkan kesehatan Anda, menjadi transparan, lalu kembali siap digunakan kembali.
Jika Anda ingin membuat umpan balik lebih berdampak bagi pemain saat pengambilan dikumpulkan, coba kurangi kecerahan PointLight di pengambilan saat Anda mengubah transparansi.
Cobalah menggunakan pengambilan kesehatan ini di proyek Anda sendiri, atau ubah penampilan dan efeknya untuk memberikan jenis kekuatan lain 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