In a previous blog, I discussed my thought process of level design. We thought it would be fun to take an in-depth look at what goes into building a scene. This past week I have been documenting the process of creating a scene. After viewing the 3d environment art our team had created, I was very excited to start working on the scene The Desert of Marzule. I loved the aesthetics and knew this would be a fun scene to put together.
Each scene is broken up into several parts that we call sections. By splitting the scene into sections, this allows us a lot more customization for each section, as we tend to focus on one small portion of the scene at a time. Also, from a performance standpoint: this allows us to limit the amount of 3d assets rendered on screen at any given time. There is never more than 3 sections visible while playing the game. This greatly helps to improve performance on some machines. When building a scene I can deactivate and activate sections to work on whatever I need, so this helps with efficiency inside the engine as well.
We start out with a blueprint of the scene: which outlines the section with dimensions for the tile set and small notes on what is supposed to go where. When I implement the 3d tile set into the engine I follow this blueprint. The hardest part of creating the blue print for the Desert was making it interesting and have it feel very open. While creating the blueprint I need to think about various factors such as how high or deep I’m making gaps or pits, and whether I’m going to be using a bridge and how long of a bridge I’m going to use. Another important thing when creating the blueprint is thinking about depth. Even though I wanted the desert to feel very open, I couldn’t just set a static depth in the foreground and background, as this may feel very repetitive to the player. I needed to bring things closer to the player while still making it feel open to give relief to the eye. I achieve this by constantly variating the foreground and background depth.
Before I start connecting the tile pieces to create the basic outline of the scene, I organize everything into folders within the engine. In The Desert of Marzule, there are 16 different sections which I create a folder for. Within each section folder is a series of sub-folders for tiles, colliders, enemies, and props. Within the props folder I have further subfolders for each group of props, whether this be rocks, plants, trees etc. For some props, like the rocks, I combine the meshes using a script, which reduces draw calls and helps improve game performance.
Each tile is an even integer in length/width which makes it easy to connect everything. We designed it this way for efficiency. Early on, we ran into an issue with Unity after I started working on the scenes. For some reason if I copied and pasted tiles and connected them, their position or rotation might not match up on an even integer. For instance, if I had a tile placed at (-2,0,0) and I copied the same tile and placed it at (-4,0,0), it was not uncommon for Unity to display the tile at (-3.9978,0,0) or some arbitrary number close the integer value. This was a problem because at times you could see small glitches between the tiles where they connect, and/or at certain lighting it would look like there is a crack between the tiles. We resolved this problem with a simple editor script. Sterling wrote a script that forced every tile to round its position and rotation to the nearest integer. By doing this, anything that Unity was forcing to be off by a small floating point value he would round to a whole number and thus, everything would then connect seamlessly. A copy of this script is below, should any other developers find it useful, feel free to use it.
When building the outline of a section I don’t advance to the next section until I have placed all the tiles and the colliders. Colliders allow the player and enemies to move in the world as well as collide with objects. There are five main collider types and two of them need special tags. There is floor, wall, ceiling, wall jump, and ledge colliders. Wall jumps and ledges are the two that need specific tags as these tags call for animations into action. The wall jump collider is self-explanatory in that the player can wall jump on these types of walls, and ledge colliders allow the player to hang from ledges.
The last thing I do is place props, which make the scene come to life. After placing all the props throughout the scene, Sterling reviews my work, makes notes and then I go through and make a second pass at everything. Then he does another check and I make a final pass. It’s a long process, but the end-result is truly something special and I look forward to players enjoying these scenes.