In less than half a day I had completed one environment, lit two different ways.
No starter content or marketplace assets were used.
Most important, I now have a workflow to share with you.
In this tutorial I will cover an overview of what it took me to construct "UE4: The Corridor Project" in 10 hours.
If you want to follow step-by-step, hour-by-hour breakdown and learn the specific techniques that were used to create this environment then I highly recommend you take a look at "UE4 The Corridor Project" video tutorial series.
Grab yourself some coffee or tea and let's get started.
Hour 0: Preproduction and Outline of the Project
Prior to starting this project or any project, I spent some time outlining a plan of action for what I am going to do.
The idea is to create an office building floor using existing Static Meshes while focusing on small section of the corridor/hallway. This environment will contain no gameplay elements and it will be constructed with custom Static Meshes.
Static Meshes Used:
I created a set of custom assets (Static Meshes, textures and materials) prior to 10 hours of construction:
Any set of Static Meshes you use will inevitably limit the type of environment you create, a particular environment setting.
There are few options to constructing game environments with Static Meshes:
- One: you have a specific idea then you look to find a set of Static Meshes that would fit that idea. For example your idea is an urban back alley of a city block. You look to find Static Meshes that fit your environment theme and setting.
- Second: you have no ideas for an environment. You would look through available Static Meshes and generate ideas based on what you see.
- Third: you have an idea and decide to create your own Static Meshes from scratch. This is most challenging and time consuming option but you create exactly what you want and need with unique set of Static Meshes.
- Fourth you have someone else you are working with to create Static Meshes for your idea. A friend, a joint project, a volunteer, or an environment artist on your team. You tell them exactly what you want while you focus on blocking in and construction of the environment.
For "The Corridor Project" I chose option 3. This took some time to complete and was done prior this environment construction.
Once Static Meshes were done, I brainstormed few ideas based on the theme and style of these assets.
Constraints and Limitations:
Due to the amount and type of Static Meshes I am limited to what I can create. I have to construct an environment within the given constraints of the asset's theme.
Constrains and self-imposed limitations are good for creativity of your project.
"Telling yourself you have all the time in the world, all the money in the world, all the colors in the palette, anything you want - that just kills creativity." - Jack White
Constraints are a part of any project you have and will work on. For example if you are creating a level for an existing game then you are limited to the gameplay mechanics of that game. You have to keep the world, theme and story consistent to that game.
Any time you are creating a game environment using a set of textures, materials and Static Meshes you are constraining the project to support a specific idea.
Constraints can be imposed onto your project externally, such as by specific game, by a client or by an art director.
Constraints can also be self-imposed, such as setting a time limit, limiting the scope or size of your environment or poly count.
Static Meshes for this project create a set of constraints that I have to follow. It forces me to think within a given framework of a specific theme and location - which helps with making decisions.
Research and Reference:
I collect photo reference of various locations of office building floors, modern interiors, building lobbies and corridors/hallways:
Photo reference is always an important element of preproduction. You have to know and understand what you are going to create.
I always create a top down layouts. No matter how small the environment is. It helps to get clarity of the floor plan for the environment I am building.
I sketch top-down layout of the corridor:
Anytime you create an environment, you should define a focal point.
Focal point is a visual point of interest of the level or a location. It is a visual landmark. It also serves as a way to help the player orient themselves in the world.
Since "The Corridor Project" is only a small section, I didn't have much to choose from.
Focal point becomes the main corridor; it is where I will focus all of my time and detail in.
Naming the Project:
Few names were brain-stormed and I decided to go with "The Corridor Project". Originally I had it named "The Hallway" but it didn't sound as cool as "The Corridor".
Planning the Work:
I gave myself half a day to complete this environment. 12 hours was the goal, which allowed some time for breaks.
I outlined 10 hours into 1 hour chunks. Each hour had a specific purpose that I would complete.
With that I am ready to start.
Hour 1: Project and Editor Set Up
First hour is very short. I could have incorporated the preproduction Hour 0, and combine it with Hour 1.
I open UE4 Launcher and I create a new project.
I start a blank game template and do not include Starter Content. I want to have a completely clean project:
I copy/paste "The Corridor" assets into the project's Content folder.
If you have downloaded a set of Static Meshes form Learn or Marketplace tab, you can add them through Library/Vault section. You would choose "Add to Project" option and place these assets into a selected Project.
With custom assets that weren't downloaded from Learn/Marketplace tabs, I had to do this manually.
I placed 3 folders: StaticMeshes, Textures, and Materials into Content folder of "The Corridor" project:
3 folders appear inside the Content Browser of the project:
The directory and folder location I placed them in was important. Otherwise the material and texture associations would be broken.
Launching the project inside Unreal Engine for the first time I need to turn off Auto-Save.
I like to manually save my maps and content:
I create a new default level:
Reason I use this default level and not a blank level due to already included actors such as Atmosphere Fog, Directional Light and Sky. It will save me some time during block-in process.
I save this map as ‘TheCorridor-01-BSP':
This is the name convention I use when saving maps:
- Name of the map/level – Version # - What I worked on in this level (no spaces)
I am now set to begin BSP block-in.
Hour 2: BSP Block In
BSP block-in is used to prototype and create a layout of your environment without being distracted on visuals and details.
During BSP block-in, I am judging scale, proportion and defining the layout of the level.
Using top-down sketch, I start by inserting a ground plane, I then insert a skeletal mesh reference to judge scale. You want to always reference construction of a level to player character in-game:
Now, this environment isn't going to be playable but it's important to always build to human scale reference. I use the yellow default dude, but there are other options such as a BSP box with same dimension as player or a free Skeletal Mesh Mannequin downloaded form Marketplace Section:
I block in the floor plan using the top-down sketch, with slight layout modification. I also include stairs during the floor plan block-in:
Now sometimes I block-in the floorplan like the image above. Other times I focus on a single location to block in where I include the walls, ceiling and windows right away. So the block in process varies but the end result is the same - to use BSP brushes to prototype the environment.
Using the BSP tab, I insert regular stair brush and change the size to match dimensions for reaching the second floor. To add a bit of visual interest, I decide to split the stairs to include a flat landing as it leads to the second floor.
During BSP block-in you are not trying to build with exact size dimensions of all floor panel and all the walls. You are doing your best guess approximation to what looks right in the editor and in-game.
Average height dimensions for a wall are 300-400 units, so I use that as my starting point. I block-in all the walls using the BSP floors as my guide:
At this stage I use Geometry Editing mode a lot. I duplicate BSP brushes, hit Shift+5 and change the size of that brush by moving faces, vertices and edges:
Second floor is added to create an illusion that the environment continues beyond the main focal point of the corridor.
I move to adding ceiling and columns:
With BSP block-in, keep all geometry very simple. I avoid adding any unnecessary details.
Use simple geometric shapes to define the skeleton of the environment to resemble what you want final layout to look like.
I then, use subtractive brush to carve out where the windows are going to go. The shape and size of each window frame is an approximation. Final design of where each window and frame location will be is determined by Static Meshes:
For last part of this hour I jump into the level to test proportions and scale.
You will notice that I have incorrect lighting. During this hour I am not paying any attention to how the level is lit. I am only focused on BSP layout and proportion.
In perspective viewport, I right-click on the ground plane and choose "Play From Here" to spawn inside the level:
Everything looks good. The size and proportion feel right.
I save the map as a new version and move onto the next hour.
Hour 3: Static Meshes
Hour 3 is about Static Meshes.
I will replace all brushes with Static Meshes. BSP is used as a guideline to place Static Meshes.
I insert floor Static Mesh and duplicate it to align for the rest of the floor plan, including the second floor:
I also delete BSP brushes for the ground plane.
Next are the stairs. This will help to make sure that the stairs will lead up to correct height onto the second floor before I add any of the walls:
Once the floor and stair have been added and align to each other, I move on to the walls, windows and column:
I make sure that all walls now line up to the floor static meshes, like so:
Remember BSP brushes are layout guidelines. I want all Static Meshes to snap and align properly but to other Static Meshes.
I work snapped to the grid at 50 and 10 unit increments as I continue to Mesh this level:
Now here is a decision I have to make.
- Do I align each wall to each other and place column Static Mesh intersecting both walls?
- Do I align each column to the wall and have no intersecting Static Meshes?
First option is to make sure that all the walls align to the floor without creating gaps. Then, I would place columns right in the middle - intersecting Static Mesh wall (note: it is completely fine to have meshes intersect each other in UE4). This option would hide edges of the wall and I don't want to lose that detail:
Second option is to leave a gap for the columns to fit in-between each wall. No column intersections and you get a full wall mesh. Minor problem with that is I would need to compensate by adjusting the repetition of walls to the floor, since now they would not align:
I choose the second option.
I add walls, inserted columns in-between each wall and expand the floor to compensate for misalignment of floor and walls:
I do the same steps for windows:
All BSP brushes are being deleted as I am working with Static Meshes for that section.
I add Static Mesh ceiling:
At this point, I do not have any BSP brushes left and everything is now Static Meshes, yet it retains the same feel, dimensions and correct proportion as it did with brushes.
I don't have any doors or doorframes inserted yet, this will be done in hour 4.
I do a final check and move on to hour 4.
Hour 4: Detailing
In hour 3, I used major architectural Static Meshes such as walls, floor, ceiling and stairs to block in the corridor.
Hour 4 will consist of using minor architectural Static Meshes for detailing. These are doors, signs, pictures, column supports, decals and other decorative elements.
I begin by replacing Static Mesh walls with doorways and doors:
Then I add visual architectural variety to a currently flat ceiling by with concrete support beams:
I add additional columns to the bottom of window walls for detail:
I swap few Static Mesh wall materials with a different material to add more visual texture variety:
I insert lighting strips; which are an essential detail of this environment. These are emissive light strips that will be used for visual aesthetic and as a functional element to light the scene.
I place these on the columns along the corridor:
I continue with decorative Static Mesh elements. Such as flower pots and plants, wall paintings, exit signs, trash can and ac vents:
Last part of the hour I add major and minor decals work on the floor and walls.
Major decals are the number signs and text:
Minor decal work is the imperfections and dirt on walls and floor:
As modern and clean this environment type might be I still don't want it too pristine. Dirt decals help to introduce imperfections.
Before/After dirt decals:
The time you spend on the dirt pass with Static Meshes and decals will be determined by the environment's location and theme. For clean modern levels, the imperfection/dirt pass will be more subtle while an abandoned building or street corner will require more time and more Static Meshes.
I'm ready to move to hour 5, pre-lighting prep.
I may still have to adjust, move and fix a few things as I continue, but each hour I aim to get 80-90% done before moving on.
Hour 5: Pre-Lighting Prep
Pre-Lighting prep's purpose is to make the environment ready to be lit for hour 6 and 7.
I delete Directional Light, Atmosphere Fog and Skybox. I will re-insert and focus on these actors in the next hour.
I add Lightmass Importance Volume. This will help to define the area within the world where I want Unreal Engine to focus its lighting calculations. I edit Lightmass Importance Volume (Geometry Editing) to surround constructed level:
I insert a Sphere Reflection Capture; this will render environment reflections. For such a small location I place only one reflection actor:
I keep the Player Start. This defines a location in the map where a player character will spawn from. Player Start isn't important for this environment, since this is a non-playable level. But, it's good habit to include at least one Player Start within your map.
With all default actors deleted, I rebuild lighting:
I now have a completely dark scene, with the exception of light strips. These are self-illuminated lights that use emissive material property:
Corridor environment will be lit with two lighting scenarios:
- One: exterior lighting scenario - daytime lighting using Directional Light
- Two: interior lighting scenario - night time lighting using Point Lights and Spot Lights
I save this level as two different versions:
Onto hour 6.
Hour 6: Exterior Lighting Scenario
Focus for hour 6 is to light the environment for daytime.
Prior to working on any lighting, you should spend time on lighting research and collect reference for what type of lighting you are after. What color palette are you going to use? What time of day are you going for?
First thing is to insert primary light which is the dominant light of the environment. In this case it would be the sun.
Directional Light is the sun light actor in Unreal Engine.
I insert Directional Light and change the angle to have light rays come through the window into the corridor casting nice long shadows. Light and shadow repetition is an important element I am looking at:
Three properties I focus on for the Directional Light are color, intensity and indirect lighting intensity:
I change these properties then rebuild lights. I do this a few times to achieve the results I like.
Lighting workflow will include a lot of rebuilding, changing properties then rebuilding again.
I usually take a screenshot before and after each rebuild to compare the difference and it is an essential part of my lighting workflow:
[GIF] Lighting progression w/Directional Light only; changing Intensity and Indirect Light Intensity
I insert Post Process Volume and enable "Unbound" property. This sets up the post process to be universal across the entire level:
Post Process will allow me to change scene colors, bloom, depth of field and many other settings. Although focus of this will be in hour 8. Right now I need to update Auto-Exposure/Eye Adaptation Post Process settings to:
- Min Brightness: 0.1
- Max Brightness: 2.0
- Auto-Exposure: Disabled
Work with your primary light first. Light the level as best as you can with this one light, then add secondary and fill-in lights.
Once I like the result of the single Directional Light (primary light) I expand to adding Point Lights/Spot Lights (secondary lights) into the hallway as well as various fill-in lights.
Secondary lights support and compliment the main primary light (Directional Light in this case).
Emissive lighting strips give off some light into the environment. I had to enable this property in the Static Mesh Details panel and turn on "Use Emissive for Static Lighting":
I insert Point Lights to provide better control of how the corridor is lit. The secondary Point Lights are placed inside the corridor:
I am using complimentary color palette here. With warm orange hues coming from the exterior sunlight and the corridor main corridor lights are cool blues. This complimentary color scheme adds depth to the environment:
The rest of the lights are small fill-in lights. These lights are static with very small influence radius and intensity. Fill-in lights are positioned near elevator door, side hallways and upper floor:
For exit lights I use spotlights with very low radius and intensity:
I continue to rebuild all the lights on Preview and take screenshots to compare before and after. Every once in a while I will build on Production to see what the environment looks like on highest quality.
With exterior light scenario almost complete, I need to do the same for interior lighting scenario.
Hour 7: Interior Lighting Scenario
For interior lighting scenario (night time setting) I will use Point Lights and Spot Lights as primary lights. I've already collected reference and have an idea of what I am trying to achieve. Just as in exterior lighting scenario, lighting reference is extremely important to your production.
I open previously saved level that is completely dark with only emissive material from strip lights illuminating the hallway. These light strips are not enough to light this night time scene to exactly how I envision it.
I would need to use Point Lights and Spot Lights. I am going for monochromatic greenish color palette. Focusing on primary lights or the main strip lights along the corridor I insert the first Point Light. I change the light's color; intensity and influence radius then build lighting:
I want to get this one light to look good before I duplicate it along the entire corridor. I position this one single Point Light in front of the column light strip and rebuild lights again:
Once I'm happy with the single Point Light, I duplicate it across the entire corridor and build lighting again:
The intensities of all duplicated Point Lights add up, so I need to lower their intensity to a lower value. I select them all and change intensity; this updates the value across all the Point Lights.
I continue to take screenshots to compare before and after each build:
[GIF] Lighting progression with Single Point Light to Static Mesh Emissive to Multiple Point Lights
Just as in previous hour, I insert Post Process Volume and enable "Unbound" property. This sets up the post process to be universal across the entire level:
I need to update Auto-Exposure/Eye Adaptation Post Process settings to:
- Min Brightness: 0.1
- Max Brightness: 2.0
- Auto-Exposure: 1.0
I duplicate the corridor's Point Lights to the second floor:
After testing, rebuilding and updating main primary Point Lights I move to secondary lights.
I include secondary lights all set to "Mobility: Static" along the corridor near the windows. All these lights have the same color as main lights but with extremely low intensity and radius.
They provide additional lighting near the windows, stairs and on second floor:
I also add additional filling lights in the stairway and next to elevator light:
For exit lights I add the same Spot Lights with low intensity and radius as in exterior lighting scenario:
To add additional detail to this lighting scenario I include resized light strips in the door frames and above wall paintings:
Another small detail I add is the moonlight coming through the windows. For this I use a Directional Light with very small intensity and blue color to simulate moon light:
[GIF] With and without Directional Light with very low intensity to simulate moonlight
There was a lot of time spent on building lights, changing its properties, building again and screenshot comparing before and after to find the correct values and final result I'm happy with:
[GIF] Interior lighting progression
Hour 8: Post Process
In this hour I work on both lighting scenarios to include Post Process and Atmospheric Fog.
First, I insert Atmospheric Fog into Exterior Lighting Scenario map. This actor provides me with a sun dome, sun disk in the sky and some atmosphere:
Although for better fog control, I recommend using Exponential Height Fog.
There is one setting I need to make sure to enable. Select Directional Light and in details panel turn on Atmosphere Sun property.
This parents the angle of Directional Light to match the sun disk from Atmospheric Fog anytime you change the position of the Directional Light:
Exterior light scenario gets Atmospheric Fog, but not interior lighting scenario.
With Post Processing I can change scene colors, contrast, brightness, fringe, grain, bloom and saturation.
I already have Post Process Volume in the level to adjust Auto-Exposure. This volume will also control scene color.
You can adjust Post Process manually through details panel:
For The Corridor Project, I use color grading, which allows greater control over changing scene color. This is first enabled within the Post Process Volume:
Then, I build everything on production lighting and take a screenshot. I open this screenshot in Photoshop and use layer adjustments to change how I want this scene to look:
Building on Production quality for Post Process screenshot is optional. Reason I do this is to avoid image artifacts which are unavoidable when built on Preview.
In Photoshop I adjust levels, brightness, contrast, color and saturation. Then I save a small image called LUT or "look-up table" which now contains the changed color information. I have one of these images for Exterior and one for Interior lighting scenario:
Once I import this LUT image into Unreal Engine 4 and enable Color Grading while using LUT image, the scene inside the editor will look exactly how it looked adjusted through Photoshop:
I finish up by adjusting some more Post Process settings in the details panel such as grain, fringe, vignette and bloom:
I used color grading technique for both of the lighting scenarios:
[GIF] Exterior Lighting Color Grading Before/After
[GIF] Interior Lighting Color Grading Before/After
Hour 9: World Settings and Build All
For hour 9, I focus on World Settings and building the level on Production quality.
Under World Settings I focus primarily under Lightmass settings. Some properties include Number of Indirect Lighting Bounces, Indirect Lighting Quality, Environment Color and Ambient Occlusion to name a few:
To see World Setting results in editor you have to build lighting. I follow a workflow of:
- take a screenshot
- change a property
- take a screenshot
- use screenshot to compare before/after
- continue to another World Settings property
I do this until I make the environment look as best as I can while trying to keep the build times down.
I change World Settings for interior and exterior lighting scenario.
Once I am happy with the changes via World Settings, I build on Production lighting quality:
Here are some progression shots from default World Settings to updated/tweaked World Settings:
[GIF] Exterior Lighting World Settings Progression
Hour 10: Flythrough and Screenshots
For the final 10th hour I focus on creating a video flythrough and taking high-res screenshots.
Video flythrough is done completely inside Unreal Engine using Matinee editor.
I create a couple of cameras, set up few key frames and render out a video fly-through:
In Unreal Engine 4 you can take screenshots that are the size of your screen resolution or you can take high-resolution screenshots.
For screenshots I spawn into the level using "Play From Here" and fly around to position the camera for interesting angles and composition. Then I enable the console with tilde key, ~ and type in "HighResShot", without quotes:
For super high resolution you can type "HighResShot #". Input a value for the # such as 2; which is how large you want to multiply the highresshot.
Once the flythrough and screenshots have been captured, I am done with this project.
The final result includes one single environment that is lit two different ways.
10 hours was the framework and a self-imposed limitation for this project. Your time will vary depending on the size of the environment and scope of your project.
I wanted to spend most of my time inside Unreal Engine 4. So my focus was to use existing Static Meshes and complete a small part of the location. I also did not want to focus on any gameplay elements and strictly work on creating a game environment.
Recommended UE4 Tutorial series
Here is the full "UE4 The Corridor Project" in a step-by-step process.
UE4 The Corridor Project: this is a bit more intermediate/advanced tutorial guide in which you construct a game environment with provided custom Static Meshes, then light it, post-process it and create a fly-through video to show it off. An in-depth guide for putting together an environment from start-to-finish. Click here for more info...