Here is a little experiment that seems to solve the problem using only blueprints.
I think it is similar to the abstract factory pattern? I have only read about that but never found a blueprint example so it is theory to me, but I think I’ve got the principle at play here:
First, here is the result:
In order to spawner any amount of actors, the game mode is only referencing this object class that I have called “AbstractSpawner”
In the Game Mode, I create the AbstractSpawner and initialize it.
(I needed to put out a dispatch to announce the creation so that any listeners to the AbstractSpawner can bind to it’s Dispatches at the appropriate time)
In the Abstract Spawner is just a single event which takes a name (or could be enum, or string, or some sort of ID).
It passes that along to a dispatch. In the level there will be a Concrete Spawner that will be listening for this.
The Concrete Spawner has the data base full of soft-references. I’ve used a DummyActor class to test.
First thing in the Concrete Spawner I’ve bound to the GameModes dispatch so that once that AbstractSpawner is constructed, then we can bind to its events.
And finally, here is an example of how spawning and actor from soft reference could be handled:
So, I think this accomplishes the goal of reducing memory usage and tight coupling.
Alternatively, perhaps you might have an AbstractSpawner that is an actor in the level and is mostly empty, same as the object class above, and it uses an interface to pass data onto the ConcreteSpawner, which is just another actor in the level, but it has the data base full of soft references.
This would work the same but probably be fewer nodes overall (for some reason I find event dispatches and binding to be messy and harder to understand)