Progression points are blueprint actors. They contain a simple collision box and this small bit of code below. When the player overlaps with the collision box, the progression checks whether the actor it has overlapped is the player or not by checking the tag the actor has. The check goes into a branch which then feeds into a cast to the main character to set the level that the player should load into upon progressing the game at the radio seat.
Initially this also contained code which altered the variables in the plaer that check if the player is within range of the progression point, eventually this was changed and fully removed so I could do all the needed code in the main character blueprint as I did with the speaking box. The variable "NameOfLevelToLoad" is a string with instance editable enabled, this means that I can change what level is sent to the player for every placement of the progression point rather than needing a new blueprint for it. You can tell it's instance editable by the open eye next to the word "string"
On the left you can see the "On Component Begin Overlap" node, this is linked to the capsule that manages the collision for my character. When the player overlaps another actor, the execution line with print what it is in the top left, this is development only and allowed me to see what was overlapped, letting me understand if issues came from the overlap not working or some other cause.
Eventually the branches check if the actor overlapped with has the tag "ProgressionPoint". If this is the case, then the variable "Is at Progression" is set to true and the code checks if the player is ready to progress or not.
If they are, then the player blueprint will create a widget I called "Press Space To Progress". This is then added to the player viewport and another print string checks if the code has reached that point or not. The widget simply creates a popup in the bottom of the screen to let the player know that they can interact with the progression point.
From event begin play, the code gets the current level name using the node on the left, comparing the string with "Game_World" to check if the current level is directly identical to they starting level. This then goes into a branch which if true will start a timeline called "TimeTillProgressionPossible". Upon completion of this 20 second timer, the variable "ReadyToProgress" will become true. This can also be made true through a custom event called "Make Progression Possible", which can be used when the player needs to do certain things before being able to progress the game further. In the game, this is when they have to get the gun before encountering the monster in the third level. The widget of searching for the gun starts the progression possible event and so makes it possible to progress without the timeline being involved.
When the player presses space bar, the code will use 2 branches to check if the player is at a progression point and is ready to progress. This stops the player from progressing before intended or when they aren't at the chair where they're meant to progress.
These branches then lead to removing all of the widgets on screen, this allows the camera fade that follows to not be obstructed by widgets, making the game more graphically enticing and pleasing.
The screen then stays black for a second to make the level transition smoother, this is done by having a timeline with a 2 second timer that when finished will finally load the intended level. The main part to remember is that the level opens in darkness as well as closes in darkness, forming a perfect transition.
I added that the player can't move whilst the camera fade is happening, this means that the player can't walk into interactivity and use doors, also meaning that the screen stays without any UI at all. This keeps the transition to the next level graphically clean and unobstructed, improving the user experience.
(One is shown at 2:18)