Loading Screen System (Level Transitions w/ Progress)

Unreal will only ever honor one step of sublevels, meaning if a sublevel has its own set of sublevels, those will be ignored.
You would want to add the sublevels to the top persistent level as well.

Let’s say, your current setup so far is this (the forum refuses to show me your screenshots, so I’ll be using generic names):

*P_Level00_Map (persistent)

  • S_Level01_Map (sublevel)
  • S_Level02_Map (sublevel)*

If you wanted to move that to a new persistent level, you would have to do it this way:

*P_NewLevel00_Map (persistent, containing BP_LSS_Actor)

  • P_Level00_Map (sublevel)
  • S_Level01_Map (sublevel)
  • S_Level02_Map (sublevel)*

Btw, you can easily load​​ multiple levels simultaneously, using the globally accessible “LSS OpenLevels” node (it takes an Array of Name as parameter - you can plug a “make array” node into it). Though, if you wanted to stream the sublevels depending on player position, you would have to adjust that to the new setup (volume triggers would work fine, but streaming volumes could be limited in some cases as they have to be placed in the persistent level).

If your levels (such as “Shooting Gallery” or “Start Game” etc.) don’t rely on different GameModes, the best way to set up the project would be adding these levels to the same persistent level:

*P_NewLevel00_Map (persistent, containing BP_LSS_Actor)

  • P_Level00_Map (sublevel - I’m assuming this to be the NewGame/Continue one)
  • S_Level01_Map (sublevel)
  • S_Level02_Map (sublevel)
  • S_ShootingGallery_Map (sublevel)
  • S_MainMenu_Map (sublevel with portals)
  • S_LoadingScreen_Map (loading screen level with the sequencer animation)*

In this example you would deactivate “Autoplay” on the LSS Actor (otherwise it would load the first level) and from blueprint (e.g. in BeginPlay of the persistent level), run “LSS OpenLevel” with “S_MainMenu_Map” as parameter to load into the menu on startup (you would substitute this of course with the correct name of your sublevel).

Then, in the portals you would set up transitions to the game level (“LSS OpenLevels” as mentioned earlier, with an array of the game scene and its sublevels) and the Shooting Gallery (“LSS OpenLevel” with “S_ShootingGallery_Map” as parameter). Can’t really speak to the “Continue” mechanic, as this depends on how you save and load your game.

Note that the portal blueprint (which is just a simple example) doesn’t support loading of multiple levels, so you would have to override the overlap event and place your custom nodes there (or I could update it with that option and make it available for download).

— Method with common “OpenLevel” node —

Let’s say you wanted to keep all your levels separate and not in one single persistent level as above. This could look similar to this:

Menu level:

P_Persistent03_Map (persistent, containing BP_LSS_Actor)
*- S_LoadingScreen_Map (loading screen level with the sequencer animation)

  • S_MainMenu_Map (sublevel with portals) *

Shooting Gallery Level:

P_Persistent02_Map (persistent, containing BP_LSS_Actor)
*- S_ShootingGallery_Map (sublevel)

  • S_LoadingScreen_Map (loading screen level with the sequencer animation)*

Game Level:

*P_Persistent01_Map (persistent, containing BP_LSS_Actor)

  • S_LoadingScreen_Map (loading screen level with the sequencer animation)
  • P_Level00_Map (sublevel)
  • S_Level01_Map (sublevel)
  • S_Level02_Map (sublevel)*

In the transition (e.g. portals) you would use the common “OpenLevel” node rather than the custom “LSS OpenLevel” ones (the portals are set up to use both methods).

You would lose the persistence between the levels (e.g. you would have to unload the game level to go into the menu, which wouldn’t be the case with one shared persistent level) and the loading screen level would need to be loaded on each transition, but each of the levels could have its own GameMode.

Add this level as a sublevel of the persistent map and enter the level’s name in the LSS Actor’s details.(“Loading Screen Level”).

To keep in mind: by default the loading screen level is set to be kept in memory (you can uncheck “keep loading screen in memory” if you want to unload the loading screen level after the transition). If kept loaded, in your case you might need to make sure the Sequence is reset to play from start on each loading (else it might continue where it left off when the loading screen was closed).

As far as I am aware, “Any Key” is an all-input thing, it does cover mouse clicks and should work with motion controllers (though I have no way of testing).
If it does not however, you can specify any number of individual inputs available in Unreal here anyway.

In this case you would enable “Input Required To Continue On Finish” and set “Input To Continue On Finish” to “Any Key” or any other input option.

— VR —

In the case of VR in general, you would keep “Use Default UI” unchecked to not show a UMG UI and also select the BPC_ScreenFadeComponent (member of the LSS Actor) and enable “Use Camera Manager (Instead of UMG)”.

— Loading Progress —

To show the progress percentage, you can either bind an event through the “LSS Bind To Loading Progress Update” node (your event would get fired on each change to the progress), or call “LSS Get Current Loading Progress” at any time anywhere (e.g. in tick. It returns the last queried progress result).

With this value (range 0 to 100) you then can drive any effect in your loading screen scene, as is shown in the “LoadingScreen_04_ProgressBars_Map” (it uses both UI and 3d elements to show the percentage).

The default UMG UI of course also has its own progress update event, but I’m assuming this is rather of no use in VR.

Thank you very much. If there is anything I can help you with further, go into more detail on any feature or elaborate on a setup, just let me know.
I hope this write up is not too overwhelming, I’m not great at keeping it short.