Create a SCP-087-inspired horror game
This tutorial is intended for Horror Game Kit users.
In this step-by-step tutorial where you'll create a chilling horror game inspired by SCP-087, the infamous endless staircase mystery. Players will explore a dark spiral staircase with only a flashlight and battery, step on blood-stained floors, hear distant cries, and encounter an eerie humanoid face known as SCP-087-1.
New to SCP and SCP-087?
If you're new to SCP, it's a fictional secret organization that contains paranormal and supernatural anomalies. One of the mysterious phenomena is SCP-087: an unlit, infinite staircase filled with strange sounds and a hostile entity. You can learn more on the official SCP Foundation website.
YAHAHA has released a themed game based on SCP-087 built with Horror Game Kit, available on Itch and Steam.
Time to complete
30-40 minutes
What you'll learn
Before getting started
- Basic knowledge of the Studio interface and how to add assets in scenes.
- For beginners, check out Create your first horror game for a quick intro.
Build a spiral staircase
There are two ways to build your staircase:
Method 1: AI-generated scene
-
On Desktop, choose Build Game with AI > Horror game > Indoor Scene.
-
Input prompt:
spiral stairs, 10 floors
, and click Generate. For more instructions, see Generate a horror scene with AI. -
Edit the generated scene by clicking the Edit rooms icon in the Apply a Scene window to enter the Preview Mode.
The floor plan for all floors will be displayed.
-
On each floor, delete extra rooms, windows, or doors so that only the stairwells remain. For more instructions, see Remix for AI-generated indoor scenes.
-
Click Apply All to Scene to apply the changes or exit the Preview Mode and click Apply.
AI generation may limit precise control over the number of flights or steps.
Method 2: Manual build with cubes
To build up spiral staircases in a base template:
-
Create a stairway of exactly 13 steps as described in the story:
- Add a cube to the scene by choosing + Create >3D object > Cube.
- Scale it to
1.2, 0.2, 0.3
. - Right-click the cube and select Array Duplicate to make 13 cubes horizontally.
- Use the Move tool from the Toolbar to move each cube upward to form steps.
- Make the last step longer for a landing platform, for example, scale it to
1.2, 0.2, 1.2
.
-
(Optional) Decorate stairs with handrails, posts, or other assets from Asset Library.
-
Right-click to group all 13 steps, duplicate the group, rotate and stack vertically to form the spiral.
-
Repeat to extend the staircase upward.
Modify your scene
-
Set the spawn point at the highest floor.
-
To quickly change the atmosphere, go to Scene Explorer > Environment, and adjust the environment preset. For example, change it to Horror Silent.
-
Customize stair materials by selecting objects and changing textures in the Appearance component, for example, from wood to concrete.
Add a flashlight and a battery
You can add some lighting props as necessary equipment for players to collect and continue their exploration.
To add a flashlight and a battery to the scene, go to Packages > Horror Game Assets > Assets. Double-click Flashlight and Battery to add them.
AI-generated horror scenes may already include a flashlight and battery bundle.
Decorate floors and walls with blood stains
- Find blood decals in Asset Library and add them to the scene.
- Position and scele decals realistically on floors and walls.
Add crying audio
Play audio on game start
To play audio from game start, go to Game Settings > Audio, and add background music (BGM) in the Environmental Audio section.
You can also add more audio assets from Asset Library or upload your own. To learn more about the audio settings, go to Audio.
Trigger crying sound when descending
In the SCP-087 story, players hear the distant cries after a few flights down the staircase. To trigger the audio when players go down a flight instead of game start:
Create a trigger area
-
Add an empty object by selecting Scene Explorer > + Create > Empty Object.
-
Place it mid-flight and rename.
-
Add a trigger box to the empty object. To visualize the trigger box's boundaries, click the Gizmo icon on the Toolbar.
Add audio with trigger logic
- Add an audio by selecting Scene Explorer > + Create > Audio. It consists of both an audio player component and an event trigger in its Properties window.
- Select a crying audio from Asset Library or uploaded files.
- Set the trigger object to the trigger area created, event to OnTriggerEnter, action to Self and function to Play. This means when players enter the trigger box of the trigger area, the audio will play.
Advanced: Simulate constant distant crying
In the story, although players descend the staircase, the crying remains at a constant distance away—never growing louder or closer—continuing throughout their descent. You can use a Behavior Tree to keep audio positioned 5 meters below the player, making the cry feel perpetually far without getting louder. Attach the audio source to this position and loop it with volume adjustments on trigger enter. To learn more, see Behavior tree.
Set an empty object with behavior tree
-
Add an empty object by going to Scene Explorer > +Create > Empty Object.
-
Add Behavior Tree Component to it by selecting Add Components > Behavior Tree Component. Set the behavior tree name to
empty
. -
Click Edit Behavior Tree to open the Behavior Tree Editor (BTE) and edit the behavior tree logic:
- Click + New Task and add Sequence. This works as a parent task that holds a list of child tasks. Child tasks will be executed from left to right.
- Configure the Sequence task:
- In the Variables tab, create a Vector 3 variable and name it
player pos
. Leave the value0,0,0
. Then add an Object variable and name itplayer
, leave the selector empty. - In the Behavior tab, enable the
RestartWhenComplete
andResetValuesOnRestart
. - Leave all other options at default.
- In the Variables tab, create a Vector 3 variable and name it
- Add and configure the Get Player task.
- Click any blank area on the canvas, click New Task and add Get Player.
- Link Get Player to Sequence.
- In the Properties tab, enter
player
as the Key. - Leave all other settings at default.
- Add and configure the Get Position task.
- Click any blank area on the canvas, click New Task and add Get Position.
- Link Get Position to Sequence.
- In the Properties tab, click the
mapping icon to link Target Game Object to player, and Store Value to player pos.
- Leave all other settings at default.
- Add and configure the Set Position task.
- Click any blank area on the canvas, click New Task and add Set Position.
- Link Set Position to Sequence.
- In the Properties tab, leave Target Game Object empty, and map Position to player pos.
- Leave all other settings at default.
Add a cube with audio trigger as a child object
- Add a cube by going to +Create > 3D Object > Cube and place the cube under the empty object, making the cube its child object.
- Adjust the cube's transform by setting its position to
0,-5,0
, so the cube always stays around 5 meters under the player's position. - Delete the cube's collider.
- Add audio to the cube by choosing Add Components > Audio Player. Then configure the audio player:
- Select an audio clip to play the cry sounds.
- Enable Play On Awake and Loop.
- Set the volume to
0
, because the sound is supposed to be played when triggered, not on game start. - For the 3D sound settings, set Min Distance to
1
and Max Distance to10
.
- Add an event trigger to the cube by clicking Add Event Trigger and configure:
- Select the trigger object, for example, somewhere down a flight.
- Set the trigger event to OnTriggerEvent.
- Set the action object to Self.
- Set the action function to SetVolume, value to
100
, and fade duration and delay both to0
.
Create a jumpscare cutscene
SCP-087-1 is described as a disembodied, eerie face lacking typical facial features such as a mouth or nostrils. It instills fear by staring and can suddenly lunge a short distance forward toward individuals. In this tutorial, let's select a model for SCP-087-1, and use a cutscene's animation track to make the model suddenly move forward toward the player, and then disappear.
- Find a model that represents SCP-087-1 in Asset Library, or upload your own model.
- Place the model outside the playable area, like outside the whole building.
- Add a cutscene from + Create > Cutscene.
- In the Cutscene's Properties window, set the trigger and action:
- Add a trigger box to the cutscene object and ensure the player can enter it.
- In the Event Trigger, enable Trigger Once.
- Set Trigger Object to Self and Event to OnTriggerEnter.
- Set Action Object to Self and Function to Play.
- Click Edit Cutscene to edit the cutscene:
- Click Add track and select Animation track.
- Edit the animation track:
- At frame 0: model appears small and in the air.
- At frame 2: model moves closer and grows larger to simulate a lunge.
- Final frame: model retreats out of sight.
- Press Record again to stop recording. For more about editing cutscene, see Cutscenes.
Add NPC dialogue
When SCP-087-1 disappears, players may want to sputter a few words after the jumpscare. To do so:
-
Add a narrator by going to + Create > Narrator.
-
Position narration at screen bottom with custom text. Note that the title will not show if the narration position is set to Bottom.
-
Configure the event trigger to trigger narration after the cutscene ends.
- Enable Trigger Once.
- Set Trigger Object to Cutscene and Event to CutsceneStopped.
- Set Action Object to Self and Function to ShowNarrator.
Add a scene teleporter at the game end
You can continue building the game by adding more stairs and additional mechanics, such as props like unlocked doors, monsters, more NPC dialogue, and custom events. But how do we end the game?
One way to simulate endless stairs is to set up new scenes with staircases and use a scene teleporter to send players between them. However, for this short demo, you can use a teleporter that sends players back to an earlier flight of stairs, forcing them to repeat sections and continue playing.