Starting a new game in UE5

Based on the lessons I learned from my honours project, I have been creating plans for a new horror game. The simple goal is to do more of the things that worked: robust sound design, breakdown of self and repetitive compulsion. All while improving what was lacking, like the feedback to the player and the cumbersome and hard-to-adjust AI.

I’ve realised this project would be a good chance to learn the new features of Unreal Engine 5. So for the last week, I’ve been getting to grips with Quixel bridge, megascans and nanite to create the building blocks of the environment for my new game. The results can be seen in the screenshots in this post. Honestly, it’s almost unfair how good megascan assets look and nanite, which dynamically adjusts the number of polygons on models, has been really easy to set up.

What is this new game going to be about, you may ask? Well, good question. Currently, I plan to use the same core mechanics of Picnic. Have the player collect randomly distributed goals – though this time, I will add story context – all while being hunted by something.

The game’s aesthetic is heavily inspired by the film Annihilation, the short film Irradiation and the STALKER game series. I plan to set the game in a post-apocalypse setting where some weird cosmic anomalies and shenanigans are occurring. 

Picnic is Released!

A couple of days ago, I posted Picnic to itch.io! Version 1.0 of my honours project is finally complete. This is an exciting milestone because now my focus can shift almost entirely to writing my dissertation.

Download the game on itch.io!

Furthermore, I am amazed that with no marketing, several streamers have already played Picnic! It shows how popular indie-horror titles are at the moment, especially if they are free and easy to pick up and play. I should consider this when making my next game, which may be another horror experience.

To see people playing and enjoying the game is incredibly rewarding. But also incredibly humbling as already I have spotted lots of things I can do to improve the experience in the next version!

Midnight

This week, I’ve been writing the proposal for my honours project. Unfortunately, sitting in a library for multiple hours a day doesn’t make for an exciting blog post. So I thought I’d do another mini-case study inspired by my research like I did with Shrek Swamp Sim, where I talked about Freud’s concept of the uncanny. So today, I will discuss the Other, abjection and doppelgangers and how they relate to my favourite episode of Doctor Who, Midnight.

Yes, it’s that episode with Merlin

Midnight aired in 2008, at the height of the David Tennent era. Although it seems like a simple bottle episode on paper, it’s a perfectly paced little horror drama. 

A sci-fi tour bus filled with a group of tourists travelling across a planet inhospitable to life has a breakdown. As they wait for rescue, they hear a knock at the door. And while each tourist reacts to this impossible threat in a way fitting their character, the lights go out. In the darkness, whatever was outside seeks out the weakest in the group and possesses them. Unfortunately, the victim, Skye, was a bit of a loner and outsider, so she was already slightly mistrusted by the group.

Now, what does the possessed victim do? Does she start levitating and screaming in tongues? Does her neck snap round and projectile vomit? Nope, she merely copies what people say, just like that irritating game children play to annoy their friends. Already my uncanny sense is tingling with the connections to innocence and childhood but let’s not go there. Let’s talk about the Other instead. Everything that we consider to be in our image, be that physically, mentally or socially, is referred to as the Self. By contrast, everything we believe to be different, opposite and deviant from our self-image we call the Other. The alien entity in Midnight is a manifestation of the Other; what it is exactly we don’t know, but all the characters and audience know that it’s terrifyingly different and strange.

What happens next is the possessed Skye starts speaking precisely in time with the other characters. At this point is some of the characters turn from fear to violence. Going by these reactions, a definite theme of this episode is xenophobia, which is often connected to the idea of otherness. By speaking in time with the other characters, the lines between the Self and Other become blurred. This blurring and breakdown of the distinction between Self and Other is called abjection. Blood, pus and vomit are very primal examples of things that can cause an abject reaction since they remind us of our mortality and that we are not so different from a corpse that we think of as Other.

Skye has essentially become a doppelganger of all the characters, a trope that is well suited for exploring abjection. In Twin Peaks, a doppelganger of the mild-mannered and kind FBI Agent Dale Cooper goes on a rampage, destroying Cooper’s life while he is trapped in the limbo-like black lodge. This scenario is uncomfortable for an audience to watch as they may have grown attached to Cooper and now witness as his double commits horrible crimes. This is a very literal but very effective visual depiction of abjection.

The rest of the episode deals with the human reaction to abjection as the characters debate killing Skye. In a short 45 minute duration, this episode uses the Other and abjection to explore xenophobia, racism, fear of the unknown and childhood innocence, all tied up in a nice bow of cosmic existential horror. No wonder 10-year-old me didn’t sleep for days after.

The Uncanny Horror of Swamp Sim

In this silly little Halloween special, I use Freud’s essay on the Uncanny to explain why I think Shrek Swamp Sim is so creepy.

Onions

In his essay of the same name Sigmund Freud describes the uncanny as an unhomely and creepy sensation that comes about when the subconscious mind projects its repressed urges and feelings onto the world. This phenomenon can explain the unease people can feel when dealing with things such as the occult and arcane; it can also help understand the effectiveness behind many horror movie tropes such as creepy children and animate dolls. 

Today, I will analyse a piece of media using Freud’s work to explain why it is scary. The media I have chosen to examine is a 2014 work by Arman Karshenas entitled Shrek Swamp Sim.

