JaniTerror
A first-person horror prototype built from a blank UE5.2 project: you are a janitor cleaning a building that is not safe, across fourteen level-designed rooms.
- Type
- Group Assignment
- Module
- Collaborative Enterprise Foundation
- Engine
- Unreal Engine 5.2
- Year
- 2024
- Team
- 9 People
- Team Roles
- 2 artists · 3 modellers · 4 programmers
- Version Control
- OneDrive
What is JaniTerror?
JaniTerror is a prototype of a first-person horror game built from a blank Unreal Engine 5.2 project - no framework, no starter content - as a collaborative group assignment at Staffordshire University (Collaborative Enterprise Foundation, Level 3 Foundation Year). The concept: you are a janitor. The building you are cleaning is not safe, as there is a horrifying being around you.
The team of nine - three artists, two 3D modellers, and four programmers - designed and built the entire game from scratch across the semester. No version control was used, and relied entirely on OneDrive to share project around. Many programmers were off throughout the development, and lack of progress were made, so me and my peer took in charge to sort a lot of stuff with the project.
// CCTV surveillance room
The building is a large single-floor structure with distinct zones: a glass-walled corporate office wing, a cinema lounge, a photography studio, a sci-fi corridor with a flooded floor, a loading dock, basement mechanical rooms, a dark red-lit surveillance corridor, and a science lab. Each area has its own lighting mood and level-designed atmosphere, all produced under a cohesive industrial-horror art direction.
// Glass-walled meeting rooms
What I Built / Worked On
Within the nine-person team, contributions were divided across programming, art, and level design. My focus was primarily programming and level design:
Pressure Plates
Blueprint event dispatchers wired to connected actors (doors, hazards). Stepping a plate fires an event broadcast picked up by any subscribed listener in the level, keeping the architecture decoupled across programmer workstreams. Later this was re-used to activate 3D printers.
Torch Durability System
A UMG Widget displaying a dynamic duration bar that drains in real time. Implemented the Blueprint logic for depletion rate, UI binding, and low-battery visual feedback.
Battery Resource Management
Pickup Actor using a Blueprint interface to communicate with the HUD. On collection, the battery restores torch duration and updates the widget - no direct actor-to-widget references needed.
Camera Shake
Implemented using UE5's CameraShakeBase class, triggered on pressure plate activation to give physical feedback when the player
steps on a plate.
Conveyor Belt
Blueprint physics material with a velocity override applied to the surface. The player's character moves with the belt direction while standing on it.
Random Gas Canister Placement
A spawn volume with weighted RNG selects positions at runtime, placing gas canisters in varied locations each session for replayability.
Level Design
Responsible for layout passes, lighting mood passes, and prop placement across multiple building sections, including the sci-fi corridor, basement, and exterior corridor zones.
Bug Fixing
Resolved cross-programmer integration issues arising from merging Blueprint and Level workstreams across nine contributors - the primary challenge of the project.
Rooms & Environments
The building is divided into fourteen distinct rooms and zones, each with individual lighting mood and props. Art direction was inspired by a mix of industrial horror, corporate unease, and sci-fi corridors:
Sci-Fi Corridor
White stripe emissive columns, a flooded reflective floor, sci-fi cargo crates. Stark contrast to the corporate floors above.
Loading Dock
EXIT sign, forklift, open cardboard crates, safety equipment. Industrial logistics area.
Dark Transition Corridor
Red alarm light, surveillance monitor showing live NYC cam footage. Connecting zone used to build tension between areas.
Science / Lab Area
Teal floor, crash mats, 3D printers, green lockers. Early build — signals the game's tonal shift into more surreal territory.
Gaming / Dev Room
Blue-lit gaming PC, BSOD on dual monitors, neon gaming chair. References the Windows Update material from the in-world monitors.
Developer Office
BSOD workstation monitors, a whiteboard with bug notes and task lists, fire extinguisher cabinet. A self-aware detail baked into level design.
Systems & Architecture
Built entirely with Blueprint for rapid actor logic and gameplay systems. No C++ was used as at this stage, we have not learned about Unreal Engine C++. The team used OneDrive for "version control", which was critical given the nine-person contributor count and the risk of Blueprint asset conflicts.
The Windows Update in-world monitor material was driven by a Blueprint-managed media texture, rendering a live updating BSOD-style screen on a static mesh monitor prop in the world — the same technique used across the dev office and gaming PC room props.
The level blockout was produced using cyan collision volumes visible in UE5's editor - a standard BSP-first layout workflow used to validate room flow and scale before committing to final mesh placement.
// Level blockout — cyan collision volumes
Group Work at Scale
The hardest part of JaniTerror was not the technical implementation - it was integration. With nine contributors each building Blueprint systems on their own branches, merging into a single working build repeatedly surfaced conflicts: interface mismatches, timing issues between event dispatchers, and component reference errors across actor classes.
The torch durability system had a specific bug that took disproportionate time: the UI widget would not correctly bind to the Blueprint property
when the torch actor was possessed mid-level, because the widget was constructed before the actor reference was set. Understanding the UE5
construction script order — and when to use BeginPlay vs. Construct — resolved it.
The conveyor belt also had a non-obvious edge case: if the player jumped onto the belt at speed, the physics material velocity addition compounded with the character's own velocity. A velocity clamping check was added to the Tick function to prevent unintended acceleration.





