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

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


ฟื้นฟูสุขภาพ
ในการเริ่มต้น สคริปต์จะต้องฟื้นฟูสุขภาพของผู้เล่น รูปแบบนี้ควรคุ้นเคยกับคุณจากบทแนะนำการใช้งาน ลาวาร้ายแรง
ใน ServerScriptService เพิ่มสคริปต์ที่ชื่อว่า PickupManager
ในสคริปต์นี้ ประกาศคงที่ที่เรียกว่า MAX_HEALTH ด้วยค่า 100
สร้างฟังก์ชันที่เรียกว่า onTouchHealthPickup ด้วยพารามิเตอร์สำหรับส่วนอื่นที่สัมผัสการเก็บและตัวเก็บเอง
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)endในฟังก์ชัน รับโมเดลตัวละครจากพ่อของ otherPart ต่อไปตรวจสอบว่ามี Humanoid โดยใช้ FindFirstChildWhichIsA() หรือไม่
หากมีมนุษย์ ตั้งค่าคุณสมบัติ สุขภาพ ของพวกเขาเป็น 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 จากพื้นที่ทำงาน
สร้างตัวแปรชื่อ 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 เพื่อไปผ่านแต่ละองค์ประกอบของคอลเลกชันคุณไม่จำเป็นต้องระบุว่าลูปเริ่มต้นและสิ้นสุดที่ไหนการซ้ำของ A โดยใช้ ipairs จะกำหนดไว้ดังนี้:
- ดัชนี : นี่เทียบเท่ากับตัวแปรควบคุมในลูปปกติ
- ค่า : จะถูกเติมด้วยแต่ละองค์ประกอบในคอลเลกชันในขณะที่ลูปซ้ำเป็นความคิดที่ดีที่จะตั้งชื่อตัวแปรค่าหลังจากสิ่งที่จะมีจริงๆ
- รายการ : รายการที่คุณต้องการจะเรียกซ้ำถูกส่งไปยังฟังก์ชัน ipairs
ในรหัสต่อไปนี้คุณไม่ต้องการดัชนีสำหรับอะไร ดังนั้นจึงสามารถปล่อยให้ว่างเปล่าด้วย _สร้างลูป สําหรับ โดยใช้ฟังก์ชัน 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 เชื่อมต่ออีเวนต์ที่สัมผัสกับฟังก์ชันที่ไม่ระบุชื่อด้วยพารามิเตอร์ชื่อ otherPart
เรียกฟังก์ชัน onTouchHealthPickups โดยส่งพารามิเตอร์ทั้ง otherPart และ healthPickup
for _, healthPickup in ipairs(healthPickups) dohealthPickup.Touched:Connect(function(otherPart)onTouchHealthPickup(otherPart, healthPickup)end)end
ทดสอบโค้ดของคุณตอนนี้และคุณควรพบว่าการเก็บสุขภาพจะฟื้นฟูสุขภาพของคุณคุณจะต้องทำลายผู้เล่นของคุณก่อน - ลองยืนบนช่องระบายอากาศที่อยู่ติดกับจุดเกิด
แถบสุขภาพควรปรากฏในด้านบนขวาซึ่งจะหายไปเมื่อผู้เล่นได้รับการรักษา
ระยะเวลาคูลดาวน์การรับ
ขณะนี้การเก็บจะรักษาผู้เล่นใดๆ ที่สัมผัสมันไปตลอดไปจะมีประสิทธิภาพมากขึ้นในเกมหากสามารถหยิบได้เพียงครั้งเดียวเท่านั้น โดยมีคูลดาวน์สั้นๆ ก่อนที่จะสามารถใช้งานได้อีกครั้ง
ก่อนอื่นคุณต้องบันทึกว่าการรับมีอยู่ในช่วงคูลดาวน์หรือไม่รูปแบบด้านล่างควรคุ้นเคยจาก กับดักการจาง - ครั้งนี้ความล่าช้าจะได้รับโดยการตั้งค่าคุณสมบัติบนการเก็บสุขภาพ
ในลูป for ตั้งค่าคุณสมบัติใหม่ **** ที่เรียกว่า "Enabled" เป็น true
ห่อโค้ดไว้ภายใน onTouchHealthPickup ในคำสั่งหากมีเงื่อนไข 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
ทดสอบการรับของคุณอีกครั้ง: คุณควรพบว่าเมื่อคุณสัมผัสการรับ มันจะฟื้นฟูสุขภาพของคุณให้กลับมาโปร่งใสแล้วกลับมาพร้อมใช้งานอีกครั้ง
หากต้องการทำให้ความคิดเห็นมีผลมากขึ้นสำหรับผู้เล่นเมื่อเก็บขึ้นมา ลองตัดความสว่างของจุดแสงในการเก็บขึ้นเมื่อคุณเปลี่ยนความโปร่งใส
ลองใช้การรับสุขภาพเหล่านี้ในโครงการของคุณเอง หรือเปลี่ยนรูปลักษณ์และผลกระทบเพื่อให้พลังงานชนิดอื่นแก่ผู้เล่นของคุณ
รหัสสุดท้าย
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