I use this
game:GetService("RunService").RenderStepped:wait()
As a wait but it only seems to work some of the time.
It's in a localscript btw so I don't think that's the problem. I keep getting the error that it can only be used in a localscript for some reason. The localscript is inside a server script that copies the script into every new player if that info helps.