ในระหว่างการฝึกสคริปต์พื้นฐาน คุณจะมีสคริปต์แต่ละชิ้นเพื่อสร้างฉากที่เล่นได้ ด้วยวิธีการเก่า หากคุณเคยคัดลอกสคริปต์ คุณจะมีสคริปต์ซ้ำซากด้วย นี่จะทำให้การปรับปรุงสคริปต์น่
ในวิดีโอนี้จะใช้รูปแบบที่แตกต่างกันเพื่อสร้างจำนวนหลายของการเก็บสุขภาพโดยใช้เฉพาะคัดลอกเดียวของสคริปต์ซึ่งกำหนดการเก็บสุขภาพโดยใช้ เมื่อสัมผัสจะฟื้นฟูสุขภาพของผู้เล่นแล
การตั้งค่า
ก่อนอื่น, คุณจะต้องมีส่วนหนึ่งหรือรุ่นที่จะใช้เป็นจุดเก็บของ โลก ตัวอย่างเมืองในเกม รวมอยู่ด้วยจำนวนมากของการเก็บของสุขภาพทั่วแผนที่
แต่ละการเก็บสุขภาพเป็นการผสานรวมของสองส่วนสี่เหลี่ยมผืนที่มีสีเขียว PointLight ภายใน พวกเขาจัดเก็บไว้ในโฟลเดอร์เดียวใน Workspace ที่เรียกว่า HealthPickups ซึ่งเป็นสถานที่ที่ส
การฟื้นฟูสุขภาพ
เพื่อเริ่มต้น สคริปต์จะต้องสร้างความสมบูรณ์แบบให้กับสุขภาพของผู้เล่น รูปแบบนี้คุณควรคุ้นเคยจากการฝึกเริ่มต้น ลาวาเสียชีวิต นี้
ใน ServerScriptService เพิ่มสคริปต์ที่มีชื่อว่า PickupManager
ในสคริปต์นี้ ประกาศคงคลังที่มีชื่อว่า MAX_HEALTH ด้วยค่า 100
สร้างฟังก์ชันที่มีชื่อว่า onTouchHealthPickup ด้วยพารามิเตอร์สำหรับอีกส่วนที่แตะเก็บและตัวเก็บ
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)endในคุณสมบัติ, รับตัวอักษร รุ่นจากพ่อของ otherPart ต่อไป, ตรวจสอบว่ามี Humanoid โดยใช้ FindFirstChildWhichIsA() .
หากมี humanoid ให้ตั้งค่า ความเป็นสุข ของพวกเขาให้เป็น 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 เพื่อดึงหน่อไม้สุขภาพจาก 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 จะเริ่มต้นและสิ้นสุดที่ไหน ตัวแปร for โดยใช้ ipairs จะถูกกำหนดด้วยว่า
- ดัชนี : นี่คือตัวแปรควบคุมในปกติสำหรับขีดเส้นใต้
- มูลค่า : นี้จะถูกกรอกด้วยแต่ละองค์ประกอบในรายการเป็นลำดับของลำดับการทำซ้ำ เป็นความคิดที่ดีที่จะตั้งชื่อแปรมูลค่าหลังจากที่มันจะมีอยู่จริง
- รายการ : รายการที่คุณต้องการเรียกผ่านไปยัง iпаร์ทีฟังก์ชัน
ในรหัสต่อไปนี้คุณไม่ต้องการดัชนีสำหรับอะไรใด ๆ ดังนั้นจึงสามารถว่างเปล่าด้วย _ สร้างรายการ สำหรับ ห่วงโซ่โดยใช้ฟังก์ชัน ipairs ผ่าน 1> health
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
ใน for ห้องนิรภัย เชื่อมต่อเหตุการณ์ที่แตะไปยังฟังก์ชันที่ไม่ระบุด้วยตัวอักษรที่มีชื่อว่า otherPart
โทรหาฟังก์ชัน onTouchHealthPickups โดยมีทั้งสมมติมาตรฐาน otherPart และ healthPickup
for _, healthPickup in ipairs(healthPickups) dohealthPickup.Touched:Connect(function(otherPart)onTouchHealthPickup(otherPart, healthPickup)end)end
ทดสอบรหัสของคุณตอนนี้และคุณควรพบว่าการเก็บพลังชีวิตสามารถกู้คืนสุขภาพของคุณได้ คุณจะต้องทำลายผู้เล่นของคุณก่อน - ลองยืนบนแผ่นระบายน้ำข้างสปอร์ม
จะปรากฏบาร์สุขภาพที่ด้านบนขวาซึ่งจะหายไปเมื่อผู้เล่นได้รับการรักษา
เวลาการเก็บตัวเงิน
ขณะนี้การเลือกจะรักษาผู้เล่นที่แตะมันได้อย่างถาวร มันจะมีประสิทธิภาพมากขึ้นในเกมถ้ามันสามารถเลือกได้เเค่ครั้งเดียวก่อนที่จะสามารถใช้งานได้อีกครั้ง
ก่อนอื่น, คุณต้องบันทึกว่าเก็บของอยู่ในระยะเวลาที่ใช้เวลานานหรือไม่ รูปแบบด้านล่างควรเป็นที่คุ้นเคยจาก Fading Trap - ในครั้งนี้, การดีบั๊นจะถูกบังคับโดยการตั้งค่าคุณสมบัติใน
ใน for เวลาผ่าน กำหนดค่าตัวละครใหม่ที่มีชื่อว่า Enabled Bernie ไปยัง 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 และมูลค่าของค่าตัวละคร 1> Enabled1> เป็น 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 กลับไปที่ 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
ทดสอบการเก็บของคุณอีกครั้ง: คุณควรพบว่าเมื่อคุณแตะการเก็บของ มันจะคืนค่าสุขภาพของคุณ เป็นใส่ใจ แล้วกลับมาใช้อีกครั้ง
หากคุณต้องการทำให้ข้อเสนอแนะมีผลกระทบมากขึ้นสำหรับผู้เล่นเมื่อเก็บขึ้น ลองตัดความสว่างของ 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