Viking Hiking

About

Steam Release Trailer

Viking Hiking is a cheerful 3d platformer, developed in Unreal Engine. You play as a peaceful viking who uses a magical horn to explore a lush island.

Chained Movement

The player has access to a variety of different moves that can all be chained together leading to fluid movement. He can jump, wall-jump, dive, roll and pole-vault with Bøf’s magical horn.

Playful Exploration

The island offers a large playground that the player can explore through tackling multiple interesting movement based challenges. He must converse with a god, gather runes and open the gate to Valhalla. 

Reception

50k+ Downloads

80+ Reviews

90% Positive (Very Positive).

School Awards

Project Role

Technical Game Designer

On this project I had received the responsibilities of a Technical Game Designer, being responsible for the character movement. These responsibilities include:

  • Prototyping the movement of a platformer character.
  • Designed and balanced a platforming character. 
  • Implementing the platformer character controller & moveset, which include:
    • The horn-vault mechanic. 
    • A finite movement state machine. 
    •  Modular jumping mechanics 
    • The rolling mechanic. 
    • A responsive ledge grab.
    • A smooth walking system. 
    • A diving mechanic.
  • Playtesting the character controller and making iterations based on these playtests.
  • Interfacing with Level Designers on the progress, timeline and specifics of the character controller.
  • Interfacing with the Animator and Character Rigger on what would be required technically for the character controller and moveset.
  • Creating the animation blueprint and implementing the character animations.

Platformer Character Showcase

I was personally responsible for designing, implementing and balancing the platformer character controller for Viking Hiking.

This meant that I had to figure out what makes platforming games fun, in the limited time our team had (~8 weeks, ~2 weeks extra for Steam). This made me establish our first game pillar, which was Chained Movement.

This design pillar meant that we always wanted the player to press buttons and switch movement states and see that represented in the animations.

To enforce this experience I tuned and balanced the movement states so that that it would never be beneficial (or impossible) to stay in the same state. Every states had its up and down sides.  

E.g. Rolling is the fastest state while grounded, but lacks control in moving around. This means that it’s hard to use on small platforms where precision is required. 

Movement state machine prototype | Not representative of final release.

Making the horn-vault mechanic

Horn-vault usage example.

What
I made a viking themed pole-vaulting mechanic using splines. The “Horn-vault”. This move leads to two other moves, the “Horn-jump” and the “Horn-dive”. You would do either one of these moves based on when you stop vaulting. 

How
The player would enter the “Horn-Air” state when pressing right trigger and would keep his horn infront of him. I detect the horn position in relation to the horn and adjust the splines trajectory based on that. 

Based on what the progress of the vault is, the player can let right trigger go to do a Horn-jump or a Horn-dive. I also detect if anything is colliding with the horn, and if so, output the move as if he were to let go of right trigger. 

For the visuals i blend a curved horn with a non curved horn based on the distance of the start point of the horn and the current spline point. I then attach the player to that with a simple pose. 

Why
I wanted to introduce a skill-based mechanic that would make the player choose between getting more XY or Z distance. It was also intended to be a good way to gate player’s ability to move based on their surroundings, since the horn always had to be attached to a surface. 

Retrospective
In retrospect, I think I made a mistake with this move. The character lacked a way to affect its surroundings and a core move should include that. Not including that within its design caused the gameplay to feel monotone and one-dimensional at times. 

Building a finite movement state machine

What
Created a finite movement state machine using enumerators with the ability to balance and tune every singular states gravity, speed, rotation rate and more. It also includes clear debug visibility. This is the foundation of the character controller. 

How
I first needed to figure out all the types of states that the character would be able to enter. After that i had to define simple rules and conditions when the character could leave what state. 

A good example of this is switching from the falling state into the walking or rolling state. Both states are entered upon touching the floor, but rolling requires a button to be held. 

Why
To reach our intended player experience we needed a state machine so that we could balance and tune and different moves rotation rate and movement option / movement ability.

It’s also important for our animation logic so that we can visually represent these states. 

Blueprint example

Movement input event state machine usage

Please zoom out using CTRL + Scroll wheel | Double click on Collapsed Graphs to look inside.

Implementing a smooth walking system

What
Using the state machine, I’ve implemented a smooth walking system that makes the player turn smoothly towards their input direction instead of turning with sharp edges.

How
First off, i make the character always move towards its current rotation.

I divided how the character rotates based on each state, then defined these variables: BaseMaxRotationSpeed, CurrentMaxRotationSpeed, CurrentRotationSpeed, TimeToMaxRotationSpeed and MinRotationSpeed

Using these variables i make the player rotate faster / slower based on their movement speed and set the CurrentMaxRotationSpeed based on entering and leaving states which will always lerp towards BaseMaxRotationSpeed.

Why
For a platformer, the basic movement needs to reflect the intent that the player has. This is why it needs to be smooth and look good. Especially this type of rotation is more suited for controllers.

I also needed full control over the rotation rate so that the transition between states becomes less clunky. 

Making modular jump mechanics

What
I’ve created 3 different jumps. A normal variable jump, a wall-jump and a “horn-jump”. These are all balanced with their individual trade offs and benefits and have buffered inputs.

For example, the wall jump has a much more forgiving gravity curve and allows the player linger in the air.

How
To make all these moves, I created a timeline that sets the gravity scale based on a custom curve. This allowed me to adjust the gravity curve of every move and jump. 

These jumps  would also be classified as their own state, which allowed me to individually set rotation rate, camera settings and more.

Why
For the player experience, I needed to create a reason for the player to constantly chain moves and cycle out of states. To achieve this I introduced multiple ways to move on the Z axis, which i am now classifying as these jumps. 

Creating a responsive ledge climb

What
I’ve implemented a responsive ledge climb mechanic that allows the player to grab ledges and pull himself up, while not taking control away from the player. 

How
During the falling state, I trace to find a suitable location to ledge grab to. After a check its validity with more traces, i lock the player in a new state called “LedgeClimb”. I then generate a spline based on the locations of the ledge and move the player along with it. However, the animation will move seperately at the same time to reach the same point. 

To make sure i do not take control away from the player, I allow the player to jump during this state. Also, if he touches the left stick, the character will instantly blend towards running as soon as he is above the ledge even if the animation isn’t finished yet. 

Why
We noticed during playtesting that the interactions with ledges could be fairly unforgiving. I set out to make a more forgiving character, so i set out to implement a ledge grab mechanic and adjust the “perch threshold” at runtime. 

However, players were complaining that they were locked in during this state and said it they didn’t like it. This made me make the state exitable immediately after it reached its goal and allowed the player to jump out of it.