Build an Escape Room in Unreal Engine 5

Build a first-person escape room with puzzles, hazards, and Blueprint scripting.

Introduction

30 Second Summary

Escape rooms work because every locked door and hidden clue creates real tension. Building one as a game lets you control every piece of that experience.

In this project, you will build a playable first-person escape room in Unreal Engine 5 using Blueprint visual scripting. You will create puzzles, environmental hazards, and a full win/lose loop without writing a single line of code.

What You'll Build

A complete escape room game using the UE5 First Person template's Survival Horror variant, built entirely with Blueprint visual scripting.

By the end of this project, you'll have:

  • A multi-room level layout with atmospheric lighting, fog, and ambient sound designed using LevelPrototyping geometry.
  • An interaction and puzzle system using trigger volumes, E-key input, a keypad widget, and data log displays.
  • A health system with steam vent hazards that deal continuous damage, plus victory and death conditions with dedicated UI screens.
  • Secret Mission: a countdown timer that gives the player 90 seconds to escape before the facility locks down.

Are there any prerequisites?

This project assumes you have Unreal Engine 5.7.4 installed via the Epic Games Launcher and basic familiarity with the Unreal Editor (viewport navigation and placing actors). If you have never opened Unreal Engine before, complete a quick introductory tutorial first.

Create the Project and Explore the Survival Horror Template

Every escape room needs a foundation. Before you can build puzzles and hazards, you need a project that gives you first-person movement, a flashlight, and a dark atmosphere out of the box.

The Unreal Engine First Person template has a Survival Horror variant that provides exactly this. In this step, you will create the project, explore what the template gives you for free, and set up a blank level for your escape room.

In this step, get ready to:
  • Create a First Person project with the Survival Horror variant.
  • Explore the template's built-in features (flashlight, sprint, automatic doors).
  • Create and configure a new empty level for your escape room.
Create a new First Person project with the Survival Horror variant

The Survival Horror variant adds a dark level with flickering lights, a flashlight for the player, a sprint mechanic with a stamina bar, and automatic doors. This saves you hours of setup work.

  • In the Epic Games Launcher, find the Unreal Engine 5.7.4 tile and click Launch.
  • On the left side of the Project Browser, select the Games category.
  • Select the First Person template from the template list.
  • In the Variants dropdown menu, select Survival Horror.
  • Under Project Defaults, make sure Blueprint is selected as the implementation method.
  • Set the project name to EscapeRoom.
  • Click Create.

The Project Browser window opens automatically after Unreal Engine launches.

What is Blueprint?

Blueprint is Unreal Engine's visual scripting system. Instead of writing C++ code, you connect nodes in a graph to create game logic. It teaches the same programming patterns visually, making it perfect for learning gameplay systems.

The editor opens with a dark level called Lvl_Horror loaded. You should see dim lighting, ramps, platforms, and automatic doors.

Project Browser not appearing?

If the Project Browser does not appear after clicking Launch, make sure no other Unreal Engine instance is already running. Close any existing editor windows and try again.

If the Variants dropdown is missing, confirm you are using Unreal Engine 5.7.4 or later. Variants were introduced in version 5.6.

Help me troubleshoot the Unreal Engine Project Browser not loading correctly.

Tour the template contents

Before building your own level, take a quick look at what the Survival Horror variant provides. Understanding the folder structure helps you reference template assets later.

  • Open the Content Browser panel (docked at the bottom of the editor by default).
  • Browse to Content/Variant_Horror/Blueprints. This folder contains the player character and game mode Blueprints you will use.
  • Check Content/Variant_Horror/Input for the input mappings (sprint, flashlight).
  • Check Content/Variant_Horror/UI for the stamina bar widget.
  • Browse to Content/Characters/Mannequins to see the player mesh and animations.
  • Browse to Content/LevelPrototyping. These are the geometry assets (floor tiles, wall panels) you will use to build your escape room layout.

Why does this folder structure matter?

You will reference assets from these folders throughout the project. The game mode in Content/Variant_Horror/Blueprints controls which character spawns when you press Play.

The Content/LevelPrototyping meshes are your building blocks for level geometry. You will drag these into your level to create walls, floors, and ceilings.

  • Click Play in the Main Toolbar to test the template level.
  • Use the WASD keys to move and the mouse to look around.
  • Hold Shift to sprint. Notice the stamina bar depleting in the top left.
  • Walk towards a door to see it open automatically.
  • Press Esc to stop playing and return to the editor.

You should be able to walk, sprint, see the flashlight illuminating dark corridors, and watch automatic doors open as you approach them.

Create a new level for your escape room

The template level is a demo. You need a fresh, empty level where you will build your own escape room layout from scratch.

  • In the top menu bar, click File.
  • Select New Level.
  • In the dialog that appears, choose Empty Level.

A blank level opens with nothing in it. Now save it to the right location.

  • Press Ctrl+Shift+S to open the Save As dialog.
  • Navigate to the Content folder, then create a new folder called EscapeRoom.
  • Save the level as Lvl_EscapeRoom inside Content/EscapeRoom/.

Next, configure the level to use the Survival Horror game mode so your first-person character spawns correctly.

  • In the top menu bar, click Window.
  • Select World Settings. The World Settings panel opens (typically docked beside the Details panel).
  • In the World Settings panel, find the Game Mode section.
  • Click the GameMode Override dropdown and select the Survival Horror game mode from Content/Variant_Horror/Blueprints.

What is a GameMode Override?

A Game Mode defines the rules for your level: which character the player controls, which HUD appears, and how the game starts. The GameMode Override lets you assign a specific game mode to a single level without changing the project-wide default.

By assigning the Survival Horror game mode, your empty level will spawn the same first-person character with the flashlight and sprint mechanics you tested earlier.

  • Open the Place Actors panel by pressing Shift+1.
  • Search for Player Start and drag it into the viewport.
  • Search for Point Light in the Place Actors panel and drag two instances near the Player Start so you can see when testing.
  • Press Ctrl+S to save the level.

Now test that everything works in your new level.

  • Click Play in the Main Toolbar.
  • Confirm the first-person character spawns at the Player Start location.
  • Test that the flashlight works and sprinting with Shift depletes the stamina bar.
  • Press Esc to stop playing.

Your custom level should load with the Survival Horror character. The flashlight illuminates the space and sprint works with the stamina bar.

Character not spawning or flashlight missing?

If you spawn as a default character without the flashlight, the GameMode Override is not set correctly. Open Window, then select World Settings, and verify the GameMode Override dropdown shows the Survival Horror game mode (not None).

