Selama tutorial Dasar Skrip, Anda telah menyetel bagian individual untuk membuat adegan yang dapat dimainkan. Dengan metode sebelumnya, jika Anda menggandakan bagian, Anda juga akan memiliki skrip duplikasi. Ini akan membuat pembaruan skrip menjadi tedioso karena perubahan harus dilakukan script ke script.
Dalam tutorial ini, pola yang berbeda akan digunakan untuk menciptakan beberapa pickup kesehatan, dengan hanya satu salinan script yang menentukan perilaku pickup kesehatan. Saat pickup disentuh, itu akan mengembalikan kesehatan pemain, memudar sedikit dan dinonaktifkan untuk periode waktu yang singkat.
Mengatur
Pertama, Anda akan memerlukan bagian atau model untuk digunakan sebagai pickup. The Showdown Town example world mencakup banyak pickup kesehatan yang tersebar di seluruh peta.
Setiap pengambilan kesehatan adalah Uni dari dua bagian persegi dengan PointLight hijau di dalam. Mereka semua disimpan dalam satu folder di Workspace bernama KesehatanPengambilan , di mana script mencarinya. Jika Anda menambahkan lebih banyak ke peta, penting Anda memastikan bahwa mereka juga disimpan di folder ini.
Mengembalikan Kesehatan
Untuk memulai, script perlu menyiarkan kembali kesehatan pemain. Pola ini seharusnya familiar bagi Anda dari tutorial Lava Berbahaya.
Dalam ServerScriptService, tambahkan skrip bernama PickupManager.
Dalam script ini, declare konstan bernama MAX_HEALTH dengan value 100 .
Buat 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, dapatkan model karakter dari orang tua otherPart . Selanjutnya, periksa apakah ia memiliki Humanoid menggunakan FindFirstChildWhichIsA() .
Jika memiliki humanoid, tetapkan Kesehatan mereka property 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
Mendapatkan Folder Penjemputan
Dokumen夹 yang berisi pengambilan kesehatan mungkin tidak dimuat ke dalam game pada saat script berjalan. WaitForChild dapat digunakan untuk menghentikan script dan mendapatkan dokumen夹 HealthPickups saat script dimuat.
Ketika dipanggil di sebuah folder, fungsi GetChildren akan mengembalikan sebuah array dari konten folder.
Di bawah MAX_HEALTH, declare a variable called healthPickupsFolder dan use the WaitForChild function to get the HealthPickups folder from the Workspace.
Buat variabel bernama healthPickups untuk menyimpan hasil panggilan fungsi GetChildren di 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
Looping dengan ipairs
onTouchHealthPickup perlu dipanggil untuk setiap pengambilan kesehatan dalam array. Untuk melakukan ini secara efisien, fungsi loop baru akan digunakan.
ipairs adalah fungsi yang dapat digunakan dengan for loop untuk pergi melalui setiap elemen dari array. Anda tidak perlu menentukan di mana loop dimulai dan berakhir. A for loop menggunakan ipairs adalah definisi sebagai berikut:
- Indeks : ini setara dengan variabel kontrol dalam loop normal.
- Nilai : ini akan dipenuhi dengan setiap elemen dalam array saat loop beriterasi. Ini adalah ide yang bagus untuk menyebut variabel nilai setelah apa yang akan sebenarnya berisi.
- Array: : array yang ingin Anda ulangi diberikan ke fungsi ipairs.
Dalam kode berikut, Anda tidak memerlukan indeks untuk apa pun, jadi itu bisa ditinggalkan dengan _ . Buat untuk loop dengan fungsi ipairs, dengan 1> healthPickups1> .
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 lapas akan diperlukan untuk menyampaikan pengambilan kesehatan ke fungsi onTouchHealthPickup saat menghubungkan ke acara Touched.
Dalam for loop, hubungkan acara Touched ke fungsi anonim dengan parameter bernama otherPart .
Panggil fungsi onTouchHealthPickups, dengan menyebutkan kedua 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 mengembalikan kesehatan Anda. Anda akan perlu menyakiti pemain pertama Anda - cobalah berdiri di ventilasi di samping titik bertelur.
Sebuah bar kesehatan harus muncul di bagian atas kanan yang akan menghilang saat pemain diobati.
Pengambilan Cooldown
Saat ini, pengambilan akan secara permanen menyembuhkan pemain mana pun yang menyentuhnya. Ini akan lebih efektif dalam game jika hanya bisa dipilih sekali, dengan cooldown singkat sebelum bisa digunakan lagi.
Pertama, Anda perlu mencatat apakah atau tidak pengambilan berada dalam periode cooldown. Pola di bawah ini harus familiar dari Fading Trap - kali ini, debounce akan dicapai dengan menetapkan attribute di pengambilan kesehatan.
Dalam for loop, set a new attribute bernama "Enabled" ke true .
Wrap the code inside onTouchHealthPickup in an if statement with the condition 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
Menonaktifkan Penjemputan
Pickup harus memberikan umpan balik visual bahwa itu dinonaktifkan - cara umum untuk menunjukkan ini adalah membuatnya sedikit transparan.
Deklarasikan tiga konstansen di bagian atas script (jangan ragu untuk menyesuaikan setiap nilai ke preferensi 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 if statement di onTouchHealthPickup, tetapkan Transparency dari pickup ke DISABLED_TRANSPARENCY, dan nilai atribut 1> Enabled1> 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(), menyebutkan COOLDOWN sebagai jumlah untuk ditunggu.
Set Transparency kembali ke ENABLED_TRANSPARENCY dan Enabled kembali ke 1> true1> .
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 pickup Anda lagi: Anda harus menemukan bahwa ketika Anda menyentuh pickup, itu mengembalikan kesehatan Anda, menjadi transparan, dan kemudian kembali siap untuk digunakan lagi.
Jika Anda ingin membuat umpan balik lebih berdampak bagi pemain ketika pickup dikumpulkan, coba potong kecerahan PointLight di pickup ketika Anda mengubah transparansi.
Coba gunakan pickup kesehatan ini dalam proyek Anda sendiri, atau ubah tampilan dan efek untuk memberikan jenis power-up yang berbeda kepada pemain Anda.
Kode Terakhir
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