Buat penjemputan 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 menulis bagian individu untuk membuat adegan yang dapat dimainkan.Dengan metode sebelumnya, jika Anda menyalin bagian maka Anda juga akan memiliki skrip duplikat.Ini akan membuat memperbarui skrip menjadi membosankan karena perubahan harus dilakukan skrip per skrip.

Dalam tutorial ini, pola yang berbeda akan digunakan untuk membuat beberapa penjemputan kesehatan, hanya dengan salinan tunggal dari skrip yang menentukan perilaku penjemputan kesehatan.Ketika penjemputan disentuh, itu akan memulihkan kesehatan pemain, memudar sedikit dan dinonaktifkan untuk waktu yang singkat.

Membuat

Pertama, Anda akan membutuhkan bagian atau model untuk digunakan sebagai penjemputan.Dunia contoh Pertempuran Kota termasuk banyak penjemputan kesehatan yang tersebar di seluruh peta.

Edit in Studio option from the experience's main page

Setiap penjemputan kesehatan adalah Serikat dari dua bagian persegi dengan Titik Cahaya hijau di dalamnya.Mereka semua disimpan di satu folder di Workspace yang disebut HealthPickups , di mana skrip akan mencarinya.Jika Anda menambahkan lebih banyak ke peta, 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 Lava Mematikan.

  1. Di ServerScriptService , tambahkan skrip yang disebut PickupManager .

  2. Dalam skrip ini, umumkan konstan yang disebut MAX_HEALTH dengan nilai 100 .

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


    local MAX_HEALTH = 100
    local function onTouchHealthPickup(otherPart, healthPickup)
    end
  4. Dalam fungsi, dapatkan model karakter dari orangtua otherPart . Selanjutnya, periksa apakah ada Humanoid menggunakan FindFirstChildWhichIsA() .

  5. Jika memiliki humanoid, atur properti Kesehatan 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 penjemputan

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

Ketika dipanggil pada folder, fungsi GetChildren akan mengembalikan array konten folder.

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

  2. Buat variabel bernama healthPickups untuk menyimpan hasil panggilan fungsi GetChildren di 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

Lingkaran dengan ipairs

onTouchHealthPickup perlu dipanggil untuk setiap penjemputan kesehatan di array. Untuk melakukan ini secara efisien, jenis loop baru akan digunakan.

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

  • Indeks : ini setara dengan variabel kontrol dalam loop biasa.
  • Nilai : ini akan diisi dengan setiap elemen dalam array saat loop diulang.Adalah ide bagus untuk memberi nama variabel nilai setelah apa yang sebenarnya akan berisi.
  • Array : array yang ingin Anda iterasi diberikan ke fungsi ipairs.

Dalam kode berikut, Anda tidak memerlukan indeks untuk apa pun, jadi bisa dibiarkan kosong dengan _ .Buat untuk loop menggunakan fungsi ipairs, dengan melewati 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

Fungsi wadah akan diperlukan untuk mengirim pengambilan kesehatan ke fungsi onTouchHealthPickup ketika terhubung ke acara Touched.

  1. Dalam loop for, hubungkan peristiwa Touched ke fungsi anonim dengan parameter yang disebut otherPart .

  2. Panggil fungsi onTouchHealthPickups , melewati 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 ventilasi di samping titik spawn.

Sebuah bilah kesehatan harus muncul di kanan atas yang akan menghilang saat pemain disembuhkan.

Ambil penundaan

Saat ini, penjemputan akan menyembuhkan pemain mana pun yang menyentuhnya secara permanen.Akan lebih efektif dalam permainan jika hanya bisa diambil sekali, dengan cooldown singkat sebelum bisa digunakan lagi.

Pertama, Anda perlu mencatat apakah pengambilan berada dalam periode pendinginan atau tidak.Pola di bawah ini seharusnya sudah familiar dari Perangkap Pudar - kali ini, debounce akan dicapai dengan menetapkan atribut pada pengambilan kesehatan.

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

Penjemputan harus memberikan umpan balas visual bahwa itu dinonaktifkan - cara umum untuk menunjukkan ini adalah membuatnya sedikit transparan.

  1. Deklarasikan tiga konstan di bagian atas skrip (merasa bebas untuk menyesuaikan setiap nilai sesuai selera 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 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() , mengirimkan COOLDOWN sebagai jumlah yang harus ditunggu.

  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 pilihan Anda lagi: Anda harus menemukan bahwa ketika Anda menyentuh pengambilan itu akan mengembalikan kesehatan Anda, menjadi transparan, lalu kembali siap untuk digunakan lagi.

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

Coba gunakan penjemputan kesehatan ini di proyek Anda sendiri, atau ubah penampilan dan efek untuk memberikan jenis power-up yang berbeda kepada pemain Anda.

Kode kode


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