ลดลายล้างออก

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

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

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

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

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

local part = script.Parent
local function damagePlayer(otherPart)
print(part.Name .. " collided with " .. otherPart.Name)
local humanoid = otherPart.Parent:FindFirstChildWhichIsA("Humanoid")
if humanoid then
humanoid.Health -= 10 -- ลดสุขภาพผู้เล่น
end
end
part.Touched:Connect(damagePlayer)

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

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

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

local part = script.Parent
local RESET_TIME = 1
local function damagePlayer(otherPart)
print(part.Name .. " collided with " .. 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() เริ่มเล่นเพลงตั้งแต่ต้นของเส้นทางและ — โดยไม่มีระบบป้องกันการเล่นซ้ำ — เสียงอาจเล่นหลายครั้งอย่างรวดเร็ว

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

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

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)
สคริปต์ - คลิกปุ่มเล่นโดยใช้ Debounce

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 เช่นชุดปฐมพยาบาล แพ็คกระสุน และอื่นๆหากคุณออกแบบการรับเหล่านี้เพื่ออยู่ในโลกสำหรับผู้เล่นที่จะคว้าอีกครั้งและอีกครั้ง ควรเพิ่มเวลา "คูลดาวน์" ก่อนที่การรีเฟรชและเปิดใช้งานอีกครั้ง

คล้ายกับการตรวจจับการชนกัน คุณสามารถจัดการสถานะการชะลอด้วยคุณสมบัติตัวอย่าง และแสดงระยะเวลาคูลดาวน์โดยการเปลี่ยนส่วน Transparency

สคริปต์ - รับสุขภาพโดยใช้ Debounce

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)