In Loving Memory of Them - Blueprints
As this was my second project using Unreal Engine Blueprints, I began with a solid foundation and deliberately used the project as an opportunity to push myself further. By analysing my previous work, I identified which mechanics I had already explored and used the gaps in my experience to inform new gameplay ideas. This allowed me to challenge myself with unfamiliar systems while also reusing and refining existing Blueprints to improve their efficiency and flexibility. Throughout development, I also focused on improving the structure and readability of my Blueprints, ensuring clean, well-organised node layouts that made iteration, debugging, and future improvements far more manageable.
.png)
Maze Readability via Dynamic Lighting- The maze was initially too disorienting, so I used Blueprint logic to dynamically increase the global light intensity as the player progressed. This was achieved by driving a light intensity value through a float multiplier and updating it via trigger-based progression, ensuring the maze became gradually clearer without removing tension.
Path Guidance Using Decals- To guide the player without relying on UI, I implemented a decal-based path system. The decal material was projected onto the environment and controlled via Blueprint to ensure it aligned correctly with the terrain. This allowed me to subtly direct player movement while maintaining immersion and avoiding intrusive on-screen indicators.
.png)
World Transition Performance- The first level initially suffered from slow and unstable world transitions due to a high polygon count, particularly from foliage assets. I resolved this by reducing mesh complexity in Blender and replacing the original assets with lower-poly versions. In Unreal, I enabled World Partition to stream only relevant sections of the level and applied Nanite to suitable meshes. This significantly reduced frame drops and removed visual glitches during transitions.
.png)
Combination Lock Logic- The combination lock required accurate input tracking and validation. I implemented this by storing player inputs in an array and comparing them against a predefined sequence. Incorrect inputs reset the array, preventing brute-force attempts while keeping the interaction responsive and readable.
.png)
Dynamic Scaling of Characters- The dog’s size was controlled via Blueprint by modifying its scale vector over time. Growth and shrinkage were tied to gameplay events, allowing visual changes to directly reflect player actions.
.png)
Context-Sensitive Interactions- Some interactions were gated by held items, such as requiring the watering can to water the tree. I handled this by checking the currently held item enum before allowing interaction logic to fire, preventing unintended actions and reinforcing contextual gameplay rules.
.png)
Parkour Difficulty Balancing- To prevent the parkour section from feeling unfair, I iteratively adjusted jump values, collision margins, and recovery timings. Blueprint logic was used to slightly correct player movement mid-air by modifying input values through multipliers, allowing the sequence to remain challenging while still forgiving minor errors.
Trigger-Based Narrative and Effects- I used trigger boxes to control speech playback, movement scrambling, and randomised death events. Each trigger set boolean states to prevent overlapping activations and ensure events only fired once. This structure allowed precise pacing control while avoiding unintended stacking of effects.
.png)
Light Degradation Over Time- To reinforce narrative tension, I gradually reduced the light level throughout the level using a timeline node. The timeline drove a float value that was applied to light intensity, creating a smooth and controlled transition rather than abrupt lighting changes.
Camera Feedback- To reinforce completion and movement, I implemented camera shake events at key moments and added a camera bob system that modified camera position based on player velocity. Both systems were implemented in Blueprint and tuned to avoid motion discomfort.
.png)
Room Reset System- At the end of the level, I reset the entire room by restoring default variables, object transforms, material parameters, and interaction states. This required careful execution order to avoid dependencies breaking during the reset process.
.png)
Curtain Animation Using Lerp- The curtains were animated using a lerp between closed and open transforms. A timeline controlled the alpha value, allowing the animation to play smoothly and visibly rather than snapping instantly between states.
.png)
.png)
Snapping Objects to World Anchors- To improve visual clarity and prevent physics issues, I implemented snapping logic that aligned items to predefined transforms. When placed, objects interpolated to their snap point rather than instantly teleporting, ensuring smooth and readable interactions.
.png)
NPC Fade Using Material Parameters- NPCs were designed to disappear as the player approached them. Trigger boxes drove scalar parameters on the NPC material parent, smoothly interpolating opacity from visible to invisible rather than instantly removing the mesh.
.png)
.png)
.png)
Subtitle System- Rather than using individual widgets for each line, I built a subtitle system that functioned as true subtitles, aligning text consistently and managing timing through a single controlled system. This approach was cleaner, more scalable, and easier to maintain across the project.
.png)
.png)
Item Placement Using Dual Line Traces- Placing items reliably was a major challenge. I solved this by using a primary line trace from the camera to detect the target surface, followed by a secondary downward trace if the player was facing a wall. The final placement position was offset forward from the camera and aligned using vector math, ensuring consistent item placement in all scenarios.
.png)
.png)
.png)
Radio Dial Interaction- The radio required precise rotational input. I mapped player input to a float value, passed it through a multiplier, and clamped the result to prevent over-rotation. The dial’s rotation was applied on a single axis to maintain realism, and the correct frequency was validated using range checks rather than exact values to account for player error.
.png)
.png)
Material Fading Using Scalar Parameters- I made the tree’s leaves fade in by controlling a scalar parameter on the material instance. Blueprint logic drove the opacity value from 0 to 1 over time, creating a smooth visual transition tied directly to player progression.
Widget State Management- Early versions of the UI could soft-lock the player if widgets disappeared mid-interaction. I fixed this by centralising widget state handling, ensuring all interactive widgets maintained a valid exit condition and could safely reset if an interaction failed.
.png)
Item Validation Using Enums- I used enums to categorise interactable objects and validate correct placement. This allowed me to check whether all required items were present in the correct locations before triggering events, such as detecting when all plates had been placed in the sink.
.png)
.png)
Player Lockdown and Reversal- After impacting the dog, the word projectiles reversed direction and travelled back toward the player. On collision, player movement input was disabled, creating a controlled loss of agency using Blueprint-driven movement state changes.
.png)
Dynamic Environment Changes via Book Interaction- As the player wrote in the book, environmental states were updated using event-driven Blueprint logic. Each interaction triggered specific changes in the room, allowing the environment to react directly to player input rather than relying on linear scripting.
.png)
Projectile and Cooldown System- I implemented a projectile system that tracked shot count and enforced a cooldown using timers. After the fourth shot, the projectile type switched from bullets to words, preventing spamming while reinforcing narrative intent.
.png)
Homing Word Projectiles- To ensure consistency, the word projectiles calculated a direction vector toward the dog on spawn, allowing them to home in regardless of firing direction. This prevented missed shots and kept the focus on narrative impact rather than precision aiming.