Level Design - Overview
In my role as level designer I spend most of my time planning the layout of the level and creating unique and thematically accurate models to fill the space. An top of creating accurate models I also have to incorporate multiple game design principles into my work. These include:
- Conservative use of polys to improve performance. The framerate of a game is heavily dependent on the number of surfaces the engine has to render each update call. Cutting down poly counts is an easy and reliable way of increasing performance without much extra effort and time.
- Correct normals and polygon culling. The "normal" of a surface refers to which side of the surface the engine will render. Ensuring all models have their normals correctly calculated is important as sections may disappear (or be culled) when viewed from certain angles.
- Checking for ngons(non quad or triangular polys). Ngons cause visual deformations at render time, which play havok with texturing. Avoiding ngons in models is a must.
I also spend quite a lot of my time texturing the models I create, which helps greatly in adding detail to the models without the use of more polys. The main challenge here is finding a balance between visual texture quality and the resolution of the texture, as higher resolution textures may look sharper, they can pull performance down heavily if not kept in check.
Follow this link to return to the landing page.
Paper Prototyping - Creating the prototype
I took ownership of constructing the paper prototype and decided to build the entire thing out of Lego. This made it much easier to make adjustments on the fly and the final product looked much truer to form than if I had have built it from paper or cardboard. The first image below is the initial prototype I built, the second image is a revised version after getting new pieces and feedback from John and Niall.
I also built a spreadsheet using Excel and VBA to generate random values from our opening and closing doors, as well as visual graphics to keep track of these values during playtesting, which I have included a screenshot of below.
The "Make Turn" button increments the "Turn" counter. Every 5 turns there are random numbers generated for each of the doors on the map. If the number is below 45 the door will change its value.
The "Cycle Red/Blue" buttons generate a random number between 1 and 5 to determine each robots new patrol waypoint.
Paper Prototype - Issues and Solutions
Below I have listed some of the issues I had building and testing the prototype:
Testing a realtime game in a turnbased environment
Testing our gameplay mechanics through the paper prototype was difficult as we were building the game to be realtime but to be able to test with the prototype we had to play as if it was turn based. To approach this problem I made a number of changes to the gameplay:
- All characters (player or enemy) had a baseplate attached to their piece to denote how far they could more in a single turn.*
- The robot characters always take their turn after the player, allowing them to react to the players actions.
- A short timer was placed on turns to push a sense of urgency about players making decisions.
*Baseplate referenced in point 1
Having a birdeye view of the map
This was an issue that had no real solution but to tell players "pretend you can't see that". The issue was that because this was a board game the player could see where the robots were at all times, meaning the paths they took and decisions they made would be influenced by where the robot was, even if it was "hidden" behind a wall. For the most part our playtests were happy enough to pretend they couldn't the robot but it likely still led to some bias.
The game was far too long
From starting to set up the level to having a full play through done, it took nearly half an hour to play through the whole prototype. Initially this limited our ability to get full playthroughs completed as our testers was often disinclined to sit and play for so long. To resolve this we split the level up into different sections, or checkpoints. Depending on what area we needed feedback on the player would start at a certain checkpoint, which could be halfway through the level, and play on from there.
Technology - What I used
I opted to use 3DS MAX for my work on this project, primarily as it is far more focused on architectural modelling, rather than animation (like blender/Maya). 3DS. offers a great many automated tools to help with modelling static meshes and suited my work on environmental assets perfectly as I would not be working on animated assets.
While only introduced to my workflow late in the project, I began using MAYA for it's UV unwrapping tool. It was much smarter than the MAX unwrapper and significantly cut own the time I spent editing UV maps. I continued to use the MAX unwrapped for any simple meshes, only going to MAYA for higher poly, more complex meshes.
I have also decided to use Substance Painter for my texturing work. Substance has a large bank materials and effects I can use during texturing, allowing me to give even the most basic of models more detail. I can also save any materials I make as "Smart Materials" which means I can just drag and drop previously made materials onto new models, which suits my modular level design perfectly.
Asset Design - Workflow & Examples
Basic Workflow
- Concept art is designed by either the lead artist or myself for the design of the models to be built.
- Build basic mesh from primitive objects and polygon modelling techniques.
- In the case of the wall sections for the level, all assets were built to strict dimensions so they could be easily snapped together in Unity.
- Meshes are then scanned for ngons and all unneeded vertices are welded or removed. Ngons can cause visual glitches in Unity and prevent proper unwrapping and texturing.
- Meshes are then scanned for unneeded polys. These polys are removed to increase performance. With the consideration of Virtual Reality being implemented, this has become considerably more important due the the limitations VR puts on onscreen poly-counts.
- For basic models I unwrap them in 3DS MAX, more complicated models I bring into Maya to unwrap, then export as an FBX file to import into Unity.
- Models are imported into Substance Painter for texturing. If the model is part of a modular set (for example the left section of a wall) the texture is saved as a "Smart Material" so it can be applied to the other matching modular parts.
- Textures are exported out of Substance and imported, along with the unwrapped model, into Unity.
- In Unity I then set up prefab objects using the model and textures. The prefab system makes instances of the original object and allows me to update all instances of an object in a level at once.
- Objects are then ready for use in the level.
Modular Assets
All architectural assets (walls, floors, doors and ceilings) are built to be modular. This makes building the level very easy as we can simply snap the parts together like Lego when imported into Unity. Below I have listed the additional steps to my workflow when creating these modular assets:
- A general scale for the assets is agreed upon by the team (example: all walls are 3m tall 1m deep).
- Each different type of wall (windowed wall, blank wall or door frames) is built to the above specifications.
- When the full wall is modeled I then split them into separate, 1m wide sections. This lets me snap parts together to make walls longer or shorter (see screencast below).
- For corners or linking pieces the relevant assets are imported into a single MAX scene, oriented as they would be in the level and new models are created to perfectly bridge gaps between these models.
I pay particular attention to making sure all vertices align correctly in MAX to ensure there are no visible seams between models. One issue I have here is that 3DS MAX visual rounds numbers to three decimal places, but actually tracks the position to a much higher degree of accuracy. This means when making these models I often have to manually re-enter position values for vertices to ensure they are exactly where I expect them to be.
Artwork vs Final Model
Initial Environmental Assets
Note: this is not my artwork, I take credit for only the models.
Mechanical Arm
I have created both the models and artwork here.
Below I have included a video showcasing my full workflow for a modular asset. This details modelling and unwrapping in MAX, texturing in Substance and implementation in Unity.
For details on how I use Mayas unwrapper, see the "May Unwrapping Process" further down this page.
Asset Design - Full Workflow Walkthrough
Asset Design - Issues and Solutions
Building modular environmental assets
A major challenge for me was making sure all the modular assets attached to each other cleanly without seams. To do this I had to constantly double and triple check the positions of individual vertices in MAX to ensure they lined up with the positioning on other models. Often I would have to import multiple already constructed models into a new scene just to ensure that the model I was building at the time would align itself properly with it's neighbours. An example of this can be seen in the "Complete Workflow" video at the bottom of this page, where I show building a basic shutter piece to fit into a window frame and the time it takes to do even a basic model.
This modular design also caused some texturing issues. When I initially started learning Substance Painter I found it difficult to recreate materials on different models. I eventually solved this with the use of "smart materials", which allowed me to save the materials I made and re-use them in other projects.
Modular Texture Alignment
A bigger problem I experienced later in the project was using tiled, repeating textures. Below is an example of the interior walls before I solved the issue:
The two issues here were:
- Difference in colour in some textures (see the upper and lower sections of the walls).
- Misalignment of the tiling (somewhat visible on the seam between the upper and lower wall section, tile gets cut in half).
To fix this issue I had to nearly completely overhaul the interior walls. This included modifying to mesh, creating new UV maps and rebuilding all of the textures and materials used, along with a complete re-implementation of the assets in Unity.
- Once in MAX I extended the height of each wall to eliminate the need for the height extensions (pictured above, the lighter textured piece is a separate model). This meant I didn't have to align the texture vertically to suit two separate models.
- When recreating the UV maps, I opted to create separate maps for the tiled and non-tiled areas of the texture (the lower pipes or window frames were given their own map). From there, knowing that all the wall sections were the same width and height, I could align them in the same position on their UV maps knowing the tiled texture would then apply to the same position on each, shown in the picture below:
As shown above, with the to-be-tiled sections of the UV on their own map, I could ensure the the tiled texture would apply to the same position on each map, guaranteeing that the textures would align perfectly. - Having the UV maps aligned properly (as shown above) meant I only had to create one smart material in substance which I could apply to every one of these walls, cutting down on the time it took me to retexture the assets.
- Re-implementing these new walls and their textures in Unity was tedious work and there was no easy way around it. However the prefab system in Unity did help as once I updated, for example, the left window wall section prefab it would update every instance across the level. This meant I only had to update about 10 assets in engine, as apposed to every instance of the asset across the whole level.
Below is the result of this work, with more more consistent colouring and alignment:
Without Lighting
With Lighting
File Size
Initially all the textures I created were 2048x2048, which were gigantic. I scaled down almost all the textures to 1024, or even as low as 512 in some cases where the detail wouldn't be noticed. The only textures that remained at 2048 were VR interactable items. The mindset here was that any item the player would be able to get that close to would need a higher resolution texture as the detail would be more easily noticed.
Level Design - Environmental Story Telling
The Thinking City has a very quiet and tense atmosphere so a character shouting exposition and story details at you throughout the game would break this mood. To combat this I tried to use the environment to tell smaller story details. Below I have included a view of the creature lab, as well as an asset from this lab, the eye test-tube.
This room is meant to be ground zero of the disaster that that overtook the Thinking City. I've tried to show this off with the large containment tanks throughout the area with some sort of organic creature growing inside, with further containment pods smashed open on the ground. To expand on this I've add a hammer outside of one of the broken tube to make it look like it was sabotaged by someone on the outside.
Smaller details like this throughout the level will help convey the finer details of the story to the player without the need to give blatant commentary. This helps preserve the games immersion while giving more attentive players more clues to unraveling the true story.
Maya Unwrapping
Below I have included a short video showing my process for unwrapping in Maya. The most important part of this is how I treat the "glass" mesh.
As each section of broken glass is a copy of the original model they will share the same UV properties. I can use this to my advantage by layering all the UVs on top of on and other so that they will share the same texture, giving me much more resolution to work with when texturing this mesh.
Another, more fundamental, point here is the adjustment of the texel density of the base plate of this model compare to the frame. This is to get the size of the checkering on the base plate to be similar to the checkering on the frame. Without this adjustment Mayas automatic unwrapper may allocate too much resolution to one particular part of the mesh, reducing resolution where it may be needed elsewhere.
Maya Unwrapping Walkthrough
Temporary Level Walkthrough
Below is a link to my full level walkthough until uploaded to youtube:
https://drive.google.com/file/d/1d6zqMjSR808Cl08zUYM-ggd97Zyq4aPf/view?usp=sharing