If the level is completely black when you press Play, make sure you placed at least one Point Light and that the Player Start actor is not buried inside the floor.

Help me fix my Survival Horror character not spawning in my custom level.

Your escape room's foundation is in place. Next, you will build out the room structure with atmospheric lighting and fog to create a tense, immersive environment.

Design the Escape Room Layout

Your empty level is ready with the Survival Horror character loaded. Now it is time to build the physical space your player will explore.

A great escape room guides the player through spaces that feel distinct and purposeful. In this step, you will construct a compact multi-room layout using modular geometry, set up moody lighting that makes the flashlight essential, and define clear visual boundaries between each area.

In this step, get ready to:
  • Build a five-room layout using LevelPrototyping meshes.
  • Create dark, atmospheric lighting that forces players to use the flashlight.
  • Place doorframes and a sealed wall that the keypad puzzle will control later.
Build the room structure using LevelPrototyping meshes

The LevelPrototyping folder contains modular floor tiles, wall panels, and ceiling pieces designed for rapid level blockouts. You will snap these together to form your escape room's five connected spaces.

  • Open the Content Browser at the bottom of the editor.
  • Navigate to Content/LevelPrototyping.
  • Before placing any meshes, set your grid snapping to 100 units. Click the grid snapping dropdown in the top toolbar (next to the magnet icon) and select 100.

Why set grid snapping to 100?

Grid snapping forces every mesh to align to a consistent grid when you move it. At 100 units, wall panels and floor tiles line up perfectly without gaps or overlaps. This saves hours of manual alignment.

Now drag static meshes from Content/LevelPrototyping into the viewport to create these five spaces:

  • Build a small starting cell where the player spawns. Use floor tiles for the ground, wall panels for the walls, and ceiling pieces to enclose it. Keep it tight and claustrophobic.
  • Extend a corridor from the cell with two small side alcoves branching off. These alcoves will hold data logs later.
  • At the end of the corridor, build a keypad room. This is where the player enters a code to unlock the next area.
  • Beyond the keypad room, build a narrow hazard corridor. Make it long enough to fit 4-5 steam vents along its length.
  • At the far end, create an exit room. This is the victory area the player reaches after surviving the hazards.

Keep it compact

Your entire escape room should feel like roughly 5 connected rooms. Resist the urge to build too large. A smaller space feels more claustrophobic and is faster to playtest.

  • Move your Player Start actor into the starting cell.
  • Press Play to walk through all rooms in sequence.

Confirm you can walk through every room without clipping through walls. If you pass through any surface, select that mesh and check its collision settings in the Details panel.

Walking through walls?

LevelPrototyping meshes should have collision enabled by default. If you can walk through a mesh, select it, open the Details panel, and search for Collision. Make sure Collision Presets is set to BlockAll.

Also check for small gaps between wall panels where the player could slip through. Zoom in and nudge meshes together using grid snapping.

Help me fix wall collision in my escape room level.

Set up atmospheric lighting

Right now your level is lit by the temporary Point Lights from Step 1. You will replace those with a dark, moody lighting setup that makes the flashlight feel essential.

  • Select all the temporary Point Lights you placed in Step 1 and delete them.
  • In each room, place a new Point Light by right-clicking in the viewport, selecting Place Actors, then Point Light.
  • Select each Point Light and in the Details panel, set Intensity to approximately 2.
  • Set each light's Light Color to either a warm orange or cold blue. Mix colors across rooms for visual variety.

Next, add a minimal ambient fill so the level is not completely pitch black when facing away from Point Lights.

  • Place a Directional Light in the level (right-click the viewport, Place Actors, then Directional Light).
  • In the Details panel, set its Intensity to 0.1. This provides the faintest ambient fill without overpowering the darkness.

Finally, add a Post Process Volume to control the overall feel of the camera.

  • Place a Post Process Volume in the level (right-click the viewport, Place Actors, search for Post Process Volume).
  • In the Details panel, check Infinite Extent (Unbound) so the effect applies to the entire level.
  • Under the Exposure section, set Exposure Compensation to -1.5. This darkens the overall image.
  • Under the Bloom section, set Intensity to 0.3. This adds a soft glow around light sources, making them feel warmer and more cinematic.

What is a Post Process Volume?

A Post Process Volume applies visual effects to the camera after the scene is rendered. Think of it like an Instagram filter for your game. Exposure Compensation controls brightness, and Bloom adds glow to bright pixels.

Setting it to Infinite Extent (Unbound) means the effect applies everywhere in the level, not just inside the volume's physical box.

  • Press Play and walk through the level.

The level should feel dark and atmospheric. The flashlight should be necessary to see details in the rooms. If it still feels too bright, lower the Exposure Compensation further.

Level looks completely black?

Make sure your Point Lights have an intensity of at least 2 and that their Attenuation Radius is large enough to reach the walls. You can also try raising Exposure Compensation slightly (to -1.0) if it is too dark to navigate at all.

Help me balance the lighting in my dark UE5 level.

Add doorframes between rooms

Doorframes give the player a clear sense of transitioning between spaces. One particular doorway will also serve as the sealed entrance the keypad puzzle unlocks.

  • From Content/LevelPrototyping, drag static meshes into the openings between each room to create doorframe shapes.
  • For the entrance into the keypad room from the corridor, leave the opening clear. The player walks in freely to find the keypad.
  • For the passage from the keypad room to the hazard corridor, place a wall mesh that completely blocks the opening. This is your sealed door.
  • Select the sealed wall mesh and give it a clear name in the Details panel (e.g. SealedDoor) so you can easily find it later when connecting it to the keypad Blueprint.

Why a simple wall mesh for the sealed door?

When the player enters the correct code, the keypad Blueprint will hide this wall mesh and disable its collision. The wall simply disappears, revealing the path forward. This is much simpler than animating a sliding door for a permanently-opened scenario.

  • Press Play and walk through the level one more time.

You should see clear visual boundaries between each room. The doorframes break up the monotony of flat walls. The sealed doorway should be obviously blocked, signaling to the player that they need to find another way through.

  • Save your level by pressing Ctrl+S.

Sealed door not blocking the player?

Select the sealed wall mesh and check that Collision Presets is set to BlockAll in the Details panel. If the mesh is too small, scale it up to fully cover the opening with no gaps around the edges.

Help me make my sealed door block the player properly.

