After building a couple VRChat worlds this past year, I thought it might be fun to take a stab at building a map for my favorite VR game: Onward. The challenge for me was that instead of a simple immersive experience, I’d also need to develop level design to create interesting gameplay through the use of space.


Valley was the first map I developed. It features two large lanes and a cave network which facilitates crossovers and shortcuts. I tried to emulate the visual style of Downfall, as I find it to be an iconic map for the game but it plays as a very large open expanse. Valley is supposed to be its smaller, more confrontational companion.

In an attempt to expand control of the surrounding region, MARSOC needs to capture a Volk camp protecting a critical transportation route.

The development process was pretty painless at first. Laying out the map in Unity was quite similar to a VRChat world with the addition of functional team spawn points, uplink position, and various other elements which make the game modes of Onward work. These were all available from the Onward SDK.

I held my first play test with some friends a couple weeks into development. It seemed pretty fun for my first real stab at level design but I noticed a bug during the play test which ended up being pretty bad. When you would be eliminated the scene did not become monochromatic to indicate you were out.

Although I read the Onward Creator Guide multiple times, my lack of understanding of how shaders truly work and what functionality they provided ended up coming back to haunt me. I was accidentally not using the Onward provided shaders in my map. That was why the scene was not turning to greyscale and night vision goggles were also not working. It was easy to update the shaders, but upon fixing that issue another feature of my map, the ‘terrain holes’ for the cave entrances, did not end up displaying properly.

To solve this I had to learn a bunch of new things, which I am now grateful for but definitely set back my development. First I had to convert my ‘Unity terrain’ into a mesh. Then I had to bring that mesh into Blender (which I had to learn the basics of first in order to operate) and cut the cave holes back into the terrain. I will spare you the details here but I eventually got the map working properly after another week or two.

A bit worn out, I then decided I would rather go through the process of publishing the map and iterate on feedback I got live rather than continue to make changes mostly speculatively.

Publishing was easy and done directly from Unity. New maps are reviewed once a week by the Onward team. The Onward team and other custom map creators (shoutout to Evolution) were very helpful and would seemingly eagerly answer my questions.

I published for PC only at first because I wanted to take more time to craft the Quest version, as the limitations of the device create much more aggressive constraints on what is possible.

After I submitted Valley I started working on a night version of the map. I used the same basic layout but lit the map with lanterns and increased the fog for reduced visibility.

The night version ended up being a lot of fun for AI Hunt rounds. I also ended up discovering a bug with how Evac rounds worked with custom maps that I reported back to the Onward team.


After play testing my first map Valley, one of my concerns was that it just felt too simple. My friend Hauz had pointed me to an article about level design which included a quote from Sid Meyer:

a game is a series of interesting choices

I quickly started thinking about a map that simply had more choices for the player. I was drawn to the repetition and aesthetics of parking garages. I started to think how could I create lanes of activity in that environment and how to break them up. I made some early sketches.

It still felt too simple. I started prototyping it in Unity and then I realized, the level would feel infinitely more complex if the attacker player needed to figure out a way to get to a second floor to capture the Uplink. So I carved out two ramps and two stairwells, as well as an elevator. 

I tried to balance the implied danger of each route with the physical locations of the access points. The two ramps were the most exposed and the most obvious and provided the most direct route to the objective. The stairwells were the longest path with choke points but also the furthest away from the defender spawn on the second floor.

The elevator was nearest to the attacker spawn but also a dead giveaway to the defenders because they would easily be able to hear when it arrives, so I also added a van which had been involved in a crash so defenders wouldn’t have a direct shot on the elevator easily. I also placed the elevator behind the defenders hold position so an attacker could possibly take the elevator later in a game and stir up the defensive positions from behind.

On my first play test with friends this map immediately stuck me as a strong map. People were having fun trying to figure the lanes out and different matches ended with very different play styles and outcomes.

Stylistically, I tried to push more into that dark and tense feeling I see in games like Escape From Tarkov. Where seeing an enemy isn’t completely obvious. It seems to add tension to the suspicious corner peaks around doorways and support pillars.

I also tried to build this map as lean as possible so it would be an easy port to Quest. It truly is a constant tension when adding assets for realism vs having the best performance in VR. 

Missle Silo

Although still very much an amateur, I felt like I learned a lot about level design from my first two experiments. So for my third map, I really tried to do a great job creating some complex interactions. I also tried to really up the visual quality of this map as well.

This map is definitely my favorite of the three and was really fun to make. I loved playing it with my friends and felt it actually played really well.

That being said, I definitely got above the limits of my technical skills with this map and was never able to successfully pair it down enough to run on a Quest headset. I learned a lot about occlusion culling and other techniques as an attempt to increase the performance on the mobile platform, but in the end I just ran into too many challenges to complete the project for anything other than PCVR.

I haven’t been playing Onward much lately, but I learned so much working on these maps and still feel really proud of the work that went into them. I think for my next project I may go back to VRChat and try to bring this new knowledge with me to create more interesting environments with more interaction.