[In Development]
Sicaria
Project Overview
3rd-person stealth action-adventure game set in Antwerp during the 80 Years' War (16th century).
In this ongoing project, I'm working together with the team as a Game Designer.
I'm in charge of designing and implementing the camera system for the entire game, providing the intended player experience, and collaborating with other feature owners. I'm also responsible for the design part of the character's movement and controller support.
Camera System Design
Intended Player Experience:
Dynamic camera that emphasises strategic stealth gameplay, taking advantage of the cover, reaching for satisfying takedowns, and clever use of the gadgets when being spotted to get away and hide.
The camera is designed to adapt to the character's movement and consists of 30 modes
Data Table storing 30 camera modes
What changes depending on the mode?
How far camera is from the character (zoom)
Field of view of the camera
Camera framing
Camera rotation
Interpolation speed
Modular Camera system
This camera system is stored in the Actor Component thus can be moved to any character.
It uses a data table that stores all the camera changes; this way, all the connections will remain even after moving the component.
We worked with Advanced Locomotion System (ALS) and the gameplay tags that it uses, so any project using ALS can use this camera system without major issues.
It is easy to add functionality to this system.
Most of the features supported by camera consist of:
Different states
Right and left direction
Interior and exterior environments
How do I add new functionality?
Add a new row to the data table.
Get the recently created table row for the component.
Connect function "New Camera Position".
Connect this functionality to your event or gameplay tag.
And it works!
How this implementation looks in blueprints
Interpolation of the camera changes in blueprints
Why does it work?
The custom function "New Camera Position" does all the interpolation of the camera changes.
Interpolation speed can be manually changed for different modes if necessary.
All the changes are happening on Event Tick to ensure a consistent and smooth result.
For optimisation purposes, I set up functionality that checks if the camera position is changing, and if not, it doesn't run the following logic.
As this project is still in development, I'm going to continue working on optimisation in the future.
In what cases does it not work?
In case I need to use timelines, those are especially handy for stabilising camera movements.
In this case, I still use the data table row and new camera position nodes, but I do it inside my player character blueprint and call my camera component.
Then it still works, but, unfortunately, this is not as modular and doesn't provide a great overview of all camera changes if it's spread around.
Interpolation of the camera changes in blueprints
What does it allow me to do?
The camera empathises with the takedown and makes it more satisfying for the player, which is the intended player experience.
The camera movement works on simple calculations without any sequencers, which is a cheaper approach.
The same approach could be used for any other feature in the game, for example, as a camera stabiliser for mantling or vaulting.
Camera movement for takedown
What does it allow me to do?
This gives the player exactly enough overview and maintains the intended framing by the designer.
Smooth camera transitions in narrow spaces.
This solves Level Design and Environment art issue of constantly keeping the camera in mind when creating interiors.
Allows audio designers to use this system and connect different ambiences depending on the interior or exterior camera.
Camera movement for crouching, running, and walking in interior and exterior environments
Work with materials related to camera in Unreal
Fading materials:
Depending on the camera's distance from the material, it will gradually fade away.
We used it on clothes, foliage, and the character itself.
Camera Lens Effects:
Camera visual feedback is crucial for stealth games. To convey taking damage and interaction with objects, I've developed the following customisable shaders:
Fading material on the clothes
Take damage vignette with customisable colour, radius, and pulsing frequency
Scan (outline shader) and inspect the item (blur background while the item is in focus)
Character movement Design
Intended Player Experience:
Character movement that emphasises strategic stealth gameplay: primary movement being crouching or walking, while taking advantage of rolling for satisfying takedowns, and clever use of the gadgets when being spotted to get away and hide, while keeping dynamic pace using sprinting.
Why the Stamina system?
To ensure the intended player experience, my team and I came up with the idea of a stamina system.
The stamina system, which includes draining and restoring the stamina when the player sprints or rolls, ensures dynamic gameplay, strategizing, and prevents the player from missing the level content.
At first, we tried combining the stamina system and strike system, which would give a player a burst of speed, but then I re-evaluated the design goal of it and decided that for getting away, players intended to use gadgets.
All the movement speeds were balanced according to the playtest data I've collected.
The Stamina system showcase
Controller Design
Controller support
Part of my responsibilities includes designing, iterating, and implementing controller support.
Keeping intended player experience in mind, I used a lot of common button combinations for stealth games.