ตอนนี้ผู้เล่นสามารถตกลงไปยังแพลตฟอร์มใดก็ได้โดยไม่มีผลกระทบ องค์นี้จะพาคุณไปสร้างอันตรายที่มองไม่เห็นขนาดใหญ่ในระดับเดียวกับน้ำในเกมของคุณ เมื่อผู้เล่นตกลงไปในอันตราย จะทำให้สุขภาพของพวกเขาลดลงเป็นศูนย์และจะเกิดใหม่ที่จุดเริ่มต้นของเกม
สร้างอันตรายน้ำพื้นฐาน
สร้างอันตรายน้ำพื้นฐานใน Workspace > World สร้างโฟลเดอร์ใหม่ชื่อ Hazardsภายในโฟลเดอร์ Hazards สร้าง Part บล็อกใหม่ชื่อ Hazard โดยมี Size 825, 1, 576 และ CFrame.Position 174, -6.5, 38 เพื่อให้ส่วนดังกล่าวคลุมพื้นที่น้ำรอบเกาะและแพลตฟอร์มตั้งค่า Transparency เป็น 1 เพื่อให้ส่วนนี้มองไม่เห็น และน้ำจริงๆ จะปรากฏขึ้นเป็นอันตราย ปิด CanCollide เพื่อให้ผู้เล่นตกผ่านไปยังน้ำ และเปิด Anchored เพื่อไม่ให้ฟิสิกส์เคลื่อนย้าย
ตรวจจับเมื่อผู้เล่นสัมผัสอันตราย
อันตรายไม่ทำอะไรจนกว่าคุณจะเขียนสคริปต์ที่ฟัง Touched และลดสุขภาพของผู้เล่นเป็นศูนย์
สร้าง HazardServiceใน ServerScriptService ให้สร้างสคริปต์ชื่อ HazardService ด้วยโค้ดดังต่อไปนี้:```lualocal Players = game:GetService("Players")local Workspace = game:GetService("Workspace")local hazardsFolder = Workspace.World.Hazardslocal hazards = hazardsFolder:GetChildren()local function onHazardTouched(otherPart)local character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player thenlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = 0endendendfor _, hazard in hazards dohazard.Touched:Connect(onHazardTouched)end```
HazardService มีความคล้ายคลึงกับ CoinService อย่างมาก อย่างไรก็ตาม แทนที่จะเก็บเหรียญ ผู้เล่นจะถูกตั้งค่าผลรวมสุขภาพเป็น 0 เมื่อตนสัมผัสกับอันตราย
สามารถปรับแต่ง เพิ่ม หรือลบวัตถุอันตรายในเกมได้ตามต้องการเพื่อสร้างอุปสรรคที่เป็นเอกลักษณ์ ขตราบใดที่วัตถุเหล่านั้นอยู่ในโฟลเดอร์ Hazards ลูปโค้ดจะเชื่อมโยงตัวจัดการเหตุการณ์ไปยังอันตรายทั้งหมดของคุณ
เชื่อมต่อกับวงจรชีวิตของผู้เล่น
วงจรชีวิตของผู้เล่นแสดงถึงเหตุการณ์ที่เกิดขึ้นเมื่อผู้เล่นมีปฏิสัมพันธ์ในเกมของคุณ เช่น การเข้าร่วม ออก หรือเกิดใหม่ คุณจำเป็นต้องเชื่อมโยงตัวจัดการกับเหตุการณ์เหล่านี้เพื่อดำเนินการลอจิกสำหรับแต่ละเหตุการณ์วงจรชีวิตหลัก
เพิ่มตัวจัดการวงจรชีวิตใน CoinServiceใน ServerScriptService ให้เพิ่มโค้ดดังต่อไปนี้ที่ส่วนท้ายของสคริปต์ CoinService ที่มีอยู่ (ไม่ต้องแทนที่โค้ดที่มีอยู่ — เพิ่มสิ่งนี้หลังจากมัน):```lualocal function onPlayerAdded(player)-- ตั้งค่าผลรวมเหรียญของผู้เล่นให้เป็น 0updatePlayerCoins(player, function(_)return 0end)player.CharacterAdded:Connect(function(character)-- WaitForChild จะหยุดลูปผู้เล่น ดังนั้นด้านล่างควรทำในเธรดแยกต่างหากtask.spawn(function()-- เมื่อผู้เล่นตายcharacter:WaitForChild("Humanoid").Died:Connect(function()-- ตั้งค่าผลรวมเหรียญของผู้เล่นให้เป็น 0updatePlayerCoins(player, function(_)return 0end)end)end)end)end-- เริ่มต้นผู้เล่นใดๆ ที่ถูกเพิ่มเข้ามาก่อนจะเชื่อมต่อกับเหตุการณ์ PlayerAddedfor _, player in Players:GetPlayers() doonPlayerAdded(player)endlocal function onPlayerRemoved(player)updatePlayerCoins(player, function(_)return nilend)endPlayers.PlayerAdded:Connect(onPlayerAdded)Players.PlayerRemoving:Connect(onPlayerRemoved)```
โค้ดนี้กำหนดฟังก์ชันเพื่อรีเซ็ตจำนวนเหรียญในช่วงเวลาวงจรชีวิตที่เหมาะสม:
- Players.PlayerAdded จะถูกเรียกใช้งานเมื่อผู้เล่นเข้าร่วมเกม และตั้งค่าจำนวนเหรียญเป็น 0
- Player.CharacterAdded จะถูกเรียกใช้งานเมื่อโมเดลตัวละครของผู้เล่นถูกเพิ่มเข้าไปในโลก มันเกิดขึ้นหลังจาก PlayerAdded และเมื่อใดก็ตามที่ผู้เล่นเกิดใหม่
- Humanoid.Died จะถูกเรียกเมื่อผู้เล่นเสียชีวิต และตั้งค่าจำนวนเหรียญเป็น 0 โดย task.spawn() จะสร้างเธรดแยกสำหรับการจัดการเรื่องนี้ ดังนั้นด้านอื่น ๆ ของวงจรชีวิตผู้เล่นสามารถทำงานต่อไปได้
- Player.PlayerRemoved จะถูกเรียกใช้เมื่อผู้เล่นออกจากเกมเพื่อทำความสะอาดสถานะของผู้เล่น
- โค้ดนี้ประกอบไปด้วยปัญหาที่อาจเกิดขึ้นที่ผู้เล่นสามารถเก็บเหรียญก่อนที่เหตุการณ์ Players.PlayerAdded จะถูกดำเนินการ และจากนั้นจะทำให้ค่าของเหรียญจะถูกตั้งเป็นศูนย์ เพื่อลดปัญหานี้ สามารถพิจารณาใช้โซลูชันเช่นการจัดตารางโค้ดหรือการหยุดตัวละครของผู้เล่นจนกว่าการเริ่มต้นจะเสร็จสิ้น อย่างไรก็ตาม โซลูชันเหล่านี้เกี่ยวข้องกับแนวคิดการเขียนสคริปต์ที่ซับซ้อนมากขึ้นซึ่งอยู่นอกเหนือขอบเขตของบทแนะนำนี้
ทดสอบการเล่น
เลือก Test จากตัวเลือกแบบเลื่อนลงและคลิก Play เก็บเหรียญสักสองสามเหรียญ จากนั้นกระโดดลงไปในน้ำ ตัวละครของคุณควรตายและเกิดใหม่ที่จุดเริ่มต้น โดยมีจำนวนเหรียญถูกตั้งเป็น 0