Warning, long and GIF-heavy post.
One of the goals for the peak scenes I have, are that they each present a different type of element or challenge.
For the next peak level, I wanted to create a few obstacles which wouldn't just be platforming challenges.
This peak is set at the shore and is home to sea-birds which nest around the peak. For the visuals and setting of the cliff, I was mainly drawn to The Old Man of Stoer in Scotland. With the obstacles for the cliff I wanted to implement a type of angry sea-bird (which was also partly inspired by the annoying gull in Bennett Foddy's GIRP). To add to this, I also had a 'shrubbery'-type obstacle in mind, which could help hide some of the birds, and provide minor as obstructions to the climbing routes.
The Old Man of Stoer, Scotland.
I do want to keep most of the peak scenes secret, but I thought I would make an exception for this one.
Here's a little preview of the related page in the Peak Journal.
The Old Man of Sjór.
Sjór, meaning "Sea" in Old Norse.
The peak's grade is Difficult (+). The added '(+)' means "many obstacles". Additional grades and modifiers are explained earlier in the Peak Journal. In this case, the peak has an abundancy of shrubbery and a couple of birds to make the climbing challenging.
The peak overlooks a vast sea, and a few sea-bird flocks can be spotted flying over the area frequently.
Obstacles / Hazards
Before designing the peak scene itself, I started working on the sea-bird's mechanics. To plan it out, I knew the bird had to do a couple of different things to make it somewhat realistic while also adhering to the existing gameplay mechanics.
- A feature I can set on the fly so the bird can be triggered either by range to the player, or by range to the player's hands.
- Once either of these conditions have been met, the bird should start its cycle of flying randomly around.
- The space in which the bird flies around randomly should be scalable.
- A randomised minimum and maximum interval between choosing when to attack left or right player hands that are holding on.
- Continue between flying randomly and attacking until player gets out of range of the bird's original place.
- All of these features encapsulated in a prefab.
Once planned, putting together these mechanics for the bird was more straight-forward than I had anticipated previously.
The bird is activated by a sphere collider(triggered by player grabbing proximity or player body proximity), which acts as the birds nest or original place where it sits.
Once triggered, the bird will move towards the green box (RandomFlightTarget). This target will randomise its position every time the bird gets within range of it. The position will be set around the shell of the blue sphere gizmo. This blue sphere is also scalable, so I can decide the range the bird flies around in. Generally, this range will be set around 3-5 units so the bird doesn't have any long-winded straight flying patterns. Once the player gets out of range, the bird returns to its original nest position.
I had to do some finnicky things when setting the bird's random flight position.
If the bird's random flight target position was set as truly random around the sphere, there was a chance that it would choose a location very close to the same place, which would look weird since the bird would be spinning around the same point, trying to reach it while moving forwards and turning around endlessly.
To fix this I made sure that once a new place was to be selected around the sphere, it would test if the position was too close to the previous, then continuously do this procedure until a location far enough away was suitable.
Blocky placeholder bird's rest is interrupted by player-testing.
Here, the bird is activated by player's proximity to the nest, rather than player's hands grabbing near it. The behaviour is changed with a simple tick of a boolean.
The bird also randomises which hand to attack when holding. If the player's hands are too close together, the bird will make the player lose grip on both hands.
Triggering the bird by climbing.
Modeling and Animating the Sea-Bird
After getting the functionality of the sea-bird running smoothly, I was eager to replace the blocky placeholder bird with an appropriately annoying-looking bird. I looked at a few different sea-birds, but I was quick to pick a regular seagull. I was also thinking a fair bit about the black and white balance of the bird, since I have to adjust the colour appropriately for the game's desaturated visuals.
An appropriately rattled-looking sea-bird.
Modeling was done fairly quickly, and the animations also ended up being done quickly. I just needed the animations to be simple enough for the bird to be believable. I do have a fair bit of experience with animation, so I tend to get them done quickly and basic enough for them to be usable in-game. With the rig, the only weight-painting I had to spend a little more time on was on the wings to prevent overlapping planes.
A simple 'resting' animation. This animation plays on loop (though more slowly in-game) when the bird is in its default 'resting' state. A lot of squishing and stretching of the bones was done in order to make it appear nice and comfy.
A fly cycle. This animation loops when the bird is flying around randomly. Excuse the badly looped GIF (It loops fine in-game).
Back in Unity
With the bird model done along with a few animations, I had enough to import it back into Unity to replace the blocky placeholder-bird.
Immediately after setting up the new bird model along with its animations, the bird felt a lot more lively and fun to play around with. I also added a few flapping noises, bird-squaks and a feather particles to add to its liveliness.
The bird uses an extremely simple Mecanim animation controller that just switches between rest (loop) > flying (loop) > attack (triggered once).
I also added the ability to shoe-away the bird by reaching out for it right before it attacks.
This brings a little more complexity to dealing with the bird. You will have to constantly check if the bird is flying towards you for an attack and 'slap' it away if it does, while trying to progress on your climb.
Shrubbery
Another quick obstacle idea I had was the shrubbery. The idea was to have an obstacle that would block the path that the player would have to grab to remove.
To implement it, I used a simple sphere collider to check the player grabbing the shrubbery and then simply enabling its physics for it to fall down. To prevent the player from grabbing through the shrubbery, I made the player's arms pull the shrubbery back towards the player, which means that the player wouldlikely have to swing or pull themselves up again to reach for the hold the shrubbery was covering.
The Shrubbery model was done with a segmented icosphere in Blender.
Combining the sea-bird and shrubbery lead to a lot of interesting challenging climbing scenarios. The shrubbery acts as both as a way to conceal holds and the birds. When the player then makes a bird angry, they'll have to find time between prevent the bird from attacking and remove shrubbery from the climbing route.
When creating the peak scene, I had to balance how many birds and shrubberies I would place, as specific holds became more difficult when the birds were trying to make you fall. To sort out areas of the route that were too difficult, I got around it by making more holds, as having your hands far apart when the bird attacks is safer.
This was a pretty lengthy post, but I hope some of it was interesting.
In other news, Norwich Games Festival has sadly been cancelled, which is where I was going to exhibit the game for a week.
However, I will still be releasing a
Demo on Itch very soon (Will post the demo information in a blog post too). I need to get a couple more things together before I put out the demo, so I will keep you posted.