รูปแบบการดีบาวน์

*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่

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

ตรวจจับการชนกัน

สมมติว่าคุณต้องการสร้างส่วนกับดักที่เป็นอันตรายซึ่งทำให้เกิดความเสียหาย 10 เมื่อถูกสัมผัส การทำงานในขั้นต้นอาจใช้การเชื่อมต่อ BasePart.Touched พื้นฐานและฟังก์ชัน damagePlayer ดังนี้:

สคริปต์ - ทำให้ผู้เล่นเสียหาย

local part = script.Parent
local function damagePlayer(otherPart)
print(part.Name .. " ชนกับ " .. otherPart.Name)
local humanoid = otherPart.Parent:FindFirstChildWhichIsA("Humanoid")
if humanoid then
humanoid.Health -= 10 -- ลดพลังชีวิตผู้เล่น
end
end
part.Touched:Connect(damagePlayer)

แม้ว่าจะดูมีเหตุผลในครั้งแรก แต่การทดสอบจะแสดงให้เห็นว่าส่วน Touched เกิดขึ้นหลายครั้งในเวลาสั้นๆ จากการชนกันทางกายภาพที่ละเอียดอ่อน

เพื่อหลีกเลี่ยงการทำให้เกิดความเสียหายมากเกินไปในขณะสัมผัสครั้งแรก คุณสามารถเพิ่มระบบดีบาวน์ซึ่งบังคับให้มีช่วงเวลาพักในการทำให้เกิดความเสียหายผ่าน Instance Attribute

สคริปต์ - ทำให้ผู้เล่นเสียหายโดยใช้ดีบาวน์

local part = script.Parent
local RESET_TIME = 1
local function damagePlayer(otherPart)
print(part.Name .. " ชนกับ " .. otherPart.Name)
local humanoid = otherPart.Parent:FindFirstChildWhichIsA("Humanoid")
if humanoid then
if not part:GetAttribute("Touched") then
part:SetAttribute("Touched", true) -- ตั้งค่าคุณลักษณะเป็นจริง
humanoid.Health -= 10 -- ลดพลังชีวิตผู้เล่น
task.wait(RESET_TIME) -- รอระยะเวลาการคืนค่า
part:SetAttribute("Touched", false) -- คืนค่าคุณลักษณะ
end
end
end
part.Touched:Connect(damagePlayer)

เรียกเสียง

ดีบาวน์ยังมีประโยชน์เมื่อทำงานที่เสียง เช่น การเล่นเสียงเมื่อสองส่วนชนกัน (Touched) หรือการเล่นเสียงในเหตุการณ์ Activated เมื่อผู้ใช้มีปฏิสัมพันธ์กับปุ่มที่ปรากฏบนหน้าจอ ในทั้งสองกรณี การเรียก Sound:Play() จะเริ่มเล่นจากจุดเริ่มต้นของแทร็ค และ — โดยไม่มีระบบดีบาวน์ — เสียงอาจเล่นซ้ำหลายครั้งในเวลาสั้น ๆ

เพื่อป้องกันการทับซ้อนกันของเสียง คุณสามารถใช้ดีบาวน์โดยใช้คุณสมบัติ IsPlaying ของวัตถุ Sound:

สคริปต์ - เล่นเสียงชนกันโดยใช้ดีบาวน์

local projectile = script.Parent
local function playSound()
-- ค้นหาเสียงเด็กในส่วน
local sound = projectile:FindFirstChild("Impact")
-- เล่นเสียงเฉพาะเมื่อไม่กำลังเล่นอยู่
if sound and not sound.IsPlaying then
sound:Play()
end
end
projectile.Touched:Connect(playSound)
สคริปต์ - เล่นเสียงคลิกปุ่มโดยใช้ดีบาวน์

local button = script.Parent
local function onButtonActivated()
-- ค้นหาเสียงเด็กในปุ่ม
local sound = button:FindFirstChild("Click")
-- เล่นเสียงเฉพาะเมื่อไม่กำลังเล่นอยู่
if sound and not sound.IsPlaying then
sound:Play()
end
end
button.Activated:Connect(onButtonActivated)

เอฟเฟกต์การเก็บ

เกมมักจะมีการเก็บได้ในโลก 3D เช่น ยาและกระสุน หากคุณออกแบบการเก็บเหล่านี้เพื่อให้มีอยู่ในโลกสำหรับผู้เล่นเพื่อเก็บซ้ำอีกครั้ง ควรเพิ่มระยะเวลา "พัก" ก่อนที่การเก็บจะรีเฟรชและรีแอคทีฟ

คล้ายกับ การตรวจจับการชนกัน คุณสามารถจัดการสถานะดีบาวน์ด้วย Instance Attribute และแสดงให้เห็นถึงระยะเวลาพักโดยการเปลี่ยนค่า Transparency ของส่วน

สคริปต์ - เก็บสุขภาพโดยใช้ดีบาวน์

local part = script.Parent
part.Anchored = true
part.CanCollide = false
local COOLDOWN_TIME = 5
local function healPlayer(otherPart)
local humanoid = otherPart.Parent:FindFirstChildWhichIsA("Humanoid")
if humanoid then
if not part:GetAttribute("CoolingDown") then
part:SetAttribute("CoolingDown", true) -- ตั้งค่าคุณลักษณะเป็นจริง
humanoid.Health += 25 -- เพิ่มพลังชีวิตผู้เล่น
part.Transparency = 0.75 -- ทำให้ส่วนโปร่งแสงเพื่อแสดงสถานะการพัก
task.wait(COOLDOWN_TIME) -- รอระยะเวลาการพัก
part.Transparency = 0 -- คืนค่าบริษัทให้ทึบทั้งหมด
part:SetAttribute("CoolingDown", false) -- คืนค่าคุณลักษณะ
end
end
end
part.Touched:Connect(healPlayer)
©2026 Roblox Corporation. Roblox, โลโก้ Roblox และ Powering Imagination เป็นส่วนหนึ่งของเครื่องหมายการค้าที่จดทะเบียน และไม่ได้จดทะเบียนของเราในสหรัฐฯ และประเทศอื่นๆ