Genre First-person horror

Engine Unreal Engine 5

Role Gameplay & UI programmer

Date March 2023

Link https://store.steampowered.com/app/2290480/The_Obscura_Experiment/

Videos

https://www.youtube.com/watch?v=Rjlhu1zliq0

https://www.youtube.com/watch?v=3UgxFOwT8E8

<aside> ❓ The Obscura Experiment is a first-person horror game made by a team of 26. You play as scientist Priya Ellis who must escape from the monstruous experiment that has escaped. Every second you aren’t running, the Dark Matter is getting closer.

</aside>


⚒️ What I worked on

🖐 Interaction System

Example of code used to interact with a given object

Example of code used to interact with a given object

Interact interface

Interact interface

Example of interaction with door lever

Example of interaction with door lever

<aside> 💡 Early on, I mainly focused on the interaction system. Every object had to be activated with a common input (e.g. “E to interact”), but also had to activate a unique action. I found out that Unreal Engine’s blueprint interfaces could be used to remedy this and so they were used all throughout development.

Paired with a BP_InteractComponent that was be placed in every interactable object, this streamlined the way our programmers could code every interaction. Step by step, one has to:

  1. Place the BPI_Interactable into the blueprint that activates a unique action so that the designer/programmer can decide HOW the action will activate.
  2. Place the BP_InteractComponent into the same blueprint so that the designer/programmer can decide WHAT action will activate.

The biggest challenge was to optimize the code and keep it organized all while making sure each object had its own functions. In the end, the 6 interactable objects all share a common component which have their own behaviour.

</aside>

Component shared among all objects

Component shared among all objects


Pause / Settings menus

Pause / Settings menus

<aside> 💡 My role expanded to UI programmer. It began with me coding every menu (main menu, pause menu, settings) and making sure the technical side of it was functional.

I later established the general UI aesthetic and applied it to every aspect of the UI including the HUD. The idea was to go for a minimalist sci-fi blocky look with cyan being the prominent accent colour.

I made widget templates that could be customized as desired. Several widgets from the same template could then be used while having different functionalities.

</aside>

<aside> 💡 Hovering an interactable object displays a prompt that shows the correct keybind to press regardless of the input method (mouse & keyboard or gamepad).

The HUD also updates its keybind indicators based on the input used on runtime. It is done by getting the GameInstance’s EventDispatcher for input detection. The moment the input method is changed, the UI will follow immediately.

</aside>


🖼️ User Interface

Pause / Settings menus

Pause / Settings menus

<aside> 💡 My role expanded to UI programmer. It began with me coding every menu (main menu, pause menu, settings) and making sure the technical side of it was functional.

I later established the general UI aesthetic and applied it to every aspect of the UI including the HUD. The idea was to go for a minimalist sci-fi blocky look with cyan being the prominent accent colour.

I made widget templates that could be customized as desired. Several widgets from the same template could then be used while having different functionalities.

</aside>

<aside> 💡 Hovering an interactable object displays a prompt that shows the correct keybind to press regardless of the input method (mouse & keyboard or gamepad).

The HUD also updates its keybind indicators based on the input used on runtime. It is done by getting the GameInstance’s EventDispatcher for input detection. The moment the input method is changed, the UI will follow immediately.

</aside>

Objectives / Logs / Interaction / Dialogues indicators

Objectives / Logs / Interaction / Dialogues indicators


🎮 Mouse & Keyboard / Gamepad Support

Function to detect input method

Function to detect input method

Actions bar

Actions bar

Menu prompts

Menu prompts

Data Table for keybind prompts

Data Table for keybind prompts

<aside> 💡 Calling an EventDispatcher located in the PlayerController updates the currently used input method throughout the UI.

The correct keybind is then displayed and is also affected by the language set by the user (whether English or French). A Data Table was used to translate the prompts.

Because of Unreal Engine’s lacking support for gamepad, tasks related to it were a bit more tedious. The SetFocus nodes were very much used.

</aside>


🤝 Credits