Well you can use the Teleport method, but you just need to run some Line Traces before hand to calculate collision, then use the HitResult.Location of that trace to modify where you’re setting the warp to.
I believe you can access this using
GetWorld()->LineTraceSingle()
. SetLocation also has a bSweep variable, setting that to true can prevent it from spawning in the middle of things. But I’ve also noticed it causes crashes if it’s used rapidly (like a Tick() or a Loop).