The creation of Short Circuit for ‘Liftoff: FPV Drone Racing’

Game dev insights

Vincent Vangeel
12 min readJan 30, 2022

Hey there, in this blogpost I’m going to be talking about my workflow as a level designer and how I created the latest level in ‘Liftoff: FPV Drone racing’ called Short Circuit.

I hope this article will be useful for anyone who wants to get a glimpse behind the screens of Liftoff, or for those who are more interested in the level design side of games.

About Liftoff

Before I start talking about how I created the level, let’s first give a short introduction into Liftoff, for those who aren’t familiar with the game.

Liftoff is a realistic drone racing simulator that aims to bring the rush of first-person view drone racing to the virtual world by delivering an authentic flying experience for both new and seasoned pilots alike.

Even though Liftoff was already released quite some years ago, it still receives regular updates with both new content and features.

I only joined LuGus Studios (the team behind Liftoff) a little bit over a year ago though. So far I worked on a few level expansions and some smaller side projects. But since this is the first level I worked on from start to finish I found it warranted a blog post to go more in-depth into the workflow that I used to create this level. I want to apologize in advance for using some pretty technical terms in this article, but in order to minimize the amount of text I wasn’t able to go into too much detail to explain everything.

You can find the store page here if you want to have a better look at Liftoff: https://store.steampowered.com/app/410340/Liftoff_FPV_Drone_Racing

The idea

The community had already been asking for quite some time to include a feature of being able to chase moving vehicles around with their drones. So together with the team we decided that creating a level that was specifically designed for this was a good first step into that direction. And so the first thing that came to mind was of course a car racing circuit.

Since I worked on a racing game before, I had a rough idea of what parts of a racing circuit were the most important to get that iconic racetrack feeling and some ideas I wanted to implement into the track itself to make it more interesting. Especially since having an interesting race circuit for cars, doesn’t necessarily mean it’s interesting to fly a drone into it as well.

Creating a ground plan

Before I start to work in 3D, I always like to make a visualization of my ideas. This helps me get a better sense of the scale of the environment and all of the important building blocks that are necessary to create the level.

So I went into photoshop to sketch out the general shape of the circuit track. My main goal was to create an interesting layout of a race track with some tight corners, while still keeping the track to a relatively small size so I could limit the amount of unique features such as buildings and race structures.

Once I was happy with the general shape of the circuit, I used some image snippets from google maps to fill in the blank spots of the surrounding areas and give a better idea of the actual scale of the environment as well as map out some interesting key visuals.

So eventually I ended up with this image:

For those who have played in Short Circuit, you might have noticed the finished level actually looks quite different then the initial idea. Though most of the base elements stayed the same from concept to finished product.

Blockout

Now that I had the ground plan, it was time to turn this into an actual level that I could fly in and try out.

The first challenge was how to create the road system. Liftoff is made in the Unity game engine, and natively Unity doesn’t have a spline system that I could use to create the shape of the racetrack. There are several ways I could create the road, each with their own pros and cons.

After some consideration I went with the plugin approach, and bought a spline tool from the Unity asset store. The benefits here were that I could stay within Unity to the roads, making it a lot easier to change the layout of my level without having to jump back and forth between different programs. I also made sure that the plugin I picked had the ability to deform the Unity terrain, as this would make my workflow a lot easier so that I didn’t manually have to deform the terrain to match the spline or the other way around.

To start I imported the ground plan that I created before and put it on a flat default plane with a 1:1 real size scale. Followed up by a terrain of roughly the same size. Using the spline tool I quickly traced over the ground plan to create the road system, and played around a bit with the height of the road to create an interesting layout. As I knew that having enough high difference is the key to creating an interesting map to fly in.

The level was already taking some shape, but it was still pretty hard to see how the level would actually play. So using assets that were already in the project, in combination with some white boxes for assets that still needed to be made, I quickly blocked out all of the important structures.

I also used some default textures that were already in the project to paint the important ground zones (grass, asphalt and sand pits) to visually get a better understanding of what the level would look like.

Using this version I could already playtest the scale of the level and receive some first feedback by my colleagues, as well as plan out the assets I needed to create the visuals.

First graphics

Now that I had a rough blockout, it was time to add some actual assets to the level. I decided to first focus on the road and the assets directly surrounding it, since these are key assets to a racing circuit and they also gave me the opportunity to experiment further with the spline plugin.

First off I wanted to add the red and white curbs to the side of the roads, that are so typical for race tracks. Initially I created a 3D model that I placed with the spline tools next to the road, but I quickly ran into some problems. Since there was no snap to spline option, I had to manually create a second spline and carefully place it next to the road. Since the plugin had basically no options for deformation it didn’t really match the shape off the road and made the model stretch and squash in some awkward places, leaving the model looking quite ugly with lots of visible artifacts such as overlapping polygons and stretched textures.

So instead I decided to add the curbs together inside of the texture of the road. This meant I could easily swap in and out the textures of each road piece to create different visual looks, but it did increase the amount of textures for the road to 4 (no curbs, curbs left, curbs right, curbs both sides), since I could only have one texture per road segment.

The curbs also looked a lot flatter, since now the curbs didn’t actually have any geometry but are completely flat instead. But since this is a drone game, it meant that the player would be flying high above the ground anyway, so I found it was a good tradeoff.

With the road done I continued onwards to the sides, and more specifically the guardrails, metal fences and tire stacks. In previous Liftoff levels all assets were always hand placed. Which is fine if you have a lot of different assets or if all assets are nicely aligned. But if you have a single asset that needs to be placed along a slightly curved path, then this is quite a time consuming task.

