The spawn position should probably be determined by the spawner itself or set to specific areas.
Basically, before you allow the spawn you check the capsule size with a sweep and test if the object can indeed be spawned where you want it to.
If it can you proceed, if it cannot, you find another spot.
Further development of that would obviously tie into either nav mesh or nav invokers. However it’s likely overkill for your needs.
Keep it simple. Have some components into the level as spawners.
Make the master spawner look up all the elements of that type and select a random number in the range of 1 to the array count.
Then take that transform in world as the spawn transform.
Beware that the spawn transform may be Local and not World aligned - I can’t recall how it solves.
If it’s local, then you need to do math (subtract The spawner BP location? Or just run a transform from world to local on the spawn spot world location which is easier).
I don’t have anything I can show (nda prevent it).
If you can be more specific on what part confuses you, maybe I can recreate it and share how it was done.
To check if the spawn area is free you can do a capsule trace that matches the size of the capsule of the character and the position its in.
Assuming it gets no hits, you are clear to Spawn.
To gather objects and randomly select one for the location, you would use gameplay tags.
Because you can look them up, and get an array of objects to work with, they are particularly good for this use case in a smaller sized project.
Make sure you don’t spawn on tick. That’s really just for testing purposes, as I didn’t want to click the bluetility button of the BP to manually spawn things while filming.
It doesn’t need to be an actor variable either, be creative. It can be pretty much anything from an array of soft references to an array of classes, to (as I was using it), a reference to an existing level item.