Your escape room now has real physical space and atmosphere. The layout tells a story through its structure alone. Next up, you will fill these rooms with interactive objects. The player will discover glowing data logs that reveal clues to a hidden code.

Build the Interaction System and Data Logs

Your level layout is complete. The player can walk through a sequence of rooms, but there's nothing to interact with yet.

In this step, you'll build the escape room's first gameplay system: data logs that reveal clues when the player walks near them. This requires two pieces working together. A Widget Blueprint displays text on screen, and an Actor Blueprint detects the player's presence and triggers that widget.

In this step, get ready to:
  • Create a Widget Blueprint that displays data log text on the player's screen.
  • Create an Actor Blueprint that detects the player and shows or hides the widget.
  • Place three data logs with clues that reveal the keypad code 1414.
Create the data log widget (WBP_DataLogDisplay)

The widget is the visual layer that appears on screen when the player approaches a data log. You'll create it first so the Actor Blueprint can reference it later.

  • In the Content Browser, navigate to Content/EscapeRoom.
  • Right-click and create a new folder called UI.
  • Inside the UI folder, click Add in the Content Browser, then select User Interface > Widget Blueprint.
  • Select User Widget as the parent class.
  • Name it WBP_DataLogDisplay.
  • Double-click WBP_DataLogDisplay to open it in the Widget Blueprint Editor.

Now you'll build the widget's visual layout in the Designer tab.

  • From the Palette panel on the left, drag a Canvas Panel into the Visual Designer window.
  • Drag a Border widget from the Palette into the Canvas Panel in the Hierarchy panel.
  • Select the Border. In the Details panel, set the Brush Color to a dark color (black or near-black) with an Alpha of about 0.7 for semi-transparency.
  • Resize the Border so it covers roughly the lower third of the screen. This gives the data log a cinematic subtitle feel.
  • Drag a Text widget from the Palette into the Border in the Hierarchy.
  • Select the Text widget. In the Details panel under Appearance, set the font size to 24 and the color to white.
  • Set the Text widget's Justification to Center.
  • In the Details panel, check the Is Variable checkbox for the Text widget.
  • Rename the variable to DisplayText in the Details panel's name field at the top.

What is a Widget Blueprint?

A Widget Blueprint is Unreal Engine's way of building UI. It uses UMG (Unreal Motion Graphics), a visual designer where you drag and drop UI elements like text, buttons, and borders.

Marking the Text block as Is Variable exposes it to the Blueprint graph. This lets other Blueprints change the text at runtime, which is exactly what BP_DataLog will do.

The Canvas Panel is the container that holds all other UI elements. The Border provides the dark background, and the Text block inside it shows the actual log content.

  • Click Compile and then Save in the toolbar.

Switch to the Preview in the Designer tab. You should see a dark semi-transparent rectangle with white centered text inside it.

Don't see the Border or Text in Preview?

Make sure both the Border and Text are children of the Canvas Panel in the Hierarchy. Widgets that are not inside a Canvas Panel will not appear in the preview.

If the text is invisible, check that its color is set to white and not the same color as the background.

Help me troubleshoot my WBP_DataLogDisplay widget layout.

Create the data log actor Blueprint (BP_DataLog)

The Actor Blueprint is the physical object the player finds in the world. It combines a visible mesh, a glowing light to attract attention, and a Box Collision that detects when the player walks close enough to read the log.

  • In the Content Browser, navigate to Content/EscapeRoom/Blueprints.
  • Right-click in the folder, select Blueprint Class, then choose Actor as the parent class.
  • Name it BP_DataLog.
  • Double-click BP_DataLog to open it in the Blueprint Editor.

Now add the three components that make up this actor.

  • In the Components panel, click Add and select Static Mesh. This represents the physical data pad the player sees.
  • With the Static Mesh component selected, in the Details panel under Static Mesh, choose a small shape like Cube from the engine's default shapes. Scale it down to roughly 0.1, 0.1, 0.02 so it looks like a thin tablet.
  • Click Add again and select Point Light.
  • Select the Point Light. In the Details panel, set Light Color to green, Intensity to 3, and Attenuation Radius to 100.
  • Click Add one more time and select Box Collision.
  • Select the Box Collision component. In the Details panel, increase its Box Extent values so the collision volume is slightly larger than the mesh. Try 64, 64, 64 to give a comfortable detection radius.

Why a Box Collision and not the mesh itself?

The Box Collision creates an invisible trigger zone separate from the physical mesh. The player does not need to stand directly on the data pad to read it. Instead, just walking within the trigger zone is enough.

The green Point Light acts as a visual beacon in your dark level, drawing the player's eye toward the collectible.

Next, create a variable that lets each data log instance hold different text.

  • Switch to the My Blueprint panel on the left.
  • Under Variables, click the + button to add a new variable.
  • Name it LogMessage and set its type to Text.
  • In the Details panel for this variable, check Instance Editable (the open eye icon). This allows you to set a different message on each data log you place in the level.

What does Instance Editable mean?

Instance Editable exposes the variable in the Details panel of each placed actor. You create one Blueprint class but customize the text per instance. Without this, every data log in the level would show the same message.

Now wire the Event Graph so the widget appears when the player enters the Box Collision and disappears when they leave.

  • Open the Event Graph tab.
  • Right-click in the graph and add an On Component Begin Overlap (Box Collision) event node. This fires when any actor enters the collision volume.
  • Drag off the Other Actor pin and add a Cast To node targeting your Survival Horror player character class (found in Content/Variant_Horror/Blueprints).
  • From the Cast node's success output, add a Create Widget node. In its Class dropdown, select WBP_DataLogDisplay.
  • Drag off the Return Value of Create Widget and promote it to a variable. Name it WidgetRef. This stores the widget reference so you can remove it later.
  • From the Return Value, drag out and add an Add to Viewport node. Connect the execution pin from Set (the variable assignment) to Add to Viewport.
  • Before Add to Viewport, drag off the Return Value and search for the SetText (Text) node.
  • On the SetText node, the Target should be the DisplayText variable from the widget. Drag off the widget Return Value, then search for Get Display Text to access it.
  • Connect the In Text pin of SetText to your LogMessage variable (drag it into the graph from the Variables list).
  • Wire the execution order: Cast success > Create Widget > Set WidgetRef > SetText on DisplayText > Add to Viewport.

Now handle the player leaving the trigger zone.

  • Right-click in the graph and add an On Component End Overlap (Box Collision) event node.
  • Drag your WidgetRef variable into the graph and connect it to a Remove from Parent node.
  • Connect the execution pin from End Overlap to Remove from Parent.

