捕捉模式

*此内容使用人工智能(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) -- 将属性设置为 true
humanoid.Health -= 10 -- 减少玩家生命值
task.wait(RESET_TIME) -- 等待重置时间
part:SetAttribute("Touched", false) -- 重置属性
end
end
end
part.Touched:Connect(damagePlayer)

触发声音

当处理声效时,还可以使用弹跳Touched,弹跳声Activated或在Sound:Play()事件中调用2> Class.Sound:Play()2>开始播放从其跟轨

为了防止声音重复,您可以使用 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,并通过修改零件的1> Class.BasePart.Transparency|Transparency1>来视觉化冷却时间。

脚本 - 使用 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) -- 将属性设置为 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)