The core design goal was to create a fast and fluid-moving character which blends combat and traversal, allowing players to express their skill. I started with defining the states the character could have, along with their actions, and with how they would enter/exit said states. To solidify and align the design with the team, along with setting expectations for how the character would traverse the play space.
Then I proceeded with writing feature specifications for each element of the 3C’s along with creating in-engine prototypes, which were used to guide discussion and test initial player experience. These tests were positive, and with validation from the design team and producer, I discussed implementation with a programmer assigned to my strike team.
Together, we implemented the character into the engine. The core technical challenge was the wall running, primarily detecting when to start and stop a wall run.
For detection, we utilised line tracing from the characters’ sides, which, while functional, only detected wall running when the sides touched a wall. This was resolved by adding a cylinder collider, which would determine which direction the player should go in, depending on a dot product, calculating if the character is either facing more to the left or right when hitting the wall. This solution was not perfect, as head-on angles would appear random due to slight variance, causing a direction swap.
Another technical issue was curved walls; making the character follow the wall was doable with a lerp for the rotation. This still required multiple iterations for edge cases with the character rotating too slowly to stick to a wall, or sticking too much. This also impacted the camera since it was a component in the player actor, which meant it rotated with the character, causing the camera to snap often. To resolve this, we implemented a logic bypass to ignore the character’s rotation while wall running is active and instead softly lerp to the character’s facing direction, with the player being able to overwrite and stop this process via mouse aiming inputs.
The final challenge was making the player feel fast. From a mathematical perspective, the player covers a lot of ground, but play testers responded that they did not feel fast. My resolution was to dynamically change the FOV of the player camera via a lerp based on the vector length of the player’s current velocity. This worked, and alongside some visual effects of wind lines, it made the players feel fast.