During my master's program in AI Engineering (Game) at FH Technikum Wien, a complete action-horror shooter was created over the course of two semesters, which was officially awarded best games project of the year by faculty members and industry representatives at a showcase event.
Here, at the edge of the universe, I understand. Even death offers me no way out of this steel prison." – In the horror shooter "Humans Never Change", players wake up aboard the leaderless spaceship "Amber Hawk" and must find a way to regain their freedom. Past alien creatures lurking in the shadows – through a labyrinth of corridors and locked doors – to the root of whatever holds the "Amber Hawk" in its grip.
The project was built using the Unity game engine. Players must find their way through a large, winding space station, avoiding or defeating enemies, in order to reach the final room and defeat the level boss there.
Visually and aesthetically, the game takes its cues from titles of the original PlayStation era. All of the game's assets, with the exception of sound and music, were created as part of the project. A few standout components of the game are described below.
Creep AI
The enemies that chase players through the corridors of the space station are called Creeps. The name comes from their design: they first observe the player, flee when threatened, and then return as a group with reinforcements to hunt down and kill the player.
This behavior was implemented using a behavior tree. Group behavior uses a flocking algorithm, while pathfinding relies on the A* algorithm running on a navigation mesh that is generated when the level loads.
The behavior tree essentially splits into two different behavior patterns, depending on whether a creep is alone or part of a group. Whether this condition applies can change during gameplay. All creeps start out alone and seek out a group in order to defeat the player.
Level Design & Generation
Every junction (rooms where two or more corridors meet) can be locked down. The keycards needed to unlock them are randomly distributed throughout the level. Part of this solution was that only one specific keycard was valid for each door. As a result, an algorithm had to be developed that randomly locks doors in the level, blocks the direct path to the boss room, and places the keycards in such a way that the level always remains solvable. After all, if the keycard for Room A were located in a sector only reachable through Room A, the level would be unsolvable.
For balancing reasons, a mode was ultimately added where any keycard can unlock any locked room. There are also randomly placed items for health, ammunition, and glow sticks, giving players more options and rewarding them for exploring.
Technical Art
A number of particle systems, lighting effects, post-processing, and sound were used to achieve the game's look & feel. The player controller itself caused the most work. After all, this entity is what players will perceive the longest and most intensely while playing the game. This includes feedback when firing weapons, audio feedback after sprinting (breathing sounds), and effects when weapon projectiles hit their target.
Sound and music play an essential role in an action-horror game. For this reason, we decided not to produce these assets ourselves, but instead relied on external work from Sidearm Studios and freesound.org. These are triggered and played either on a timer, through triggers, or when certain conditions in the game state are met. It was very interesting to see how important timing is in this regard. A piece of music can be a great fit for the game, yet completely ruin the mood if it plays at the wrong moment.
Raytracing
The game engine of our choice, Unity, offers an experimental feature set of raytracing functions as well as path tracing in editor version 2020f.3.30f1. Path tracing is a term for a global illumination system that can produce even more realistic lighting than raytracing and is also used in feature animated films. And although, surprisingly, it doesn't require much more performance than raytracing in Unity, it is currently still plagued by pixel noise, lacking the ability to stabilize the image through denoising algorithms. In the end, we settled on Recursive Rendering in Unity, which is made available through raytracing. Rays are sent through the level up to a certain recursion depth, sampling surfaces for reflections to achieve a realistic result for material shading.
Experimental raytracing is provided in the latest versions of Unity's High Definition Rendering Pipeline (HDRP for short). The HDRP is a free plugin for Unity that equips the project with modern rendering techniques and shaders. The settings for raytracing and the like are ultimately configured within the HDRP settings. Materials can then be configured with the HDRP/Lit shader for Recursive Rendering, though this doesn't take effect right away. First, a Volume Component with an override for Recursive Rendering must be added to the Game Object. Paradoxically, that's also where the more detailed settings live, such as recursion depth or ray range, which can be overridden by any new Game Object with a Volume. This is presumably an artifact of the experimental nature of this feature.
