HardWhere title card

HardWhere

HardWhere? Achieved the Honorable Mention award and runner-up for best Prototype game of the year - GradEx 2026.

Navigate rooms and solve the puzzles within by controlling a Robot who must make use of his own detached head! Just don't stray too far, or you may lose signal.

Skills Used:

Unity C# Gameplay Programming Systems Design Level Design UI

Overview:

HardWhere? Was my Final Year Project artefact, utilising a Second-Person perspective to solve and escape puzzle rooms. The intention behind this project was to display that unconventional perspectives can still provide a great sense of immersion and enjoyment to players despite being often overlooked by the heightened agency that conventional perspectives such as First and Third-Person provide within games.

What I worked on:

Technical highlights:

This Project was the first time I decided to give additive scene loading a go. It was a concept I learnt about during my first Game Jam, but didn't truly understand why the Lead Programmer used it. After some research, it made much more sense as to how useful it can be for loading and unloading scenes and small levels such as the ones in this project.

AsyncOperation loadOp = SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive);
        while (!loadOp.isDone)
        {
            yield return null;
        }

        Scene loadedScene = SceneManager.GetSceneByName(sceneName);
        if (loadedScene.IsValid() && loadedScene.isLoaded)
        {
            SceneManager.SetActiveScene(loadedScene);
            currentLevelSceneName = sceneName;

            if(loadedScene.name != levelSceneNames[0] && currentLevelIndex != introDuplicateSceneIndex)
            {
                batteryManager.SetBatteryFull();
                signalManager.EnableSignalChecks();
            }

            if(loadedScene.name == levelSceneNames[0] && currentLevelIndex == introDuplicateSceneIndex)
            {
                signalManager.DisableSignalChecks();
            }
        }
        else
        {
            Debug.LogError($"LevelLoadManager: Failed to load scene '{sceneName}'.");
        }

The main idea is to have a persistent scene that exists alongside the levels, including things such as the player, managers and other objects that you need access to in every level. Having them all in once place makes tweaking things far easier than having to edit said objects or values in every single scene.

Steven Brennan presenting HardWhere at a convention

Dissertation:

I wrote a dissertation for this project. It's quite long, so unless you're into camera and perspective stuff it might not be the most interesting read. But, if you are, have a cup of tea handy. It got an 81% so I feel like it would be a waste if I didn't include it here, y'know?