What does this Event Graph do?

When the player overlaps the Box Collision, the graph creates an instance of your WBP_DataLogDisplay widget, sets its text to this specific data log's message, and displays it on screen.

When the player walks away, the End Overlap event fires and removes the widget from the viewport. The result is a proximity-based interaction system with no button press required.

  • Click Compile and Save the Blueprint.

Test the interaction system by placing a single BP_DataLog in your level.

  • Drag BP_DataLog from the Content Browser into Lvl_EscapeRoom.
  • Select it in the level. In the Details panel, find the LogMessage field and type Test message - data log working!.
  • Press Play and walk toward the data log.

You should see the dark overlay appear with your test message displayed in white text. Walk away and the overlay disappears.

Widget not appearing when you walk close?

Check that the Box Collision component has Generate Overlap Events enabled in its Details panel. Without this, the Begin Overlap event never fires.

Verify the Cast To node targets the correct player character class from Content/Variant_Horror/Blueprints. If the cast fails, none of the downstream nodes execute.

Make sure WBP_DataLogDisplay is compiled and saved before testing. An uncompiled widget cannot be instantiated.

Help me debug why my BP_DataLog widget is not showing on screen.

Place three data logs in the level with puzzle clues

Now you'll place multiple BP_DataLog instances around your level, each with a unique clue. Together, the three clues reveal the 4-digit code the player needs for the keypad in the next step.

  • Delete or move the test BP_DataLog instance you placed earlier.
  • Drag a fresh BP_DataLog into the first side alcove (or an early room the player will explore).
  • Select it and set its LogMessage to: Subject 7 transferred on day 14....
  • Drag a second BP_DataLog into the second alcove or a different room.
  • Set its LogMessage to: Access protocol updated: first two digits match the transfer day..
  • Drag a third BP_DataLog into a spot near the keypad room entrance.
  • Set its LogMessage to: Final digits: the subject number doubled..

How do the clues reveal the code?

Log 1 establishes two key numbers: subject 7 and day 14. Log 2 tells the player the first two digits match the transfer day (14). Log 3 says the final digits are the subject number doubled (7 x 2 = 14). The code is 1414.

Spreading clues across different rooms rewards exploration and makes the puzzle feel earned rather than given.

  • Press Play and walk through the entire level, visiting each data log.
  • Confirm that each log displays its unique message and that the text disappears when you walk away.

All three clues should be readable and together point clearly to the code 1414.

All logs showing the same text?

Each placed instance needs its own LogMessage value. Select each BP_DataLog actor individually in the level viewport and check its Details panel. The LogMessage field should show different text for each one.

If the field is not visible in the Details panel, go back to BP_DataLog and confirm that Instance Editable is checked on the LogMessage variable. Recompile the Blueprint after making changes.

Help me fix data logs that are all showing the same message.

Your interaction system is complete. The player can now explore the level, discover glowing data pads, and piece together a code from the clues. Next, you'll build the keypad that accepts that code and opens the sealed door.

Build the Keypad Puzzle

Your data logs are scattered through the level, each holding a piece of the puzzle. Now you need something that uses those clues.

In this step, you will build a fully functional keypad that the player interacts with by pressing E. The keypad accepts digit input, validates the code against the answer hidden in the data logs, and opens the sealed door when the correct code is entered.

In this step, get ready to:
  • Create a keypad widget with digit buttons, a display, and validation logic.
  • Build a keypad actor Blueprint with an E-key interaction trigger.
  • Wire the keypad to the sealed door so entering the correct code opens it.
Create the keypad widget (WBP_Keypad)

The keypad needs a visible display for entered digits, clickable number buttons, and logic to check whether the entered code matches the secret answer. This is a Widget Blueprint that the keypad actor will spawn when the player presses E.

  • In the Content Browser, navigate to Content/EscapeRoom/UI.
  • Right-click in the folder, select User Interface, then Widget Blueprint.
  • Name it WBP_Keypad.
  • Double-click to open it in the UMG Designer.

Now design the keypad layout.

  • Add a Canvas Panel as the root widget (this is usually added by default).
  • Add a Border widget inside the Canvas Panel. Set its Brush Color to a dark semi-transparent color (e.g. black at 0.8 opacity) to serve as the keypad background.
  • Inside the Border, add a Text block at the top. Name it CodeDisplay and check the Is Variable checkbox in the Details panel. Set its default text to an empty string with a large white font.
  • Below the text, add 10 Button widgets arranged in a grid (3 columns, 4 rows). Label them 0 through 9 by placing a Text widget inside each button.
  • Add a Submit button below the number grid.
  • Add a Close button in the top-right corner.

Why this layout?

The player will click digit buttons to build a code, then press Submit to check it. The Close button lets them exit without submitting. The CodeDisplay text block shows what they have typed so far.

Next, wire up the widget's logic in the Event Graph.

  • Switch to the Graph tab of WBP_Keypad.
  • In the My Blueprint panel, create a new String variable called EnteredCode. Leave its default value empty.
  • In the Event Dispatchers section of the My Blueprint panel, click the + button to create a new Event Dispatcher. Name it OnCodeCorrect.
  • For each digit button (0 through 9): select the button, scroll to Events in the Details panel, and click the + next to On Clicked. In the generated event, use an Append node to add that digit's character to EnteredCode, then call SetText on CodeDisplay with the updated EnteredCode value.
  • For the Submit button's On Clicked event: add a Branch node that checks if EnteredCode equals 1414 (use an Equal (String) node). On True, drag OnCodeCorrect from the Event Dispatchers list and select Call to fire the dispatcher. On False, set EnteredCode to an empty string, call SetText on CodeDisplay to clear it, and briefly set the CodeDisplay color to red (then back to white after a short Delay).
  • For the Close button's On Clicked event: call Remove from Parent on Self.

What is an Event Dispatcher?

An Event Dispatcher is a broadcast signal that other Blueprints can listen for. When WBP_Keypad fires OnCodeCorrect, the keypad actor (BP_Keypad) will hear it and respond by opening the sealed door.

This keeps the widget focused on UI logic only. The widget does not need to know anything about doors or level geometry.

  • Click Compile and Save the widget.
  • Use the Preview in the Designer tab to verify: click digit buttons and confirm digits appear in the CodeDisplay text. Click Submit with a wrong code to confirm the display clears.

Buttons not responding in preview?

