This seems to work best for my situation:
- Create C++ base game instance with BlueprintImplementableEvent that gets called PreLoadMap and PostLoadMap
- In Blueprints PreLoadMap creates UMG loading widget and adds to viewport.
- In Blueprints PostLoadMap loading widget is added to viewport again. (needs to be added again as this is now the default playercontroller created on joining a session)
- UMG added to viewport during PostLoadMap will now persist until I decide to close it, or fade out.
I wanted a more global solution, not something per level, so I did not try and handle any of this on the LevelBlueprint.
I am sure streaming would work for this, but I think streaming will serve other purposes for me and I like the separation of certain items in their own persistent map.
@Rhynedahll I think a solution like this would also resolve your issue. Or as eXi said BeginPlay of the LevelBlueprint could work too, but I never tried that. The PlayerController also has a ReceivedPlayer event that appears to get called very early, that might be something to look into too.