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 digandakan. 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 untuk jangka waktu singkat.

Siapkan

Pertama, Anda memerlukan 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 permainan

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, yang merupakan tempat 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 harus familiar bagi Anda dari tutorial Deadly Lava.

  1. Di ServerScriptService, tambahkan skrip yang disebut PickupManager.

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

  3. Buat 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 orang tua otherPart. Selanjutnya, periksa apakah itu memiliki Humanoid menggunakan FindFirstChildWhichIsA().

  5. Jika memiliki humanoid, atur 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 menjeda skrip dan mendapatkan folder HealthPickups saat dimuat.

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

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

  2. Buat 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 melakukan ini dengan efisien, sintaks loop jenis baru akan digunakan.

ipairs adalah fungsi yang dapat digunakan dengan loop for untuk melalui setiap elemen dari sebuah array. Anda tidak perlu menentukan di mana loop dimulai dan diakhiri. Loop for yang 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 sebenarnya akan dikandungnya.
  • Array: array yang ingin Anda iterasi diteruskan ke fungsi ipairs.

Dalam kode berikut, Anda tidak memerlukan indeks untuk apa pun, jadi bisa dibiarkan kosong dengan _. Buat loop for menggunakan fungsi ipairs, meneruskan 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 akan diperlukan untuk meneruskan pengambilan kesehatan ke fungsi onTouchHealthPickup saat menghubungkan ke event Touched.

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

  2. Panggil fungsi onTouchHealthPickups, meneruskan kedua 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 sebelah 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 ketika pemain disembuhkan.

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 sedang dalam periode waktu tunggu. Pola di bawah ini harus familiar dari Fade Trap - kali ini, waktu tunggu akan dicapai dengan mengatur atribut pada pengambilan kesehatan.

  1. Di dalam loop for, atur atribut baru yang disebut "Enabled" ke 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 nilai 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 dari 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(), meneruskan COOLDOWN sebagai jumlah waktu untuk menunggu.

  4. Atur 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 lagi.

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

Cobalah menggunakan pengambilan kesehatan ini dalam proyek Anda sendiri, atau ubah penampilan dan efeknya untuk memberikan jenis power-up 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
©2026 Roblox Corporation. Roblox, logo Roblox, dan Powering Imagination termasuk dalam merek dagang kami yang terdaftar dan tidak terdaftar di AS dan negara lainnya.