
Jesper Elmtoft
Engine & Tools programmer student


Serving as a Systems & UI Programmer within a 4-man team of programmers in a 19-person multi disciplinary team, this project was a 'trial by fire' transition into Unreal Engine 5. I learned C++ on the fly to build asynchronous level streaming and save subsystems, showcasing my ability to rapidly adapt to new engine frameworks and implement high-performance, background-threaded systems.
Challenges:
-
Implementing a persistent game state and save system while learning Unreal Engine C++ and its framework from scratch under tight deadlines.
-
Managing large-scale level loading and NavMesh initialization without causing a significant frame-rate drops or "lag spikes" for the player.
-
Developing an asynchronous save/load architecture to prevent blocking the main game thread during data-heavy operations.
Actions:
-
Created a C++ State Machine interface with Game Instance Subsystems to broadcast global events (respawns, UI updates and level transitions).
-
Created an Asynchronous Save System using a naming convention tied to timestamps (eg., "Autosave - Date") to prevent accidental file overwriting.
-
Integrated Asynchronous Level Streaming with a custom loading screen to ensure all assets and navigation data were fully initialized before gameplay began.
Results:
-
Delivered a robust backbone system that successfully managed the transition from Main Menu to gameplay and handled player respawns to the latest checkpoint.
-
Provided a polished user experience with comprehensive Graphics & Audio settings (VSync, Resolution, Global Illumination) allowing for hardware-specific optimization.
-
Systems Programming:
-
Authored the core C++ State Machine and Game Instance Subsystem for persistent data management.
UI & UX Logic:
-
Implemented the functionality for the Main Menu, Game Over screens, and detailed Settings pages entirely in C++.
Asynchronous Workflows:
-
Developed the level streaming and save/load logic to ensure smooth, uninterrupted performance.
Cross-Discipline Support:
-
Collaborated with designers to determine which features should remain in C++ versus being exposed to Blueprints for iteration.
-
The Learning Curve:
-
This project was a "trial by fire" in Unreal C++. I learned that building systems while learning the language leads to "technical debt", which I had to balance by refactoring core systems throughout the project.
Version Control & Methodology:
-
Experiencing the "good and bad" of Perforce and Jira taught me that detailed commit messages and logged tasks are as critical as the code itself for team stability.
Optimization First:
-
Encountering flaws in my Initial State Machine taught me to build "robust and consistent" systems from the start, rather than trying to patch new features onto a shaky foundation.
-
-
ChangeStateSubsystem: Implemented a centralized state machine to manage game-wide transitions (Menu, Gameplay, Loading) using Dynamic Delegates.
-
SaveGameInstanceSubsystem: Developed an asynchronous serialization system to handle player data persistence without blocking the game thread.
-
GameFlowWorldSubsystem: Orchestrated the initialization sequence for manager classes (HUD, GameMode, GameState) to ensure reliable system startup in a multi-level streaming environment.
Loading Latest Save File

Automated Save Files

-
Global Event Service: Decoupled System Communication to ensure scalability across a large development team, I implemented a Singleton-style Event Manager using Unreal Engine World Subsystems.
-
Decoupled Architecture: Utilized Dynamic Multicast Delegates to allow disparate systems (UI, AI, Gameplay) to communicate without hard-coding dependencies.
-
Centralized UI Events: Created UHUDEventsWorldSubsystem to handle complex UI-to-Logic flows, such as asynchronous save/load requests and real-time stat updates (Health/Stamina).
-
World-State Monitoring: Developed UWorldEventsSubsystem to broadcast critical game-state changes, including player death, checkpoint triggers, and level streaming requests.
-
Performance-First Design: Leveraged TSoftObjectPtr for level loading events to avoid memory overhead and ensure smooth transitions.
-







