[Theta Legion VR] Designing the first level



The first assets we brought in engine, to test level layout, texture pipeline, and general navigation

After having mocked up a test environment in VR and tested the player locomotion, Nick and I decided that it would be best if the player always had clear navigation routes to minimize the turning around and moving, that can trigger motion sickness. We also realized that levels with different height variation could also be triggering discomfort for the player. Making sure that our level would be simple to navigate, flat, and offering players a clear route ahead became my design brief for our first level. Guess what offers a clear route ahead? Corridors!


We were very adamant about having a shooter with real “locomotion” (no teleports). Our take on the VR induced motion-sickness is that it’s mostly happening when users are turning and weaving left and right. Therefore we built our levels to minimize as much as possible these types of lateral motions and always offer a clear path ahead. Of course, turning will have to happen, but we would try to be clever about it.


If there is a visual trope in Sci-Fi movie, it has to be the almighty “corridor” – from Star Wars, to Alien, including  2001 Space Odyssey, a science fiction movie worth its salt should feature one or several scenes shot in a long, climatic corridor.

Several websites cover the topic, like this one, or this one, or even this one, and every environment artist at some point (including me) tried to generate an inspiring corridor.

Finding material to collect for my moodboard was trivial: in fact, the real difficulty was to make a decision on what type of corridor I would build, how intricate it could be, etc.

I spent pretty much every night after work watching classic sci-fi movies to get inspired: Alien, Outland, Star Wars, Pandorum, the Expanse and the likes were back on the menu!

I made a quick sketch of how I wanted the level to be distributed: I wanted the level to feature two long corridors (where enemies would line-up for the player to shoot at) separated by a large room allowing waves of enemies to attack the player.


As for the cabin, the entire environment was modeled and assembled in 3D Studio Max.

Again, the poly count is kept to a minimum both for optimization and aesthetic purpose: the whole level barely reaches 11K vertices. The level floor and walls are box-modeled, with a flip Normals modifier and all the “furniture” and design elements for the level are modular pieces that will allow me to set-dress my level and give it character.

I went with a slightly more complex layout than I planned in my original sketch and added a second room, as the first one was a bit cluttered and would not be very conductive to a “enemy wave” type of fight. I also wanted the wave attack to be completely at the end of the level, to offer some sort of climax to the player experience.


All the different modular elements got their UVs flattened and grouped in one big UV sheet.

The UVs may look like they are packed with some obvious gaps, and while it’s true, there are two reasons:

  • Because of the pixel art aesthetic I wanted to make sure all the textures would have the same relative scale, so that some pixels are not bigger than others.
  • I wasn’t completely sure that I wouldn’t need to create additional modular elements, so I saved some space on the fringes to account for additional elements.

Unlike the cabin, however, the floors and the walls are composed of individual texture tiles: this saved us from having another big image with the UVs for the floor and walls. However, this decision also prevented me from having custom elements on some walls and floors, so for specs of blood, or wall decorations, I used overlapping quads that would carry the single detail.


As I mentioned prior, the entire level was assembled in 3D Studio Max. To this day I am not sure if it’s the best choice, or if I should just import the modular elements in Unity and assemble the level there (which is what I used to do for other games).

However, all the lights are placed in Unity, as they have to be game objects, baked, etc.

I wanted every section of the (small) level to have a strong color identity. While my textures are mostly composed of neutral greys, I knew I would play with light color and temperature to vary the mood of my level. I have 4 lighting moods in the level so far:

  • Dimly lit brown/beige by using a slightly yellow tinted light, that allows me to convey a sense of grittiness and a feeling of wear and tear.
  • Barely lit blue areas that would convey the “tech” nature and where the light would appear generated by the computer screeens glow.
  • Red area that would announce closed doors and usually precede fight sequences. The red (which is actually a very saturated orange, as I hate using basic red in lighting) appears to be generated by the lock screen nearby doors.
  • Almost unlit areas, with deep browns tinted of blue, as I have a blue exponential distance fog setting that allows me to neutralize the warm colors over distance.

As usual, balancing the lights, making sure that they are casting just the right amount of light, baking them and testing the level every time I do a change was one of the lengthiest part of the level design. But if the lighting doesn’t feel right, I know that the whole level will fall apart, particularly in VR.


As I mentioned, I’m using a good amount of lights to create the right mood for my scene. The number of lights I use don’t really matter, as my lights are baked into lighmaps and none are rendered in realtime. I however need a few realtime lights to create some subtle changes for my gun. I placed a few real time lights at “strategic” locations (by this, I mean where the user would expect a strong light casted on his/her weapon). These lights have no effect on the level and only render on the “Gun” layer: this means that everything that will be on that layer will be affected by those dynamic lights, but nothing else.


Being our first level, we wanted to make sure that players would feel guided and that the game mechanics would be introduced in a non-aggressive manner to our users.

First, the entrance corridor allows players to get familiar with movement. The corridor naturally guides players to the next room, as well as the lighting (the corridor is dark and the next room more brightly lit, naturally guiding players eyes towards their destination).

The next room is a transitional space, peering to the first locked door, and the first enemy encounter. A health pack will allow players to recuperate after that first firefight.

A small corridor leads to the control room, where the keyCard to unlock the door is located. This card is also guarded by 4 enemies, allowing us to ramp up the action and provide the first challenge to the player. A health pack is conveniently located to allow the player to recuperate.

Once unlocked, the door leads to a service corridor that include 3 more enemies, and a keyCard to open the last locked door.

This door leads to the last area of the first level, the Lift room. Entering this room will trigger a wave of 20 ish enemies that will attack the player. After defeating all enemies, the player can replenish their life with the Health pack located in the room, and exit through the lift.

The level is designed to provide gameplay between 5 and 10 minutes, and most importantly, guide the player through the core mechanics of our game: Explore, collect cards, unlock doors, shoot down enemies, progress to the next level, wash and repeat.


One bit of optimization we did was to restrain from using Mesh colliders: they can be expensive to use, and create a lot of occasions where the player may end up being “stuck” in the geometry. Instead, for most assets, we manually laid down box colliders, significantly simplifying the collision calculations that Unity needs to do.

We only kept mesh colliders for complex objects, so that the hit detection of the player shooting at things wouldn’t look too “off”.