So yet again I opted to use splines here. With the restrictions of the previous spline tool in mind, I actually opted to use a completely different spline tool for this task. This tool didn’t need to adjust the terrain, and thus I picked a tool that had a lot more deformation options so that for example I could bend the guardrail prop along the spline and create nice and smooth transitions.

For most of these assets I created 3 pieces (a begin piece, a middle piece that was constantly repeated, and an end piece that was basically a mirrored version of the start piece.) And placed them nicely along the roads at places that made sense for a realistic race track.

With these done, the level already started to look like a real race track, albeit still with lots of white cubes in it.

The big pieces

With the level already starting to come alive with a lot of small tweaks (better terrain textures, sky textures, better lighting…), it was time to slowly start adding in the big buildings and structures.

I started off with the big building in the middle of the level, the paddock building. Since this was in essence a big block surrounded by roads, I wanted to make sure it was possible to pass through the building from various directions so as not to interrupt the flow of the level.

For this reason I decided to keep the top floor of the building open, and have doors leading through the whole building on the bottom floor as well as occasional backdoors and garage doors.

The building itself is built similar to the previous props that I made for the level, where it has a start piece with a stair leading upwards, a middle part that is repeated numerous times and an end piece similar to the start piece.

Attaching to the building I made some bridges to serve as pathways to other parts of the level. I tried keeping the structures as modular as possible, so I could easily re-use some of the parts (such as the roof of the paddock building is the same as the roof on some of the bridges, just scaled smaller).

In order to keep the big structures optimized but still visually interesting, I used tiling textures in combination with a shader that a colleague of mine wrote for a previous level. This shader allowed me to blend several textures together in world space using vertex colors, and create interesting pattern variations (such as dirt on the bottom of the building and stains/damage on walls) while still only using a relatively small texture space.

Adding life to the scene

After I finished the big stairs and the tribune building, it was time for my favorite part of the level design workflow. Bringing the scene alive by adding more props and additional details.

I personally like this part the most, because it allows me to tell a story through the environment. And though most players won’t notice or think about why certain scenes are decorated in a specific way, it breaks the artificial feeling of a scene and adds a lot of realism to it.

For example a table with 4 chairs next to it. When placed nicely aligned next to each other, it can quickly feel artificial. By adding a bit of random rotation and positioning, it feels like people actually used these chairs to sit on, and didn’t put them back perfectly. Lay one of the chairs on it’s back and add some beer bottles to the table, now a group of friends was drinking and there was a confrontation that made one of them storm off.

Unfortunately not each area can be decorated equally. This level is roughly 1 square kilometer in size, and that’s a lot of space to decorate manually. Luckily there’s a lot of assets that can be used to quickly fill a level while still feeling natural. For this level that was mostly foliage. Using an automatic scatter and a place brush I could easily fill a lot of areas (especially surrounding the level) with trees and shrubberies. This made a huge difference in terms of realism.

Unfortunately objects such as grass and trees can quickly cost a lot of performance when scattered around everywhere. So instead of covering the whole grass area with grass blades, I decided to only place some grass patches on key strategic places, such as near fences or objects sticking in the ground to create a better transition area.

Easter eggs

Another fun thing that I (and everyone here at LuGus) likes to do, is to add lots of Easter eggs in our games. And at first it might actually seem just for silly reasons, but it actually serves a purpose.

Hiding random objects will encourage players to explore the level more. This is especially true for a game like Liftoff, where you can freely move in all three axes so in theory you can almost get anywhere within the game bounds.
It also helps with free marketing, since players are more likely to talk or share something unique they found that other players may have missed.

Lastly with Easter eggs that are visible in plain sight, but require some insider knowledge to get the joke or punchline. It helps create a feeling of connectivity and inclusivity between the player and the game.

Challenges creating the level

Let’s also go a bit more in depth into some of the technical challenges that we faced during the creation of this level.

When working with external plugins you can never expect them to work exactly how you want them to work. And in some cases it will fight against your workflow or your specific edge case. Since a lot of this level depended on the spline tools, there was bound to be some trouble.

One of the earliest issues I had with the road spline tool was that it was impossible to create nice transitions between two overlapping roads. Luckily I could conceal these areas by creating custom geometry on top that looked like road repair patches. But it sure created a lot more work then would be necessary if they would just connect seamlessly.

Another issue we ran into nearing the end was performance. Liftoff is mostly targeted towards drone enthusiasts and not your typical gamers, so that means that a lot of our users don’t have high end gaming computers. This means we have to keep our game as optimized as possible so it can also run on older, more low spec hardware.

While using spline tools to quickly place a large amount of repeating props is nice, they didn’t necessarily work great in terms of performance. To solve this issue, another colleague used a custom batching tool to manually combine several groups of meshes into one. And in this way reducing the amount of draw calls that the game had to render every frame.

This did come with the disadvantage that everything is merged together and the ability to quickly fix certain elements was now a lot harder. And at what point is a level truly finished? Though now Short Circuit was ready to be shown to the general audience.

Conclusion

Creating a drone game brings in all kinds of unique challenges. From both the players who aren’t your typical gamers, to technical problems that are caused by the unique gameplay.
But when you see people explore the level you create for the first time and slowly discovering all the hidden secrets, it makes all the work worth it.

There’s a lot of things I could have done differently, but in the end I’m really satisfied with the end result.

Thank you so much for reading this article and for all of you who are playing Liftoff. I hope you have enjoyed this look behind the scenes and the time/work that is necessary to create a single level. Be sure to let me know your opinions, I would love to hear what you all think of this!

If you like this article and would like to see more, consider following me on my twitter account @Vincent_Vangeel where I post updates whenever I’m doing something game dev related.

--

--

Vincent Vangeel

Video game artist by day, Indie game developer by night.