Moon Runner is a short game I developed to expand my technical skillset and explore game design concepts within the framework of a contemporary third-person experience.
Available free on Steam ↗
Introduction
Moon Runner is a short action survival game built in Unreal Engine 4. The player must find monoliths across the surface of a small moon. Along the way, they find items which can be used to help them traverse the landscape and deal with enemies, or upgrade their character and complete objectives. In the final stages, the player can end the game or continue playing to complete side objectives. Upon completion, the player's score is calculated and added to a global leaderboard.
I started this project in order to explore design concepts and extend my knowledge of development processes and Unreal Engine. I wanted to produce something which would point to the standards I'd like to work towards and to learn as much as possible along the way.
The goal was to create a short, single-player, third-person experience based on existing references, with at least one unusual design feature, and attempt to execute the concept to relevant contemporary standards.
The traversal-based gameplay that inspired my project seemed well suited to this underrated setting. It also wouldn't demand large amounts of architecture, foliage, and other features that make up conventional earth-based level designs, leaving room to focus on other things.
The player character is a blue-collar space worker who's been sent to a remote location and tasked with maintenance assignments.
Reception has been mostly positive. The game currently holds an 86% positive rating on Steam, where reviews praise its style and atmosphere, and players say they enjoy the traversal-based gameplay with survival elements.
NME reviewed the game and described it as "spectacular", "astonishingly well crafted", and "impressively slick".
Some players find the difficulty too challenging, while others have no issues in this regard.
Pre-production
"Death Stranding on the Moon" was the starting point for this project. The aim being to adapt that reference and its standard of execution to a lunar setting and to build on it with my own ideas. I was keen to build a sci-fi concept around this, and to make it somewhat reminiscent of real and familiar interpretations of astronauts and the Moon.
Music, film, and other visual media formed constant reference points for mood and style.
Early prototyping focused on establishing the player character, the world around them, and the main gameplay loop. I started by building basic versions of the systems upon which the gameplay would rely: finding items around the world and bringing them to checkpoints; an inventory system to manage those items; a ladder mechanic to aid traversal; and the health system used for survival.
I worked with templates and plugins in order to build a workflow that could sustain the concepts I was forming, and to reverse engineer systems where possible so that I could learn from them and customise them where required. ALS (Advanced Locomotion System) and Voxel Plugin are the two notable packages upon which the character and world are built, respectively.
A detour
After initial prototyping, but before getting into the main production of what would end up being Moon Runner, I worked on a different theme for the game.
During the early stages of development, achieving the standard I was aiming for in a grounded and realistic style felt out of reach. I had been experimenting with procedural generation, and this led me to consider a more rogue-like structure to the game, which could be accommodated by a switch to a more abstract setting and style. It also meant I could focus on the gameplay design rather than exhausting resources trying to maintain a high-fidelity aesthetic.
So I pivoted to "Magnet Planet", a thematic concept involving a character made of magnets and a planet covered in metal. I kept the same framework of gameplay as before, but I built new mechanics and a more playful version of the game started to emerge.
The mechanics were fun, but I realised I couldn't do justice to the design that they promised, so I pivoted back to the style that had inspired this project. I kept a lot of the work I did but re-established the Moon Runner theme.
Production
The low horizon on the Moon creates a striking type of visual framing which gives the landscape a sense of limited range. It can't really be replicated on a traditional flat landscape.
So I decided to make my level spherical. Voxel Plugin provides tools to generate landscapes with relative ease, both manually and procedurally. By layering noise patterns and combining them appropriately into a sphere, I created the shape of the landscape across the moon.
The decision to set the game on a spherical level drove the conceptual elements of the narrative and the game's broader structure. I sought to devise a coherent logic to the world and the player's objectives within it.
An opening slate of text at the start of the game gives a bit of context to the setting, followed by an AI voice which conveys to the player their assignments and is used to explain the game's rules and mechanics. In the context of the game, the voice is generated by Astral Cortex Industries, an interstellar conglomerate responsible for faster-than-light travel networks between orbital bodies known as "lunar nodes". Scattered across the surface of these small moons are monoliths, which form part of an underground megastructure built to harness the energy emitted by the core of the moon. The nature of the moon's core and its energy are ambiguous, but the monoliths allow Astral Cortex Industries to use the energy to power their travel technology.
As explained to the player at the start of the game, the monoliths on this lunar node require urgent maintenance: they have been deactivated. The primary assignment given to the player is to reactivate these monoliths, which they do using a probe device mounted on the character's shoulder, the Cortex Energy Device (CED). When the monoliths are reactivated, they are forced back into the moon's surface, reinforcing the underground structure which controls the moon's core.
When the player attempts to reactivate the last monolith, the reactivation sequence malfunctions and the player is told to enter the tunnels and descend towards the core of the moon.
When they enter the core chamber, the player engages in a boss battle against the core itself, which summons energy to attack the player. After the boss battle, the player is congratulated on completing their assignment and told they can end the game by reactivating the moon's core with their CED. They may also return to the surface to complete any remaining secondary assignments.
Once the core is reactivated, the camera cuts to a wide shot of the moon itself, which is teleported away using the now functional travel technology. The player is then presented with an ending title screen, leading into a score tally and the option to view their ranking on the online leaderboard.
The established context for the game laid a path for me to try and realise an authentic lunar setting.
The landscape material is a custom version of the multi-index material from Voxel Plugin, using triplanar mapping. Surface types are blended using height maps for natural transitions, which are assigned by a combination of surface normal angle, procedural noise patterns, and manual brush tools.
Height maps are also used in material displacement, which, combined with tessellation, adds geometric detail to the nearby ground surface. The landscape textures were sourced from Quixel Megascans, as were various mesh assets such as rocks and craters. I used distance field techniques to blend them into the landscape.
The game is built in Unreal Engine 4, since Unreal 5 was released late into development. Certain aspects of the design, such as landscape and lighting, are reliant on systems which have been overhauled in the newer version of the engine and have proven difficult to replace. Distance field blending in particular interferes with Unreal Engine 5's Lumen. The lack of tessellation in Unreal Engine 5 means that achieving a similar level of detail on the ground would require a very different approach, maybe involving a controlled use of Nanite meshes. The closest alternative, Virtual Heightfield Mesh, proved unusable because it only applied on the global Z axis, which wasn't suitable to a spherical level design.
I used Blender to rig and animate the character model, which is based on edited mesh assets from various sources. The base of the character model is taken from Epic's Mission AR project, a recreation of Apollo 11's Moon Landing. Other pieces of the suit were cut and spliced together with the edited base to make something resembling a traditional astronaut mixed with modern sci-fi designs.
Besides the model itself, it was important that the movement of the character also felt authentic to a lunar setting, so I tried to make the animations look somewhat familiar within that context, adding a degree of bounce to the running motion, and using physical animation on the arms during gameplay.
Finding a balance between authentic lunar movement and making the character feel responsive was a difficult task. The aim was to resemble to some degree the movement of an astronaut on the Moon, but not at the expense of input response times.
Further behind the scenes, I had to address all the technical implications of a spherical level design, including many that involve the player character. Relevant vectors and rotators relating to player movement and character animations are configured to be calculated relative to the constantly changing gravitational alignment, and challenges caused by issues such as gimbal lock were solved to provide a consistent experience across the surface of the moon.
The primary gameplay loop involves reaching monoliths before you run out of energy. Energy acts as the player's health and manna combined. If the player is damaged, energy is removed. If the player uses an ability, energy is removed. In the context of the game's fictional world, energy synthesizes the oxygen supply to the character, so it also drains over time.
Monoliths act as player checkpoints. Once they've been reactivated, and when the player is stood nearby, they refill the player's energy. If the player dies, they are respawned at the last monolith they engaged.
The player can scan the environment by pressing a button to highlight nearby items. These items, called modules, are scattered across the surface of the moon, and the player can pick them up when stood nearby. The modules are stored physically on the character, and the player's movement is slowed down based on the amount of modules carried.
There are 5 types of modules:
Each module type can be traded at monoliths in exchange for credits. Credits can then be used to purchase upgrades, which improve the player's Carrying Capacity, Energy Capacity, Energy Efficiency, and Scanning Range.
The ladder module acts as a tool the player can use to aid traversal. This mechanic was based on an existing reference from Death Stranding, although the final design is somewhat different.
The player must also deal with enemies scattered across the lunar surface, either by destroying them with the rifle module or avoiding them altogether. In the context of the game's narrative, they are droid units deployed by Astral Cortex Industries to perform the same maintenance tasks as the player, but they have been corrupted and are now hostile.
The first enemy type is the Hoverbot, a spherical droid, which hovers along patrol routes and attacks the player when they are alerted to their presence. The other is the Spiderbot, a droid on four legs, which is embedded in the ground and awakens when the player approaches it.
Both enemies have similar attack types: they fire various projectiles at certain ranges from the player, and they fire laser beams when they're close. The Hoverbots have a bit more health and are therefore harder to destroy, but the Spiderbots sometimes have the element of surprise, given that the player might stumble across them unawares.
Because Unreal's navmesh system is designed for flat levels, I had to think of a different way of handling AI navigation. Having explored options involving flight navigation plugins using 3D navmesh systems and traditional pathfinding algorithms, I found performance to be unreliable at best, so I looked to build my own system using path tracing.
Initially conceived as a method for setting random patrols on a procedurally generated level, it can function as a real-time navigation system for enemy encounters in the game, and generate the patrol paths for enemies in the editor when iterating the level layout.
A real-time version of the system works using local traces without a spline path: the AI finds its way around walls and towards a target by tracing the environment around it and deciding which direction is viable. The same tracing system is also exposed to the actor instance in the details panel as a custom event, so that multiple paths at different starting positions can find their way towards the same target.
There are many aspects of the project which I haven't covered here. These include:
There are a number of features I worked on during development which didn't make it into the final game.
Early on I explored network replication to get an understanding of how to set up multiplayer gameplay. Along the way I garnered a thorough understanding of network replication, but I also discovered the extent to which multiplayer would shape my game, and I decided not to pursue it further.
Some of the tools used for generating the world and actors within it were well suited to procedural generation. I explored the potential they had to create randomly generated levels, and this led to the shift in theme towards Magnet Planet. Much like the other scrapped features described here, the idea was dropped in favour of maintaining the project's scope.
I experimented with branching narratives. The idea was that the moon's core would be a character in and of itself, and the player could encounter it and trigger an alternative narrative sequence where the core would talk to the player and ask them to help it. Once all but one of the monoliths had been reactivated, the player would have the choice to either help the core or continue with their assignment, leading to a slightly different ending. In an effort to reduce the scope of the project, this was scrapped in favour of a simpler single track narrative.
During development I worked on a humanoid enemy, based on the same character blueprint as the player, and larger types of enemies too. As part of an effort to rein in the scope of the project, however, these enemy types were removed.
Conclusion
I made several updates after release and ended the Early Access period. The game currently holds an 86% positive rating on Steam, and players continue to enjoy its graphic and atmospheric elements. I balanced certain aspects of the game along the way, but there are aspects of the design which I recognise could be barriers to entry for some players, and others that could be expanded upon to provide more comprehensive communication of the game's mechanics.
My focus on this project leaned heavily on its execution, with much of the design process taking a backseat to my ambitions in technical and aesthetic fields.
Thank you for reading.