Суть того, что вы делаете, звучит: начинайте блокировать после первого события и разблокируйте через некоторое время. Если бы это было с помощью нажатия кнопок или щелчков мышью, ваше решение сработало бы нормально. Это осложняется событием Touched, поскольку оно срабатывает любой частью, которая касается его, и персонаж игрока может иметь несколько точек касания.
The Touched и TouchEndeded события дают вам ссылку на экземпляр, который коснулся детали.
Если цель состоит в том, чтобы запустить событие коробки только один раз для каждого игрока или один раз, когда кто-либо его касается, вы можете сохранить словарь частей, которые в настоящее время касаясь коробки. Когда деталь касается, вы увеличиваете счетчик. Когда часть останавливается, вы уменьшаете ее. Вы удаляете флаг отмены только после удаления всех точек касания.
local box = game.Workspace.BoxModel
local playersTouching = {} --<string playerName, int totalParts>
local function onTouchedDebounced(otherPart)
-- check that the thing that touched is a player
local playerModel = otherPart.Parent
if not playerModel:IsA("Model") then
warn(otherPart.Name .. " isn't a child of a character. Exiting")
return
end
-- check whether this player is already touching the box
local playerName = playerModel.Name
local total = playersTouching[playerName]
if total and total > 0 then
warn(playerName .. " is already touching the box")
playersTouching[playerName] = total + 1
return
end
-- handle a new player touching the box
playersTouching[playerName] = 1
-- Do a thing here that you only want to happen once per event...
print(string.format("Hello! onTouchedDebounced() has ran with %s and %s", playerName, otherPart.Name))
end
local function onTouchedUndebounced(otherPart)
-- decrement the counter for this player
local playerName = otherPart.Parent.Name
if playersTouching[playerName] == nil then
return
end
local newTotal = playersTouching[playerName] - 1
playersTouching[playerName] = newTotal
-- if the total is back down to zero, clear the debounce flag
if newTotal == 0 then
playersTouching[playerName] = nil
print(string.format("Hello! onTouchedUndebounced() has ran and %s has no more touching parts", playerName))
end
end
box.Touched:Connect(onTouchedDebounced)
box.TouchEnded:Connect(onTouchedUndebounced)