Quick answer: Unreal SpawnActorDeferred returns an actor pointer but the actor never appears in the world? Without FinishSpawning, the actor stays in limbo — deferred spawn is two-step.
A weapon spawn call uses SpawnActorDeferred to set the owner before init; the developer forgot the FinishSpawning call. The weapon never registers in the world.
Two-Step Pattern
AWeapon* W = World->SpawnActorDeferred<AWeapon>(Class, Transform);
W->Owner = Pawn;
W->FinishSpawning(Transform);Between the two calls, set properties that must be in place before BeginPlay. After FinishSpawning the actor goes live and BeginPlay fires.
Why Use Deferred?
Some components require their owner / config set before BeginPlay runs. Deferred lets you arrange the actor before it starts ticking.
Common Replacements
For simple cases, SpawnActor with a SpawnInfo struct is shorter. Use deferred only when init order matters.
Failed Spawn
If SpawnActorDeferred returns nullptr, the collision check failed or the class is abstract. Check the spawn parameters before passing them in.
Verifying
Spawned actor appears, ticks, and has owner / config set correctly from frame one.
“Deferred spawn is two-step. Always pair SpawnActorDeferred with FinishSpawning.”
Wrap deferred spawn in a helper template — takes the class, transform, and an init lambda. Misses become impossible.