ตลอดการสอนการเขียนสคริปต์พื้นฐาน คุณได้มีการเขียนสคริปต์สำหรับชิ้นส่วนต่างๆ เพื่อสร้างฉากที่สามารถเล่นได้ ด้วยวิธีการก่อนหน้านี้ หากคุณทำซ้ำชิ้นส่วน คุณจะมีสคริปต์ที่ซ้ำกันด้วย ซึ่งจะทำให้การอัปเดตสคริปต์ทำได้ยากเพราะต้องทำการแก้ไขทีละสคริปต์
ในบทเรียนนี้ จะใช้รูปแบบที่แตกต่างออกไปเพื่อสร้างการเก็บสุขภาพจำนวนมาก โดยมีสคริปต์เพียงชุดเดียวที่กำหนดพฤติกรรมของการเก็บสุขภาพ เมื่อมีการสัมผัสการเก็บ มันจะคืนสุขภาพของผู้เล่น เปลี่ยนสีสักครู่ และถูกปิดการใช้งานในช่วงระยะเวลาสั้นๆ
ตั้งค่า
อันดับแรก คุณจะต้องมีชิ้นส่วนหรือโมเดลเพื่อใช้เป็นการเก็บ การ ทำซ้ำเมืองแห่งการต่อสู้ มีการเก็บสุขภาพมากมายกระจายอยู่ทั่วแผนที่

การเก็บสุขภาพแต่ละชิ้นเป็นการรวมกันของชิ้นส่วนสี่เหลี่ยมผืนผ้าสองชิ้นโดยมีจุดไฟสีเขียวอยู่ภายใน ทั้งหมดถูกจัดเก็บในโฟลเดอร์เดียวใน Workspace ที่ชื่อ HealthPickups ซึ่งเป็นที่สคริปต์จะมองหา หากคุณเพิ่มสิ่งใดลงในแผนที่ มันจำเป็นต้องอยู่ในโฟลเดอร์นี้ด้วย


คืนสุขภาพ
ในการเริ่มต้น สคริปต์ต้องคืนสุขภาพของผู้เล่น รูปแบบนี้ควรจะคุ้นเคยกับคุณจากบทเรียน ลาวาที่อันตราย
ใน ServerScriptService ให้เพิ่มสคริปต์ที่มีชื่อว่า PickupManager
ในสคริปต์นี้ ให้ประกาศค่าคงที่ชื่อว่า MAX_HEALTH โดยมีค่าเป็น 100
สร้างฟังก์ชันชื่อ onTouchHealthPickup โดยมีพารามิเตอร์สำหรับชิ้นส่วนอื่นที่สัมผัสการเก็บและการเก็บสุขภาพเอง
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)endในฟังก์ชัน ให้ดึงโมเดลของตัวละครจากพ่อแม่ของ otherPart จากนั้นตรวจสอบว่า มันมี Humanoid โดยใช้ FindFirstChildWhichIsA()
หากมันมีมนุษย์ ให้กำหนดคุณสมบัติ Health ของพวกเขาเป็น MAX_HEALTH
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)local character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHendend
รับโฟลเดอร์การเก็บ
โฟลเดอร์ที่เก็บการเก็บสุขภาพอาจจะยังไม่โหลดเข้าสู่ประสบการณ์เมื่อสคริปต์ทำงาน ใช้ WaitForChild เพื่อหยุดสคริปต์และดึงโฟลเดอร์ HealthPickups เมื่อมันโหลดเสร็จ
เมื่อเรียกใช้งานบนโฟลเดอร์ ฟังก์ชั่น GetChildren จะส่งคืนอาร์เรย์ของเนื้อหาภายในโฟลเดอร์
ด้านล่าง MAX_HEALTH ให้ประกาศตัวแปรชื่อว่า healthPickupsFolder และใช้ฟังก์ชัน WaitForChild เพื่อดึงโฟลเดอร์ HealthPickups จาก Workspace
สร้างตัวแปรชื่อว่า healthPickups เพื่อจัดเก็บผลลัพธ์ของการเรียกฟังก์ชัน GetChildren บน 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
ลูปด้วย ipairs
onTouchHealthPickup จำเป็นต้องถูกเรียกสำหรับการเก็บสุขภาพแต่ละชิ้นในอาร์เรย์ เพื่อทำเช่นนี้อย่างมีประสิทธิภาพ จะใช้รูปแบบลูปประเภทใหม่
ipairs เป็นฟังก์ชันที่สามารถใช้ร่วมกับลูป for เพื่อผ่านแต่ละองค์ประกอบในอาร์เรย์ คุณไม่จำเป็นต้องระบุจุดเริ่มต้นและสิ้นสุดของลูป ลูป for ที่ใช้ ipairs ถูกกำหนดดังนี้:

