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.

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.
Di ServerScriptService, tambahkan skrip yang disebut PickupManager.
Di skrip ini, deklarasikan konstanta yang disebut MAX_HEALTH dengan nilai 100.
Buat fungsi yang disebut onTouchHealthPickup dengan parameter untuk bagian lain yang menyentuh pengambilan dan pengambilan itu sendiri.
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)endDi dalam fungsi, dapatkan model karakter dari induk otherPart. Selanjutnya, periksa apakah itu memiliki Humanoid menggunakan FindFirstChildWhichIsA().
Jika memiliki humanoid, setel properti Health mereka ke 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 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.
Di bawah MAX_HEALTH, deklarasikan variabel yang disebut healthPickupsFolder dan gunakan fungsi WaitForChild untuk mendapatkan folder HealthPickups dari Workspace.
Buat variabel bernama healthPickups untuk menyimpan hasil panggilan 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, 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:

- 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.
Di dalam loop for, sambungkan event Touched ke fungsi anonim dengan parameter bernama otherPart.
Panggil fungsi onTouchHealthPickups, mengoper 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.

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.
Dalam loop for, setel atribut baru yang disebut "Enabled" ke true.
Bungkus kode di dalam onTouchHealthPickup dalam sebuah 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 nilai sesuai dengan 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")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") thenlocal character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHhealthPickup.Transparency = DISABLED_TRANSPARENCYhealthPickup:SetAttribute("Enabled", false)endendendPanggil fungsi task.wait(), mengoper COOLDOWN sebagai jumlah yang ingin ditunggu.
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 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