I'm working on a barrage type attack that spawns many hitboxes that do a set amount of damage, but some of the hitboxes simply don't register contact despite them clearly hitting the target. I have a local script calling the server script below repeatedly when the player holds down E. The barrage is supposed to do 60 damage out of a total of 100 default health, but the actual damage numbers vary. The longer I make the delay for the Debris Service the more accurate the hit detection is, but the hitboxes can't just linger there for longer than they appear and it still isn't perfect.

game.ReplicatedStorage.Stand.Events.Barrage.OnServerEvent:Connect(function(player)
	-- definitions
	db = false
	
	-- hitbox properties
	hitBox = Instance.new("Part", workspace)
	hitBox.Transparency = 0.5
	hitBox.CanCollide = false
	hitBox.Massless = true
	hitBox.Size = Vector3.new(5,4,5)
	hitBox.CFrame = player.Character.LowerTorso.CFrame * CFrame.new(0, 1, -4)
	hitBox.TopSurface = 0
	hitBox.BottomSurface = 0
	
	-- weld
	local weld = Instance.new("Weld")
	weld.Part0 = player.Character.HumanoidRootPart
	weld.Part1 = hitBox
	weld.C0 = CFrame.new(0,0,-3)
	weld.Parent = player.Character.HumanoidRootPart
	
	-- Timed Destruction
	game:GetService("Debris"):AddItem(hitBox, 0.4)
	
	-- hitBox player interaction
	hitBox.Touched:Connect(function(hit)
		print("player hit")
		local ehum = hit and hit.Parent:FindFirstChild("Humanoid") or hit.Parent:FindFirstChild("Humanoid")

		if ehum and ehum ~= player.Character.Humanoid then
			if not db then
				
				db = true
				ehum:TakeDamage(2)
				local walkspeed = hit.Parent.Humanoid.WalkSpeed
				hit.Parent.Humanoid.WalkSpeed = 4
				wait(0.4)
				hit.Parent.Humanoid.WalkSpeed = walkspeed

			end
		end
		
	end)
	
end)

If you don't understand what I mean, join the game for yourself: https://www.roblox.com/games/4907040843/Untitled-lemark23-Project?refPageId=4fd71c98-003e-4206-8fa8-d4189f60b3f8