UNTITLED HORROR PROJECT
Postponed 2023
This project is a game that I put a lot of time and effort into in the Spring of 2023. The game does have a name but because I have not gone public with it on the STEAM page, I will just keep it as untitled as I showoff it’s features. Unfortunately, I had to postpone working on the project due to a sick member in my family in the latter half of 2023. Everything that is to be shown is about 6 months of work and was intended on being finished before 2024 or Q1 of 2024.
This project uses no blueprint templates or frameworks off the unreal marketplace. 100 percent of the code / design is original and made by me. All features shown are still a work in progress and is more of a proof of concept.
ABOUT THE GAME
In this game you assume the role of an intrepid urban explorer, whose insatiable curiosity leads you into destinations forgotten by time. Soon you discover the haunting mysteries you uncover are not left behind in the places you explore – they follow you home. The idea here is that in your home you experience paranormal activity that progressively gets worse as days go by. To relieve yourself of these events you must re-watch the videos you recorded from your explorations of desolate urban locations in search of clues to what or who could be haunting you at home. This is a “Found Footage / Lost Tapes” style of game. However, instead of VHS tapes, you have everything backed up onto USB drives. Each drive contains a video, pictures, notes, and a “wiki” of the place that was explored. When the video from the USB drive is played you seamlessly get brought back into time to play the character in the video and explore the location. There are 5 destinations planned: each with its own story to be discovered.
FEATURES SHOWCASE
ADVANCED COMPUTER SYSTEM
Since the computer is a core part of the game-loop, I wanted to make it as realistic as possible. The widgets are all rendered in world space and each window is fully modular and customizable. The windows can be moved around, resized, minimized, and maximized. These window states are also saved when the game is saved. When a window is created a copy of its icon is displayed in the task bar and can be minimized or maximized with these buttons. When a USB stick is used on the computer tower a popup happens notifying that a new device is detected (see screenshot 1). It also pops up the “MY PC” window where you can see the new drive, along with its storage space. The USB window is what contains all the information given to the player for that specific explored location. When a picture is opened, it opens a “Picture Viewer” where you can cycle through the existing images on the drive. Everything in the system is completely modular, so the creation of new windows and content can be added with ease.
One of the features that stand out on the computer is the Security cameras that are around the house. These are physical cameras you can see within the house and the image is rendered to the computer widget using Render Target 2D & Dynamic Material Instances. This system is very optimized as it is only active when the “Security” window is open on the computer and that specific camera is active. Each camera has a togglable option for a greyscaled night vision. The night vision effect is 100% done in a Post-Process Material. Most games fake night vision with an actual dynamic light and change the post processing light to green or grey. But because the player is not the one directly seeing the night vision, this was not an option, as they would see the lights toggling on and off in real-time. To accomplish this, I used a combination of Diffuse Color, Ambient Occlusion, World Normal, and most importantly, Scene Depth in my Post-Process Material. The noise is and artifacts in the video feed is also done within the same material.
As mentioned before, I really wanted to make the computer feel immersive. The mouse cursor you see is an actual cursor rendered and moved around in the widget space. Normally games would just “Show Mouse Cursor” and the cursor would be on top of any widget you would want to interact with. Because the cursor is an actual widget image that is moving around, the computer feels and looks more like a computer. The computer is also fully functional with a gamepad – The joysticks will move the cursor around the screen.
PHYSICS-BASED DOORS / DRAWERS
To continue my theme of developing an immersive horror game I decided to go with physics-based doors and drawers. Inspired by Amnesia, the doors and drawers open by holding left mouse button (right trigger on gamepad) and moving the mouse down or up. Depending the distance and speed the mouse is moved, depends on the force the door or drawer will open / close. The weight of doors also contribute to how fast a door can be open and closed.
A unique feature I added was how sound from the doors and drawers are played. In most games when a door is opened it just plays the sound its assigned and that is all. I used UE5’s new Metasounds to dynamically play a door or drawer being open and closed. A sound is assigned to the door, and the sound is played based on the door’s angle. So, if you slowly open a door just a little, a creak will play up to the duration calculated by the current angle. This allows a more immersive dynamic to the sound of doors and drawers being open and closed. A close sound is also played when one of these objects are closed. However, depending on the force you use to close the object, the sound is louder or quieter.
FULLY CUSTOMIZED INVENTORY SYSTEM
The inventory system I designed was inspired mostly by the horror game called “Visage”. The system contains two slots that can equip useable items in the left and right hand simultaneously, with 6 slots of storage. Because this project has controller support, the inventory can be navigated and used with a controller. Each equip able item is a child class of a master equip able class. These classes contain exposed variables that make adding and editing new ones extremely easy. Some core variables would be the text that shows a description of the item, a texture to show the image of the item, and the item’s transform in the hand when equipped. The Inventory Widget also has an animation where it slides in from the right when shown and slides back out when hidden.
OBJECT INSPECTION
Inspecting objects is a staple to most horror & puzzle games. I’ve seen numerous ways to implement this system, but I decided to go with a more traditional approach with the system. All objects that can be interacted with are children of that class. From there, there are multiple children classes depending on their functionality needs. Inspecting classes include objects that are equip able, transcript reading, or just plain inspect and put back down. When an object is inspected, it is brought to a scene component that is attached to the player character. This scene component is positioned in front of the player but can be positioned anywhere. There is a custom Depth of Field system that I made that is also enabled to focus on the object and blur the background.
The animation is driven by a timeline with a float value output that is used to drive the animation. To get the inspection animation I lerp the object’s original location with the scene component that’s attached to the player character with the timeline’s update function and the float to determine the speed as the Alpha. To make sure the object faces the player on inspect, I Lerp the objects original rotation with the “Find Look at Rotation” of scene component as the “Start” and the world location of the object as the “Target” and use the same float from the timeline as the Alpha. Once I have the Location and Rotation variables, I just feed them into a Set World Location and Rotation node with the target being the inspected object
PLAYER FLASHLIGHT
As you play through the different recorded footages, it would be a little bland if each experience felt exactly like the last. Each footage you play through takes place in a different time from the last. Days, months, even years. To make this apparent each player character is different from each other. From the way the player character moves, to the light they carry. I have two styles of lights that the characters use while venturing through forgotten places. The first light is attached to the player’s “camcorder” and follows the camera without any delay. This light is also a bluish tint and has a wider cone to help bring out the fisheye lens effect. The second is a white light that acts as a lead for the camera. When the player turns their camera, the light moves first, and the camera soon follows. This is to bring the illusion that the character is holding the camcorder in one hand and a flashlight in the other.
CAMERA MOVEMENT & POST PROCESSING
Getting a realistic camera bob without it being too disorienting can be very challenging. Because the game is based on watching recorded footage, I tried to find a happy medium on player movement and animations. Along with camera bobbing and player movement, I needed to develop the right post processing for a “fisheye” lens and VHS styled effects.
Player movement is mostly driven by a custom animation blueprint with the default unreal engine skeleton mesh. The camera is attached to the head and the entire body is hidden in-game. Head bobbing is created by an anim notify on each step the foot takes. On notify I have a line trace that points downward and returns the physical material which is used for the different footstep sound effects. Also, with each footstep I play a custom camera shake with its intensity driven by how fast the player is moving and if they are crouched or not. Camera shakes are also different for the left and right foot being planted.
The fish lens effect contains two custom post processing materials that are layered together. The fisheye post processing material primarily uses ScreenPosition, RadialGradientExponential, and PostProcessInput0 nodes, with constant variables to control the intensity of the lens distortion. The vignette post processing material gives it that old school camera looks and also dynamically bounces based on the player’s movement. To top it off I use a dirt mask to help define the depth of the camera lens and when playing through the footage scenarios the camera is changed to a 4:3 aspect ratio to bring out the old-style video format.
CAMCORDER ZOOM
The zoom feature that the player has when playing through a scenario level is mimicked from a real digital video recorder that I have from the 1990s. The annoying idle sound that is in the clips are directly from the playback of that camera. The zoom in, out and stop sounds are also all directly recorded from the playback of that camera. I again use UE5’s new metasounds to piece the sounds and animations of the zoom together.
LEVEL STREAMING FOR SEAMLESS TRANSITIONS
Loading a level and have the game freeze is just something that will always break immersion. I decided early on to use Unreal Engine’s Level Streaming to seamlessly skip around between levels. The house is the main level which is always persistent. Each urban location from the USB drives is their own level but is loaded in and out as needed through level streaming. When a player starts to watch a video on the USB drive, the level is loaded in, and the unique character is spawned in on that level and then possessed by the player controller. When the level is no longer needed, I just simply unload the level and destroy the spawned character. When done right with some transition post processing effects, the player should feel like they have jumped back in time and relive the recorded footage.
A feature I added that may or may not make the cut is the ability to “pause” the video and return to that video in the exact position the player left off at. When the player pauses the video, they are returned to the computer, and the window displays an image of the last frame they see. The player is free to roam around the house and if they press play again on the video the player will resume exactly where they left off when watching the video. The transitions are still a work in progress, but I think this could be a unique immersive experience.
TECHNICAL OVERVIEW & DEVELOPMENT FACTS
- 100% done in Blueprints
- Easy-Multi-Save for saving and loading game states
- Controller support with UI changes when a controller is used
- Multi slot saving
- Animation blueprints for part of player movement
- Fully functional advanced computer system which is modular for the ease of expansion
- Security camera system with the use of Render Target 2D to the computer
- True night vision post processing that uses SceneDepth
- Level streaming to load and unload levels as needed and for immersion
- Dynamic custom weather system
- Fully dynamic lighting with Global Illumination support (Lumen)
- Custom Inventory system
- Custom Inspection system
- Uses of sound occlusion and attenuation for immersion
- Dynamic footsteps with Physical Materials
- Sounds consists of Sound Cues and Metasounds
- Dynamic sounds of opening and closing doors / drawers
- Settings UI that updates and saves user controls, audio, and video settings in real time
- Localization supported (currently only Spanish is in)