Mẫu Debounce

*Nội dung này được dịch bằng AI (Beta) và có thể có lỗi. Để xem trang này bằng tiếng Anh, hãy nhấp vào đây.

Một mẫu giảm thời gian chờ là một kỹ thuật lập trình ngăn chặn một chức năng chạy quá nhiều lần hoặc một đầu vào kích hoạt nhiều lần.Các kịch bản lập trình sau đây minh họa debounce như một tốt nhất thực hành.

Phát hiện va chạm

Giả sử bạn muốn tạo một phần bẫy nguy hiểm gây 10 sát thương khi chạm vào.Một triển khai ban đầu có thể sử dụng kết nối cơ bản BasePart.Touched và chức năng damagePlayer như thế này:

Tập lệnh - Thiệt hại người chơi

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 -- Giảm sức khỏe người chơi
end
end
part.Touched:Connect(damagePlayer)

Trong khi logic lúc đầu tiên nhìn, thử nghiệm sẽ cho thấy rằng sự kiện Touched bắt lửa nhiều lần trong sự thành công nhanh chóng dựa trên những va chạm vật lý tinh tế.

Để tránh gây thiệt hại quá mức trong lần tiếp liên hệban đầu, bạn có thể thêm một hệ thống giảm thời gian chờ trên sát thương thông qua một thuộc tính ví dụ của đối tượng.

Tập lệnh - Thiệt hại người chơi bằng cách sử dụng 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) -- Đặt thuộc tính thành true
humanoid.Health -= 10 -- Giảm sức khỏe người chơi
task.wait(RESET_TIME) -- Chờ thời gian đặt lại
part:SetAttribute("Touched", false) -- Đặt lại thuộc tính
end
end
end
part.Touched:Connect(damagePlayer)

Kích hoạt âm thanh

Debounce cũng hữu ích khi làm việc với hiệu ứng âm thanh, chẳng hạn như phát ra một âm thanh khi hai phần va chạm ( Touched ), hoặc phát ra một âm thanh trên sự kiện Activated khi người dùng tương tác với một nút trên màn hình.Trong cả hai trường hợp, gọi Sound:Play() bắt đầu phát lại từ đầu của bản nhạc và - không có hệ thống giảm thời gian trễ - âm thanh có thể phát nhiều lần trong chuỗi nhanh chóng.

Để ngăn chặn sự chồng lấp âm thanh, bạn có thể hủy bỏ sử dụng thuộc tính IsPlaying của đối tượng Sound:

Tập lệnh - Chơi âm thanh va chạm bằng cách sử dụng Debounce

local projectile = script.Parent
local function playSound()
-- Tìm âm thanh con trên phần
local sound = projectile:FindFirstChild("Impact")
-- Chơi âm thanh chỉ khi nó chưa được phát
if sound and not sound.IsPlaying then
sound:Play()
end
end
projectile.Touched:Connect(playSound)
Script - Nhấp vào nút Chơi bằng cách sử dụng Debounce

local button = script.Parent
local function onButtonActivated()
-- Tìm âm thanh con trên nút
local sound = button:FindFirstChild("Click")
-- Chơi âm thanh chỉ khi nó chưa được phát
if sound and not sound.IsPlaying then
sound:Play()
end
end
button.Activated:Connect(onButtonActivated)

Hiệu ứng nhặt

Trải nghiệm thường bao gồm các cuộc thu thập hiếm trong thế giới 3D như medkit, gói đạn, và nhiều hơn nữa.Nếu bạn thiết kế những lượt lấy này để vẫn còn trong thế giới cho người chơi lấy lại và lại lần nữa, một thời gian "chờ đợi" nên được thêm vào trước khi lấy làm mới và kích hoạt lại.

Tương tự như phát hiện va chạm, bạn có thể quản lý trạng thái giảm thời gian với một thuộc tính ví dụ , và hiển thị thời gian chờ bằng cách thay đổi phần Transparency .

Tập lệnh - Nhận lấy sức khỏe bằng cách sử dụng 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) -- Đặt thuộc tính thành true
humanoid.Health += 25 -- Tăng sức khỏe người chơi
part.Transparency = 0.75 -- Làm phần bán trong suốt để chỉ ra tình trạng chờ đợi
task.wait(COOLDOWN_TIME) -- Chờ thời gian chờ đợi
part.Transparency = 0 -- Đặt lại phần để hoàn toàn mờ nhạt
part:SetAttribute("CoolingDown", false) -- Đặt lại thuộc tính
end
end
end
part.Touched:Connect(healPlayer)