我正在 Roblox Studio 上编写 obby。在这个大厅中,我有角色可以跳跃的部件(这些部件大约是 10 x 10 颗螺柱)。
我想实现当角色位于某个部分时,该部分会改变颜色。
local platform = script.parent
local function changeColor(part)
local humanoid = part.Parent:FindFirstChild(‘Humanoid’)
if humanoid then
part.BrickColor = BrickColor.new(‘Bright red’)
end
end
local function restoreColor(part)
local humanoid = part.Parent:FindFirstChild(‘Humanoid’)
if humanoid then
part.BrickColor = BrickColor.new(‘Grey’)
end
end
platform.Touched:connect(changeColor)
platform.TouchEnded:connect(restoreColor)
这样做的问题是,当角色在该部件上行走时,该部件会随着每一步从灰色变为红色,然后再变回来。我希望该部分在玩家停留期间保持红色。所以我希望该函数检查玩家是否在最后 0.5 秒内走过它,以便让玩家有时间行走而不恢复颜色。这是正确的方法吗?如果是,我将如何去做。是否可以覆盖触摸的功能?
这就是它的样子(我后来稍微更改了代码,包括颜色等......但根本问题仍然存在)
您可以尝试使用 IsRegion3Empty 函数,该函数应该更可靠地返回是否有任何玩家站在平台正上方。它有两个优点:
它可以调整为比
Touched
和TouchEnded
更不敏感,因为不需要直接接触平台,只要玩家在平台上方的某个小区域内即可。它可以处理多个玩家。如果您要连接
TouchEnded
来重置颜色,那么如果两名玩家站在平台上,其中一名玩家离开,即使还有一名玩家站在平台上,颜色也会重置。通过检查平台上方的区域是否为空,只有当所有玩家离开平台时才会重置颜色。当任意零件进入该区域时,上述方法将会触发。要将其限制为玩家,您可以使用 FindPartsInRegion3 函数并检查该零件是否具有 Humanoid 父级。
使用去抖。去抖可以阻止事件或函数运行得太快。
local debounce=true
local part=script.Parent
local function changecolor()
if debounce then
debounce=false
-- add color changing code here
task.wait(2)
debounce=true
Part.Touched:Connect(changecolor)
这使得该函数只能每两秒运行一次。