Make sure each button's On Clicked event is wired to the Append and SetText nodes. If the event was created but has no connections, clicking does nothing.

Also confirm that CodeDisplay has the Is Variable checkbox enabled. Without it, you cannot reference CodeDisplay from the Graph tab.

Why aren't my keypad buttons updating the display text?

Create the keypad actor Blueprint (BP_Keypad)

The widget handles the UI, but you need an actor in the world for the player to approach and interact with. This actor detects when the player is nearby and listens for the E key to open the keypad.

  • In the Content Browser, navigate to Content/EscapeRoom/Blueprints.
  • Right-click, select Blueprint Class, choose Actor as the parent, and name it BP_Keypad.
  • Double-click to open it.

Add the actor's components first.

  • In the Components panel, click Add and add a Static Mesh component. Choose a flat panel shape from LevelPrototyping to represent the keypad on the wall.
  • Add a Box Collision component. Scale it so it extends outward from the keypad mesh to detect the player approaching. In the Details panel, make sure Generate Overlap Events is checked.
  • Add a Point Light component. Set its color to yellow and intensity to 3 to signal that this object is interactable.

Why the Box Collision?

The Box Collision acts as a Trigger Volume. When the player walks into it, the Blueprint knows the player is close enough to interact. When the player walks out, interaction is disabled. Both the Box Collision and the player's collision must have Generate Overlap Events set to true for overlap events to fire.

Now build the interaction logic in the Event Graph.

  • In the My Blueprint panel, create a Boolean variable called bCanInteract. Leave it defaulted to false.
  • Create an Actor variable called SealedDoor. In the Details panel, enable Instance Editable (the eye icon) so you can assign it per instance in the level.
  • In the Components list, right-click the Box Collision and select Add Event, then Add OnComponentBeginOverlap. Wire it to a Set bCanInteract node set to true.
  • Right-click the Box Collision again, select Add Event, then Add OnComponentEndOverlap. Wire it to a Set bCanInteract node set to false.

Next, set up the E key input to spawn the keypad widget.

  • Right-click in the Event Graph, search for E under Input and select the E keyboard event (Pressed).
  • From the Pressed execution pin, add a Branch node. Connect its Condition to bCanInteract.
  • On True: add a Create Widget node. Set its Class to WBP_Keypad. Promote the Return Value to a variable (name it KeypadWidget) so you can reference it later.
  • Connect an Add to Viewport node after Create Widget.
  • Add a Set Input Mode Game and UI node so the player can click the widget buttons while the keypad is open.
  • Add a Set Show Mouse Cursor node set to true on the Player Controller.

What does Set Input Mode Game and UI do?

This node allows the player to click on UI widget elements (like the keypad buttons) while the game is still running in the background. Without it, mouse clicks would be captured by the game viewport and never reach the widget.

Now bind the OnCodeCorrect dispatcher so BP_Keypad responds when the player enters the right code.

  • Drag off the KeypadWidget variable reference. Search for Bind Event to OnCodeCorrect and add it.
  • From the Bind node's red Event pin, select Add Custom Event. Name the custom event OnCodeSuccess.
  • From OnCodeSuccess, add a Remove from Parent node targeting the KeypadWidget variable.
  • Add a Set Input Mode Game Only node.
  • Add a Set Show Mouse Cursor node set to false.
  • Finally, add a call to a custom event named OpenSealedDoor (you will create this next).

Create the OpenSealedDoor custom event to remove the sealed door from the world.

  • Right-click in the Event Graph and select Add Custom Event. Name it OpenSealedDoor.
  • Drag the SealedDoor variable into the graph.
  • From SealedDoor, call Set Actor Hidden In Game and set New Hidden to true.
  • From SealedDoor, call Set Actor Enable Collision and set New Actor Enable Collision to false.
  • Click Compile and Save.

Why hide and disable collision instead of destroying?

Hiding the actor makes it invisible and disabling collision lets the player walk through. This is simpler than animating a door open and achieves a clean "door disappears" effect for a permanently unlocked passage.

Bind Event to OnCodeCorrect not appearing?

Make sure you compiled and saved WBP_Keypad before opening BP_Keypad's graph. The Event Dispatcher must be compiled in the widget before other Blueprints can see it.

If you still cannot find it, drag off the KeypadWidget pin and type OnCodeCorrect in the search box. The Bind node should appear in the results.

Help me wire BP_Keypad to respond to the OnCodeCorrect Event Dispatcher from WBP_Keypad.

Wire up the sealed door

The Blueprint logic is complete. Now you need to place BP_Keypad in the level and connect it to the sealed door mesh.

  • In the Content Browser, drag BP_Keypad into the level viewport near the sealed door wall mesh.
  • Position it on (or next to) the wall so the player can see the yellow light and approach it naturally.
  • With BP_Keypad selected in the level, look at the Details panel on the right.
  • Find the Sealed Door variable (under the Default section). Click the dropdown and select the sealed wall mesh actor from the level.
  • Press Play to test the full puzzle loop.

Walk to the data logs and read the clues. Then approach the keypad, press E, enter 1414, and click Submit. The sealed door should disappear, revealing the corridor beyond.

Door not disappearing after entering the code?

Verify that the SealedDoor variable on your BP_Keypad instance is assigned. Select BP_Keypad in the level and check the Details panel. If the field shows None, click the dropdown and pick the wall mesh actor.

Also confirm that the sealed door is a separate actor in the level (not merged with other geometry). Set Actor Hidden In Game only works on standalone actors, not sub-components of another actor.

Help me debug why my sealed door is not disappearing when the keypad code is correct.

Your puzzle is locked in. The player now has a reason to explore, a reward for paying attention to the data logs, and a satisfying unlock moment. Next up, you will add real stakes by building steam vents that damage the player as they navigate the corridor beyond the door.

Create the Hazard Gauntlet and Health System

Your keypad puzzle works. The player can find clues, enter the code, and watch the sealed door vanish. But there are no real consequences yet.

In this step, you will add stakes to the escape room by building a health system and a corridor of steam vents that damage the player on contact. This transforms the experience from a puzzle walkthrough into an actual survival challenge.

In this step, get ready to:
  • Add health tracking and a HUD health bar to the player character.
  • Create a Steam Vent Blueprint that deals continuous damage.
  • Build the hazard corridor with multiple vent instances.
Add a health variable and HUD to the player character

Every survival game needs a way to track how much punishment the player can take. You will add two Float variables to the existing Survival Horror character Blueprint and wire up the built-in damage event system.

  • In the Content Browser, navigate to Content/Variant_Horror/Blueprints.
  • Double-click the Survival Horror player character Blueprint to open it in the Blueprint Editor.

