Memulai
Tutorial menengah

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

Opsi Edit di Studio dari halaman utama pengalaman

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.

  1. Di ServerScriptService, tambahkan skrip bernama PickupManager.

  2. Dalam skrip ini, deklarasikan sebuah konstanta bernama MAX_HEALTH dengan nilai 100.

  3. Buatlah sebuah fungsi bernama onTouchHealthPickup dengan parameter untuk bagian lain yang menyentuh pengambilan dan pengambilan itu sendiri.


    local MAX_HEALTH = 100
    local function onTouchHealthPickup(otherPart, healthPickup)
    end
  4. Dalam fungsi tersebut, ambil model karakter dari parent otherPart. Selanjutnya, periksa apakah itu memiliki Humanoid menggunakan FindFirstChildWhichIsA().

  5. Jika memiliki humanoid, setel properti Health mereka menjadi 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 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.

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

  2. Buat sebuah variabel bernama healthPickups untuk menyimpan hasil pemanggilan 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, 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:

for index, value in ipairs(array) do

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

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

  2. Panggil fungsi onTouchHealthPickups, melewatkan 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 asap di dunia contoh di sebelah kanan 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.

  1. Di dalam loop for, atur atribut baru bernama "Enabled" menjadi true.

  2. Bungkus kode di dalam onTouchHealthPickup dalam 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 nilainya sesuai 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. 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") 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(), melewatkan COOLDOWN sebagai jumlah waktu yang di tunggu.

  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 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
©2026 Roblox Corporation. Roblox, logo Roblox, dan Powering Imagination termasuk dalam merek dagang kami yang terdaftar dan tidak terdaftar di AS dan negara lainnya.