Touch event delay

I made a throwing ball, and I ran a touching event on it that simply checks if the part that the ball touched is not the ball itself or anything that DescendantOf player (anything that the player have or part of him) then print the part name and Disconnect the touching event. the problem is that sometimes the ball breakthrough things for example if there are two walls one after another and I shoot the first wall some times it tells me that the ball touched the second wall.
I set the NetworkOwner to the player, and I have noticed that when I increase the speed of the ball the breakthrough happens more. it seems that there is a delay in the touch event but I am not sure about it.
This is the code:

local playerCharacter = workspace:FindFirstChild(script.Parent.Owner.Value) -- get player character
script.Parent.PrimaryPart:SetNetworkOwner(game.Players:GetPlayerFromCharacter(playerCharacter))

print("network owner :",script.Parent.PrimaryPart:GetNetworkOwner())

local touchConn
local function onTouched(part)
	if part:IsDescendantOf(script.Parent) or part:IsDescendantOf(playerCharacter) then return end
	touchConn:Disconnect()
	print("part touched :",part.Name)
    wait(1)
	print("destroyed")
	script.Parent:Destroy()
end

touchConn = script.Parent.PrimaryPart.Touched:Connect(onTouched)
wait(5)
script.Parent:Destroy()

Are you perhaps new to scripting?
You might want to check the wait() line of code. As the script will wait exactly how long you put it. For example you put wait(1) so the script will wait 1 seconds, by then somethings else could have happened while the script was waiting. Same goes to wait(5) in the second last line.

this is not the problem, I disconnect the touch event before the wait, the code will reach the wait after the first touching that’s mean that the touch event will fire only on time, If that was the problem It will print 2 times, I am not sure that you understand the problem.

If that’s helps I tried now to stop the part when touching by adding in the onTouched function:

local bv = Instance.new("BodyVelocity", script.Parent.PrimaryPart) 
bv.MaxForce = Vector3.new(math.huge, math.huge, math.huge)
bv.Velocity = Vector3.new(0,0,0)

the part stops after the wall even if it’s touched the wall.