Why modify the template character?

The Survival Horror variant already provides the flashlight, sprint, and stamina systems on this character. Adding health here means all those existing mechanics stay intact while you layer damage on top.

  • In the My Blueprint panel on the left, click the + button next to Variables to add a new variable.
  • Name it CurrentHealth, set its type to Float, and set the Default Value to 100.
  • Create a second Float variable called MaxHealth with a default value of 100.

What do these variables do?

CurrentHealth tracks how much health the player has right now. MaxHealth sets the ceiling so the health bar knows what 100% looks like.

Now you need a HUD widget to display the player's health. You will create a simple widget with a Progress Bar, then spawn it when the game starts.

  • Switch to the Content Browser and navigate to Content/EscapeRoom/UI.
  • Right-click in the folder, select User Interface, then Widget Blueprint.
  • Name it WBP_HUD and double-click to open it.
  • In the Designer tab, drag a Canvas Panel onto the root.
  • Drag a Progress Bar into the Canvas Panel.
  • In the Details panel, rename the Progress Bar to HealthBar and check the Is Variable checkbox.
  • Position the bar in the top-left area of the canvas. Set its width to around 200 and height to 20.

The bar needs to reflect the player's current health. You will bind its Percent property to a function that reads from the character.

  • Select the HealthBar Progress Bar in the Designer.
  • In the Details panel, find the Percent property and click Bind, then Create Binding.
  • In the new binding function graph, add a Get Player Character node.
  • Drag from its output and add a Cast To node targeting the Survival Horror character class.
  • From the cast output, drag to get CurrentHealth and MaxHealth.
  • Add a Divide (float) node: wire CurrentHealth into the top and MaxHealth into the bottom.
  • Connect the Divide result to the function's Return Value pin.
  • Click Compile and Save the widget.

What does this binding do?

Every frame, the Progress Bar calls this function. It divides the player's current health by the maximum to get a 0-to-1 ratio. At full health (100/100), the bar is full. At half health (50/100), the bar is at 50%.

Next, return to the player character Blueprint to spawn this widget and wire up the damage logic.

  • Switch back to the Survival Horror player character Blueprint.
  • In the Event Graph, find the Event BeginPlay node.
  • Drag from its execution pin and add a Create Widget node. Set the Class to WBP_HUD.
  • Drag from the Create Widget output execution pin and add an Add to Viewport node. Wire the widget's Return Value to the Target pin.
  • Right-click the Return Value pin and select Promote to Variable to store the widget reference for later.

What does Event BeginPlay do here?

Event BeginPlay fires once when the game starts. The Create Widget node creates your HUD widget and Add to Viewport draws it on screen. Storing the reference lets you remove or update it later if needed.

Now add the damage-handling logic so the character reacts when it receives damage.

  • Right-click in an empty area of the Event Graph and search for Event Any Damage. Add it.
  • From the Damage output pin (Float), drag and add a Subtract node.
  • Get CurrentHealth and wire it into the top input of the Subtract node. Wire the Damage pin into the bottom input.
  • Add a Clamp (float) node after the Subtract. Set the Min to 0 and wire MaxHealth to the Max pin.
  • Wire the Clamp output to a Set CurrentHealth node to update the variable.
  • After Set CurrentHealth, add a Branch node.
  • For the condition, check if CurrentHealth is less than or equal to 0 using a <= comparison node.
  • On the True branch, add an Open Level (by Name) node. Set the level name to Lvl_EscapeRoom so the game reloads on death.
  • Click Compile and Save the character Blueprint.

What is Event Any Damage?

Event Any Damage is a built-in Blueprint event that fires whenever general damage is dealt to the actor. It outputs the Damage amount as a Float, the Damage Type, the Instigated By Controller, and the Damage Causer Actor.

By using this event, any Blueprint in your project can deal damage to the player using the built-in Apply Damage function node. The character automatically responds.

  • Press Play to test. You should see the health bar at the top of the screen.
  • The bar should be full. The health system is ready for incoming damage.

Health bar not showing?

Make sure WBP_HUD is set as the Class on the Create Widget node. Confirm that the Add to Viewport node is connected after Create Widget.

If the binding shows errors, ensure you compiled both the character Blueprint and the widget Blueprint.

help me debug my health bar widget not showing up on screen

Create the Steam Vent Blueprint (BP_SteamVent)

Steam vents are the environmental hazard that makes the corridor dangerous. Each vent deals continuous damage while the player stands in its danger zone. You will create this as a reusable Actor Blueprint.

  • In the Content Browser, navigate to Content/EscapeRoom/Blueprints.
  • Right-click, select Blueprint Class, choose Actor as the parent, and name it BP_SteamVent.
  • Double-click to open it in the Blueprint Editor.

Add the components that make up the vent's physical presence and danger zone.

  • In the Components panel, click Add and add a Static Mesh component. Choose a cylinder or pipe shape from LevelPrototyping to represent the vent.
  • Add a Box Collision component. Scale it to cover the area in front of the vent where steam would blast. This is the danger zone.
  • Optionally, add a Niagara Particle System component for a visual steam effect. You can skip this if you prefer a simpler setup.

Why use a Box Collision?

The Box Collision defines an invisible zone. When the player overlaps it, the Blueprint detects the collision and starts dealing damage. You can resize it independently of the vent mesh to fine-tune the danger area.

Now build the Event Graph logic that deals damage over time using a looping timer.

  • Switch to the Event Graph tab.
  • Select the Box Collision in the Components panel. In the Details panel, scroll to Events and click the + next to On Component Begin Overlap.
  • From the Other Actor pin, add a Cast To node targeting the Survival Horror player character class.
  • From the cast's execution output, add a Set Timer by Function Name node.
  • Set the Function Name to the name of a Custom Event you will create next.
  • Set Time to 0.5 and check the Looping checkbox.
  • Right-click the Return Value (Timer Handle) pin and select Promote to Variable. Name it DamageTimerHandle.

What does Set Timer by Function Name do?

This node repeatedly calls a named function at the interval you specify. With Time set to 0.5 and Looping enabled, it calls your damage function every half second while the player remains inside the Box Collision.

