With level streaming, you have one main level ( called the persistent ) which is usually empty, apart from the things you want in all levels ( lighting, fog etc ).
You then ‘stream’ levels into that persistent level. They just load ‘on top of’ it. You can do this using streaming volumes ( overlap boxes ), or blueprint to control when things happen. Nodes like
What can be a downside with this method, is the level is just added in one place, it’s default world position.
Another way, which I personally find more handy, is loading level instances, with these nodes
The reference they give you can be used to unload
With level instances, you can load them in any transform, and more than once if you want.
You still have a persistent, and you still load into that, but it’s more flexible.
So for your scenario, it would go like this
Open level persistent ( or it’s the default level )
Stream the level with your menu ( or just put the widget on the screen )
While the widget is showing, stream another level in the background
When it’s ready just remove the widget
Boom, done.
Of course, if you stream something while the game is running, the player can just see it happening. How you get around this is up to you, options are portals, loading behind a wall / door etc.
Regarding your game mode, unless I’m mistaken, I don’t think you can change game modes. The persistent holds the game mode, and you’re pretty much stuck with it. Ways to mitigate that usually involve having a more generic GM. For instance, if you want to have different types of players, then don’t put that in the game mode, but control the spawning of the player yourself from a custom controller.