This clone of Slender Man may initially seem like another addition to the long line of Shrek parodies and memeable internet content. I would be inclined to agree if it wasn’t capable of producing the most intoxicating feeling of dread in me. 

As for many people my age, the Shrek movie franchise was a cornerstone of media growing up. This childhood link is the first reason why Swamp Sim is so uncanny. Since Freud believed that childhood memories make up a large volume of the ocean that is our subconscious, it is no surprise that memories of the lovable titular Scottish Ogre exist there. These memories harken back to simpler, more carefree days. So when these happier memories meet with the dark threat of this friendly character chasing and trying to kill you, a feeling of unease and fear is to be expected.

Next is the gameplay. Like the original Slender Man, objects are placed around the map for the player to collect. If the player collects all the objects, they win the game, but as they collect more, the adversary gets faster. In Slender, the objects are pages; in Swamp Sim, they are onions. All the onions are not present at the start of the game; as the onions are collected, more gradually spawn in. This feature forces the play to return to the same areas of the map continually. This compulsive repetition can also invoke a feeling of uncanniness. Freud described an event from his childhood when in an Italian city, he was lost and, despite trying to avoid a creepy plaza, kept inadvertently returning to it. This experience instilled in him a particular type of uncomfortable panic. He felt trapped, like he couldn’t escape and anxious that he was drawing attention from onlookers by continually returning to the same area. Freud attributes this repetitive behaviour to a primal lizard brain instinct in our unconscious to constantly go in circles when lost to prevent oneself from getting more lost. However, this instinct directly opposes the conscious mind, which is trying to get away and find its way somewhere else. This type of experience, I imagine, is quite common to people. Many of us will have had nightmares where we were trapped going in circles or memories from childhood of losing our parents in a supermarket and continually returning to the same aisles.

My final point on this games uncanny nature is Shrek’s stunted and inhuman looking walk-cycle. The amateur nature of the animation is likely intentional in both a humorous and unsettling way. The reason it is disturbing is our unconscious id, and the conscious ego is confused by the unnatural nature of the walk, making us wonder if the animation is alive or not. This unease around whether something is alive or not is more commonly known these days as the uncanny valley, an effect where objects that appear almost human unsettle us because they seem slightly off and our brains are unsure if it is a threat or not. Animators and roboticists have to regularly contend with this effect to ensure their creations don’t creep us out. Of course, this creepiness in the case of Shrek is intentional.

DES311 #9: The Final Sprint

This is it, the final sprint, the last push. This week I have added in a music player and have begun my last round of bug fixing and optimization before submission.

My music player script stores a number of licenced music tracks in an array, and plays them in a shuffled order.

        while (true)
        {
            // Picks next track
            nextTrack = Random.Range(0, tracks.Length - 1);

            // Avoids the same track replaying
            if (nextTrack == currentTrack)
            {
                nextTrack += 1;
            }

            // Starts playing the next track
            audioSource.clip = tracks[nextTrack];
            audioSource.Play();
            currentTrack = nextTrack;
            trackName.text = tracks[currentTrack].name;

            // Waits until track is finished playing
            yield return new WaitWhile(() => audioSource.isPlaying);
        }

By naming each audio clip as the track title and artist separated by a dash then I can send the name of the currently playing trach to a text element in the UI. Also in the UI I’ve added a slider that controls the audio source volume. If I were adding more sound effects I would instead control the volume of a mixer where multiple audio sources would be sent. However due to the creative decision to avoid sound effects this was unnecessary.

What’s Next

The remainder of this sprint is going to be spent bug fixing and completing my portfolio submission for the module.

DES311 #8: DOTS or how I learned to stop worrying and love my garbage code

This week just a short post about the user testing I’ve been conducting. I’ve sent the game to a number of people who have been reporting any bugs they’ve found back to me. So far I was aware of all the bugs sent to me and have a plan in place to sort each one. The main take away from the testing is the performance limit.

My laptop can simulate 100 BOIDs before a significant frame rate drop. Initially I assumed this was just the limit of processor but this limit appears to be universal on different hardware.

After some back of the napkin calculations I worked out that the number of calculations per frame increases at a factor of:

f(x) = x2 – x

…where x is equal to the number of BOIDs. This is because each BOID is collecting vector information on every other BOID. Which means there’s no way round this.

However I have noticed the simulation doesn’t take full advantage of all the cores on mine and other testers processors. Which has lead to me researching the data orientated tech stack, or DOTS in Unity. It would allow the simulation to run on multiple threads and therefore utilise all a processors cores. Rather than using game objects DOTS keeps track of entities and pieces of data. Here’s a tech demo of DOTS being used to simulate a futuristic city in Unity:

After reading the documentation it is clear DOTS is perfect for this type of application, but though super cool far exceeds this projects scope. If I where to implement DOTS it would require rewriting most of my object oriented code with new syntax I’m unfamiliar with. If the project had set out to use DOTS from the beginning it might have been possible but with the due date in a months time and with the development portfolio and video still to make I don’t have the time.

What’s Next

Come to terms with the fact that without DOTS the simulation will probably be limited to 100 fish 😥 . Continue bug fixing and user testing. Implement the music and UI elements I talked about last week.