Storing the Timer Handle lets you stop the timer later when the player exits.

  • Right-click in an empty area and select Add Custom Event. Name it DealDamage.
  • From the DealDamage event, add an Apply Damage node (search for it in the context menu).
  • For the Damaged Actor pin, add a Get Player Character node and wire it in.
  • Set the Base Damage to 10.
  • Go back to your Set Timer by Function Name node and type DealDamage into the Function Name field (it must match exactly).

Now handle the player exiting the danger zone.

  • Select the Box Collision again. In Details, click the + next to On Component End Overlap.
  • From the End Overlap execution pin, add a Clear and Invalidate Timer by Handle node.
  • Wire your DamageTimerHandle variable into the Handle pin.
  • Click Compile and Save the Blueprint.

What does Clear and Invalidate Timer by Handle do?

This node stops the looping timer immediately. Without it, the DealDamage event would keep firing even after the player walks away from the vent.

  • Drag BP_SteamVent from the Content Browser into your level near the player start for a quick test.
  • Press Play and walk into the Box Collision area.
  • Watch the health bar decrease. Walk out of the zone and confirm the damage stops.

Health not decreasing?

Confirm the Custom Event name DealDamage in the Set Timer by Function Name node matches the Custom Event exactly (case-sensitive).

Make sure the Box Collision has Generate Overlap Events enabled in its collision settings. Also verify the player character's capsule has overlap responses enabled for the collision channel used.

help me debug my BP_SteamVent not dealing damage to the player

Build the hazard corridor

One steam vent is a hazard. A corridor full of them is a gauntlet. The goal is to make the player time their movements and use sprint to survive.

  • Remove the test BP_SteamVent from near the player start if you placed one for testing.
  • In the level viewport, navigate to the hazard corridor (the space between the keypad room and the exit room).
  • Drag 4 to 5 instances of BP_SteamVent from the Content Browser into the corridor.
  • Stagger them along the corridor. Alternate sides (left wall, right wall) so the player cannot just run straight through without taking damage.
  • Leave gaps between vents that are large enough to pause in. The player should be able to sprint through a gap to catch their breath.

Add visual cues so the player can read the danger before stepping into it.

  • For each BP_SteamVent instance, add a Point Light nearby with a red or orange color. Set intensity to around 3 and radius to 150.
  • Keep the corridor narrow so the vents feel threatening. The player should not be able to easily avoid them by hugging a far wall.

Balance through playtesting

A good target is that the player can survive the corridor if they sprint strategically. Continuous exposure to all vents should kill them. Adjust the spacing, Box Collision sizes, or damage amount if needed.

  • Press Play and attempt to run through the hazard corridor from the keypad room side.
  • Confirm that standing still in a vent zone drains health rapidly. Sprinting through gaps should let you survive with some health remaining.
  • Adjust vent placement or the Base Damage value (currently 10 per 0.5 seconds) if the difficulty feels unfair or too easy.

Player dies too quickly or not quickly enough?

If the player dies instantly, reduce the Base Damage in BP_SteamVent from 10 to 5. Alternatively, increase the gap between vents.

If the corridor is too easy, add a fifth vent or increase damage to 15. Make sure the Box Collision zones overlap the walkable path.

help me balance my steam vent damage so the corridor is challenging but survivable

Your escape room now has real consequences. The player takes damage from environmental hazards and dies if they are careless. Next up, you will add the victory condition so there is a light at the end of this dangerous tunnel.

Add the Victory Condition and Polish

Your escape room has working puzzles, a health system, and steam vents that punish careless players. But right now, the player has no reason to survive the hazard corridor because there's nothing waiting at the other end.

In this step, you'll close the gameplay loop by adding a victory screen that rewards the player for escaping. You'll also layer in ambient sound and fog to make the facility feel alive, then playtest the entire experience from start to finish.

In this step, get ready to:
  • Create an exit trigger that detects when the player escapes and displays a victory screen.
  • Add ambient sound and atmospheric fog to every room.
  • Playtest the full escape room loop and tune the difficulty for a fair challenge.
Create the exit trigger (BP_ExitTrigger)

The exit trigger is an invisible volume at the far end of the exit room. When the player walks through it, the game pauses, a victory screen appears, and the player can restart or quit.

  • In the Content Browser, navigate to Content/EscapeRoom/UI.
  • Right-click in the folder, select User Interface, then Widget Blueprint.
  • Name it WBP_Victory.
  • Double-click to open it in the UMG Designer.

Design the victory screen layout:

  • Add a Canvas Panel as the root widget.
  • Add a Text block inside the Canvas Panel. Set its text to YOU ESCAPED! with a large white font, centered both horizontally and vertically.
  • Add a Button widget below the text. Add a child Text block inside it with the label Restart.
  • Add a second Button widget next to it. Add a child Text block inside it with the label Quit.

Now wire up the button logic in the Widget Event Graph:

  • Switch to the Graph tab at the top of the Widget Editor.
  • Select the Restart button in the Designer, then in the Details panel scroll down to Events and click the green + next to On Clicked.
  • From the On Clicked event, add an Open Level node. Set the Level Name to Lvl_EscapeRoom.
  • Select the Quit button and add an On Clicked event for it too.
  • From that On Clicked event, add a Quit Game node.
  • Click Compile and Save.

What does WBP_Victory do?

This widget is the player's reward for completing the escape room. The Restart button reloads the level using Open Level so they can play again. The Quit Game node exits the application entirely.

Now create the trigger actor that shows this widget:

  • In the Content Browser, navigate to Content/EscapeRoom/Blueprints.
  • Right-click and select Blueprint Class, then choose Actor as the parent class.
  • Name it BP_ExitTrigger.
  • Double-click to open it.
  • In the Components panel, click Add and add a Box Collision component.
  • Scale the Box Collision to be large enough to cover the exit room's far wall. You will fine-tune the size after placing it in the level.

Wire up the Event Graph logic:

  • Switch to the Event Graph tab.
  • Add an On Component Begin Overlap node for the Box Collision.
  • Drag from the Other Actor pin and add a Cast To node targeting the Survival Horror player character class.
  • From the Cast success pin, add a Create Widget node. Set the class to WBP_Victory.
  • From Create Widget's Return Value, add an Add to Viewport node.
  • After Add to Viewport, add a Set Input Mode UI Only node. Connect the Player Controller pin to a Get Player Controller node.
  • Add a Set Show Mouse Cursor node. Check the box to set it to true.
  • Finally, add a Set Game Paused node. Check the Paused boolean to true.
  • Click Compile and Save.

Why pause the game on victory?