- ดัชนี: นี่เทียบเท่ากับตัวแปรควบคุมในลูป for ปกติ
- ค่า: ค่านี้จะมีการเติมเต็มด้วยแต่ละองค์ประกอบในอาร์เรย์เมื่อทำลูป มันเป็นความคิดที่ดีในการตั้งค่าชื่อตัวแปรค่าตามสิ่งที่มันจะบรรจุจริงๆ
- อาร์เรย์: อาร์เรย์ที่คุณต้องการทำลูปผ่านจะถูกส่งไปยังฟังก์ชัน ipairs
ในโค้ดถัดไป คุณไม่จำเป็นต้องใช้ดัชนีสำหรับอะไร ดังนั้นมันสามารถถูกปล่อยว่างไว้ด้วย _ สร้างลูป for โดยใช้ฟังก์ชัน ipairs โดยส่ง 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
ความต้องการฟังก์ชันแบบหุ้มจะต้องมีการส่งการเก็บสุขภาพไปยังฟังก์ชัน onTouchHealthPickup เมื่อเชื่อมต่อกับเหตุการณ์ Touched
ในลูป for เชื่อมต่อเหตุการณ์ Touched กับฟังก์ชันนิรนามที่มีพารามิเตอร์ชื่อว่า otherPart
เรียกใช้ฟังก์ชัน onTouchHealthPickups โดยส่งพารามิเตอร์ otherPart และ healthPickup
for _, healthPickup in ipairs(healthPickups) dohealthPickup.Touched:Connect(function(otherPart)onTouchHealthPickup(otherPart, healthPickup)end)end
ทดสอบโค้ดของคุณในตอนนี้และคุณควรพบว่า การเก็บสุขภาพได้คืนสุขภาพของคุณแล้ว คุณจะต้องทำให้ผู้เล่นได้รับความเสียหายก่อน - ลองยืนอยู่บนช่องระบายอากาศข้างจุดเกิด

แถบสุขภาพควรปรากฏขึ้นทางมุมขวาบนและจะหายไปเมื่อผู้เล่นได้รับการรักษา
คูลดาวน์ของการเก็บ
ในขณะนี้ การเก็บสุขภาพจะรักษาผู้เล่นที่สัมผัสมันได้ตลอดไป มันจะมีประสิทธิภาพมากขึ้นถ้ามันสามารถถูกเก็บได้เพียงครั้งเดียว พร้อมทั้งมีเวลาคูลดาวน์สั้นๆ ก่อนที่จะนำกลับมาใช้ใหม่
เริ่มต้น คุณต้องบันทึกว่าการเก็บสุขภาพอยู่ในช่วงเวลาคูลดาวน์หรือไม่ รูปแบบด้านล่างควรจะคุ้นเคยจาก กับดักเลือนลาง - ในครั้งนี้ การควบคุมจะได้รับโดยตั้งค่าคุณลักษณะบนการเก็บสุขภาพ
ในลูป for ตั้งค่าคุณลักษณะใหม่ชื่อว่า "Enabled" เป็น true
ห่อโค้ดภายใน onTouchHealthPickup ไว้ในคำสั่ง if โดยมีเงื่อนไขว่า 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
ปิดการเก็บ
การเก็บสุขภาพควรให้ข้อเสนอที่มองเห็นได้ว่ามันถูกปิด - วิธีทั่วไปในการระบุคือการทำให้มันโปร่งใสเล็กน้อย
ประกาศค่าคงที่สามค่าในส่วนบนของสคริปต์ (คุณสามารถปรับค่าแต่ละค่าให้ถูกใจ):
- 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")ในคำสั่ง if ใน onTouchHealthPickup ให้กำหนด Transparency ของการเก็บสุขภาพเป็น DISABLED_TRANSPARENCY และค่าของคุณลักษณะ Enabled เป็น 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)endendendเรียกใช้ฟังก์ชัน task.wait() โดยส่ง COOLDOWN เป็นระยะเวลาที่ต้องรอ
ตั้งค่า Transparency กลับเป็น ENABLED_TRANSPARENCY และ Enabled กลับเป็น 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
ทดสอบการเก็บของคุณอีกครั้ง: คุณควรพบว่าเมื่อคุณสัมผัสการเก็บ มันจะคืนสุขภาพให้คุณ ทำให้มันโปร่งใส จากนั้นก็กลับมาพร้อมที่จะถูกใช้งานอีกครั้ง
หากคุณต้องการทำให้ข้อเสนอมีผลกระทบมากขึ้นสำหรับผู้เล่นเมื่อเก็บสุขภาพ คุณสามารถลองลดความสว่างของ PointLight ในการเก็บเมื่อคุณเปลี่ยนความโปร่งใส
ลองใช้การเก็บสุขภาพเหล่านี้ในโปรเจกต์ของคุณเอง หรือเปลี่ยนแปลงรูปลักษณ์และผลกระทบเพื่อให้เป็นพลังพิเศษที่แตกต่างให้กับผู้เล่นของคุณ
โค้ดสุดท้าย
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