Set Game Paused freezes all game logic (including the steam vents and player movement) so the player can safely interact with the victory UI. Combined with Set Input Mode UI Only, the mouse cursor becomes free to click the Restart or Quit buttons without any gameplay input interfering.

Place the exit trigger in your level:

  • Return to Lvl_EscapeRoom.
  • Drag BP_ExitTrigger from the Content Browser into the exit room, positioning it so the Box Collision covers the far wall.
  • Use the scale handles to adjust the collision volume so the player cannot bypass it.
  • Press Play and navigate through the full escape room to the exit room.

When you walk into the exit trigger, the game should pause and you should see the YOU ESCAPED! victory screen with working Restart and Quit buttons.

Victory screen not appearing?

Make sure the Box Collision on BP_ExitTrigger has Generate Overlap Events checked in the Details panel. Also confirm your Cast To node targets the correct player character class from the Survival Horror variant.

If the buttons don't respond to clicks, check that Set Input Mode UI Only is connected after Add to Viewport and that Show Mouse Cursor is true.

Still stuck? Help me debug why my BP_ExitTrigger isn't showing the victory widget when I walk into it.

Add ambient sound and final atmosphere touches

A dark room without sound feels like a broken game. Ambient audio and fog transform your blocky prototype into something that feels genuinely unsettling.

  • In the Place Actors panel, search for Ambient Sound.
  • Drag an Ambient Sound actor into the starting cell room.
  • In the Details panel, click the Sound dropdown and select an engine-provided sound such as a low hum or metallic creak.
  • In the Sound's settings, enable Looping so the sound plays continuously.
  • Repeat for each remaining room (corridor, keypad room, hazard corridor, exit room). Use different sounds in different rooms to give each space a distinct feel.

Use attenuation for realism

In the Ambient Sound's Details panel, enable Override Attenuation and set a falloff radius. This makes the sound quieter as the player moves away, creating a more natural spatial effect.

Now add atmospheric fog to the entire level:

  • In the Place Actors panel, search for Exponential Height Fog.
  • Drag it into the level.
  • In the Details panel, set Fog Density to 0.02.
  • Set the Fog Inscattering Color to a cold blue-grey (something like R: 0.1, G: 0.12, B: 0.18).
  • Press Play and walk around. Your flashlight beam should cut through the fog, making it feel like you're in a damp underground facility.

What is Exponential Height Fog?

Exponential Height Fog is a built-in Unreal Engine actor that fills your level with distance-based haze. The density value controls how thick the fog appears globally. A low value like 0.02 creates a subtle mist without hiding your level geometry completely.

Save your level. You should hear ambient loops playing in each room and see a subtle blue-grey haze that makes the flashlight feel essential.

Can't hear the ambient sounds?

Check that Looping is enabled on each Ambient Sound's audio asset. Also confirm the volume multiplier isn't set to 0 in the Details panel.

If you hear sound but it cuts out when you move away, increase the attenuation radius so it covers the entire room.

Need more help? Help me figure out why my Ambient Sound actors aren't playing in my Unreal Engine level.

Playtest the full escape room loop

Every game needs a full end-to-end playtest. This is where you experience the escape room as a player would and identify anything that breaks the flow.

  • Press Play and start from the beginning in the cell room.
  • Walk through the full sequence: explore to find all three data logs, piece together the code 1414, enter it on the keypad, and proceed through the opened door.
  • Navigate the hazard corridor while managing your health. Confirm you can survive by sprinting through gaps between steam vents.
  • Reach the exit room and confirm the victory screen appears.
  • Click Restart on the victory screen to confirm it reloads the level.

If anything feels unfair or too easy, adjust the difficulty:

  • If the hazard corridor is too lethal, reduce BP_SteamVent damage from 10 to 5 per tick, or increase the gaps between vents.
  • If the corridor is too easy, add another BP_SteamVent instance or narrow the corridor.
  • If the player's health feels too low, open the player character Blueprint and increase the CurrentHealth and MaxHealth default values.

What makes a good difficulty balance?

Aim for the full escape room to take about 2-3 minutes of gameplay. The clues in the data logs should be clear enough that a player can deduce the code without external help. The hazard corridor should be survivable on the first attempt if the player sprints strategically.

Once you can complete the full loop from spawn to victory screen in a few minutes, your escape room is done.

Secret mission

Add a Countdown Timer

Your escape room works, but there's no real pressure. The player can take as long as they want. In this secret mission, you'll add a 90-second countdown timer that triggers a facility lockdown if it hits zero. Below 30 seconds, the screen tints red and an alarm blares.

Clean Up Your Resources

Clean Up Your Resources

This project runs entirely locally on your machine. There are no cloud services, paid APIs, or ongoing costs to worry about.

Decide whether to keep your project files, close the editor to free up system resources, or delete everything entirely.

Resources you used:

  • EscapeRoom project folder (all Blueprints, Widget Blueprints, levels, and assets).

Keep everything running

No action needed. Choose this if you plan to keep building on your escape room or want to revisit it later.

  • Your project folder contains everything. Open it anytime from the Epic Games Launcher's Recent Projects section.
  • To share your game with friends, go to File > Package Project > Windows to create a standalone .exe you can distribute.

Pause - I'll come back to this later

Close Unreal Engine to free up RAM and GPU resources. Your project files stay safely on disk.

  • Save all open assets by pressing Ctrl+Shift+S.
  • Close Unreal Engine.
  • When you want to return, open the Epic Games Launcher, find EscapeRoom in Recent Projects, and double-click to reopen.

Delete - I don't want to use this again

Remove the project folder entirely. This cannot be undone.

  • Close Unreal Engine if it is still open.
  • Open File Explorer and navigate to the location where you saved the EscapeRoom project during setup.
  • Right-click the EscapeRoom folder and select Delete.
  • Empty your Recycle Bin to reclaim disk space.

That's a Wrap!

That's a Wrap!

Nice work! You just built a fully playable first-person escape room from scratch in Unreal Engine 5 using nothing but Blueprint visual scripting.

You've learned how to:

  • Designed a multi-room level layout using LevelPrototyping geometry with atmospheric lighting, fog, and ambient sound.
  • Built interactive puzzle systems (data logs and a keypad) using Trigger Volumes, E-key input, and UMG Widgets that validate a code and open a sealed door.
  • Implemented a health system with environmental hazards that deal continuous damage, plus victory and death conditions with dedicated UI screens.
  • Secret Mission: Added a countdown timer with visual urgency effects and a lockdown game-over condition for a tense 90-second escape experience.

Ready to quiz yourself?