Hi there! My entry for the Unity Neon Challenge is titled Habitat 09. I’m a huge sci-fi fan, so the opportunity to test my expertise in creating a futuristic real-time environment was definitely a welcome challenge!
First off, my inspiration for this environment is the O’Neill Cylinder, a concept by scientist Gerard K O’Neill. As I had mentioned in my first update, this orbital colony is aptly named for its cylindrical shape, and has the ability to sustain entire populations and simulate its own gravity from centrifugal forces resulting from its own rotation. Many modern games and movies have borrowed this concept. If we could visit such a space habitat, it really would be quite a spectacle, since you’d be able to look up and see other standing upside down above you!
Having that in mind, I wanted to create an environment that shows not only the “trippiness” of being inside such a colony, but also the sheer size and epic proportions of this space habitat, showing capital ships and personal interstellar vehicles mingling together and landing on all inner sides of the cylinder.
Tasks at hand
Alright! Now, with that out of the way, let’s get started with how I built the environment. First off: I used Unity 2017.2, as well as the Post Processing Stack v.1, and of course, Cinemachine. I also used the Unity Asset Store assets listed at the end of this article.
For me, the three main challenges for me in this project were:
The size of the scene. I wanted to be able to show the entire Space Colony from the outside, then zoom into the city and walk around in it. This meant building an entire city, and all the frills that go around it, like capital ships, jump gates, planets etc.
The cylindrical shape of the structure. As you can see in the video, the inner surface of Habitat 09 is cylindrical, which presents challenges in terrain sculpting, as well as moving animations.
Although I had used the Post Processing Stack before, this was the first time using Cinemachine and Timeline for me.
Here are the main things I did for these project, to be able to complete it on time:
Built and placed city "Megatiles" procedurally, then tweaked the close-up viewed portions by hand. I've learnt that part of what makes cities seem pretty from afar is the fact that cities have uniformity with variation (I guess the same can be said of looking at mountains or any other structure of significant complexity from afar). By generating these pieces procedurally and making sure I had enough variation to go with, I had a good foundation to getting a decent-looking habitat.
LOD, LOD, LOD. With the large size of the scene, I had to make sure I was limiting vertex count and draw calls. I found this neat building pack with super low-poly, yet good looking buildings: 53 Low Poly Skyscrapers. I chose to use this one because it was reasonably priced, and quite good looking for the poly count savings. I also used Simple Mesh Combine quite judiciously to combine things like roads, park tiles etc (that alone increased my fps from 20 to 90!)
Characters: I used Morph3D as well as Mixamo Fuse for the vast majority of the characters in my scene. I'm quite happy with both these solutions, although Mixamo Fuse hasn't had a serious update in a while. The upside - it's free for the time being. If it's a high-tech, glossy look you're going for in your characters, you can achieve that look by making your characters wear leather/rubber/plastic and set the metallic/smoothness material settings a bit higher than usual.
While most of the choreography was done using Timeline, I wrote up some simple scripts to control the "unimportant" vehicles - these were cars and ships that just flew around, and in-and-out the habitat, to make it look busier. It really made a big difference in giving the illusion that the habitat was a bustling city.
Using the Post Processing Stack
I liked how Unity’s post-processing stack handled all the commonly-used camera post-processing techniques. In the past, I had a set of my “favorite” tools, and had my own camera controller to manage each of the components, so it’s nice to see all that in one place. In addition, since most of the projects I work on end up using deferred rendering, the post processing stack’s correct handling of things like lighting fog and anti-aliasing (these two don’t usually work “out of the box” with deferred rendering) was a welcome convenience.
As for my choice of post-processing components, I went with Bloom, Screen Space Ambient Occlusion, Screen Space Reflection (yay deferred rendering!), Depth of Field, Color Grading and Chromatic Aberration. The pictures below show how much post processing effects can impact a game’s look and feel.
One component that was surprisingly useful to me was the Color Grading component. A few changes to the Exposure, Temperature, Saturation and Contrast can really change the mood of the game.
Probably the best part of Timeline was the ability to: (1) Attach animations to my characters without an animation controller, and (2) see the choreography of all the parts together. I did most of the heavy lifting in Timeline (even animating the UI, as you can see below). It was great being able to see how things went together, right in the editor. A lot of things that were planned in the scene, like having a pack of drones swerve to miss a character, would have been a mess to do by code. I originally wanted to do a scene where a character shot a bullet out, expertly aiming the bullet to go in between moving objects, to hit its target (I did not end up doing that). Things like this would pretty much require a tool like Timeline to implement well, as you'd have to know the precise position of all the actors in the scene.
I used timeline extensively in Habitat 09, having hundreds of timeline objects. I'm pretty familiar in using video editing software, so scrubbing a timeline was something I felt comfortable in doing. Being able to do so in a game engine was great, to say the least.
For Habitat 09, all sound effects were planned explicitly, meaning I don't rely on the audio listener to play sound effects as the camera gets closer - I manually make the sound play, using timeline. Because of that, being able to know exactly where things are in the scene is important. In the scene shown above, everything, including the person running and chasing after the drones, the 'woosh' sound effect that plays when the drone pass by, as well as the placement of the drones getting close and swerving by the camera, was planned in Timeline. I could scrub the timeline back and forth to get the exact placement I wanted.
One thing I did notice was that if you used the main timeline to call other timelines, the other timelines would not play out in the main timeline. This was a bit inconvenient, since in a large and complex scene you pretty much always want to have some timelines built into the actors, so you can have, say, an army of different prefabs that walk forward, that you can drop anywhere on the scene. Hopefully we'll be able to do this later.
In Habitat 09, a lot of events that happen, required some trigger to start them. Right now I'm using a fairly brute-force method to workaround this issue, by creating a class that takes in a Unity event, and enabling a GameObject with that class attached on the timeline, in order to invoke a method. I had originally wanted to implement a more elegant solution for this, but since that would take time, and my understanding is Unity will add this functionality in an upcoming release, this was a good workaround for now.
I also got into the habit of putting my characters into "holders" before animating them using Timeline. If I did that, I noticed that by moving/rotating the holder around, I could move and place the characters where I wanted them irregardless of timeline animation.
Before Cinemachine, I had developed my own Camera Controller which did kind of what Cinemachine did, but I jumped on to Cinemachine after I tried it out. All in all Cinemachine is pretty impressive!
A few things I learned:
Dutch is great when used sparingly, running through alleys or flying through buildings. It really gives a dynamic feel to the scene.
Combining movement using timeline, and either manual rotation, or just Composer Lookat, gave pretty good results. I found out that I wasn't using the Dolly functionality, because I could achieve most of that with a dynamic moving and rotating camera. It seemed like there was almost no "wrong" way to move the camera around (well, there probably is - don't take my word for it). The angle shown below was pretty much done by accident, and I think it looks, well, decent.
You can also implement screen shake using Cinemachine. What I did was write a coroutine to enable the noise Cinemachine component on the active virtual camera for a short time, like about 0.4 seconds. This added some immersion for events like when an object passes by close to the camera, like below (the GIF doesn't show it too well, but you can see that in the final video submission at the start of the article.
The Unity Asset Store has always been invaluable for me to complete projects. Some of the projects I work on are solo efforts like this one. Since most of what I do well involves design, programming and some technical artwork - mostly modifying assets to fit the scene, or programmatic creation of environments, having access to a large selection of 2D and 3D models and artwork, is a must-have for me. I believe the same is true for developers that like to create artwork and models, but don't want to deal with the programming aspect.
Over the years I've accumulated a library of assets from the asset store (I did purchase a few more specifically for this project), so I've put them to good use here. Overall I have a few "go-to" asset creators for different needs. I like the spaceships done by CGPitbull, as well as the flexibility of being able to design my own character with Morph3D, for example.
The Procore Bundle has been essential to me in pretty much every project I work on, as it enables me to create environment pieces right inside Unity, without having to use external 3D modelling software. Smart usage of Procore builder, as well as combining meshes with your method of choice, really gives developers to power to create most, if not all, of what's needed in an environment without having to step out of Unity.
Here are the assets I used in this project.
Model creation and editing: ProCore Bundle
Mesh simplification for LODs: Mesh Simplify
Mesh combining: Simple Mesh Combine
Planet in background: Planets
Space Station: Modular Space Station G8
Sci-Fi Dropship M2
Sci-Fi Frigate G2
Heavy Spaceships #6
SF Rescue Ship 2M
Free SF Fighter
Sci-Fi Fighters S4-S6
Docking hangar: SF Hangar C3 by CGPitbull
Street Drone: Sentinel Sci-Fi Drone
Some of the ship spline pathing: Easy airplane path
High-rise Building Set 1
City Buildings Set 2
City Buildings Set 3
53 Low-Poly Skyscrapers (Day & Night)
Underground Exit, Security Room & Energy Booth
Modern City Pack
Unique Statue Model
Sci-Fi Level Construction Kit 2
Sci-Fi Crates and Barrels Pack
3D Scifi Kit Vol 2
Modern People 2
MCS Male: Cyberpunk Outfit
MCS Female: Sci-Fi Bundle
Sci-Fi Mechs and Weapons Pack
Animation (besides Mixamo free animations)
Female Movement Animset Pro
Music: Virtual Space
Effects: Ultimate VFX
Space Traffic Control
Sound Effects Pack Vol 1
Sound Effects Pack Vol 2
Sound Effects Pack Vol 3
Advanced UI - Digital Elements - Modulated Movement
I certainly enjoyed this challenge, and learned a great deal more about creating beautiful environments that are also massive in size. The good thing about Habitat 09 is that it's one seamless environment, so I can actually take a player controller, put a character in there and explore the Habitat as it is.
All in all I'm happy with what was submitted. Given more time I'd definitely add in more polish and details, but that could go on forever :)
Note: This concludes the final worksheet for the project. All content below are updates I entered during the development of the project. Thanks for getting this far! I look forward to any comments you have.
Update - Jan 8, 2018
With less than a week to go, I've started to add in some detail to the environment. Here's a 60 FPS, 1080p early preview of Habitat 09. Things are progressing pretty well! Of course, in the coming days before the deadline there are still many things to complete, such as fixing LOD popping, adding details, improving lighting and shadows, and extending the ground-level view to include the intended content. In short, quite a bit more to do :)
I'm using the Virtual Space music pack by FunFant for the BGM music, and I'm quite happy with it! It really brings out the positive tone I'm aiming for in this environment. I'll include a full list of all assets used as part of the final submission.
Update - Jan 6, 2018
The first cut for the video storyboard is done! One of the goals of this video was to show Habitat 09 from outside to in, so I've used Timeline and Cinemachine to create a scene progression that starts from space, then gradually zooming into the city level, then street level.
There's still a lot of work to be done on adding details, character models, LOD distance adjustments to fix 'popping', and the street-level will be extended probably another 30 seconds or so. In general the scene needs more interesting things happening around the camera.
I'm using Mixamo Fuse and Morph3D for my character models (the current video only shows one placeholder model).
Update - Dec 30, 2017
I really wanted the close-up views of the city sections to look high-tech and glossy - probably a little more "Utopian" rather than gritty. So here's a first cut of what the insides of Habitat 09's city will look like. I've used the Unity Post-Processing Stack's screen space reflection, and played around with the metallic and smoothness settings of materials, to get this glossy look. In addition, I've been playing around with the Post Processing Stack's Color Grading settings to get the mood of the environment to what I want.
A lot of effort was spent making sure this scene was manageable within the large-scale scene of the entire habitat, including making sure everything has LODs, and not going overboard with polygon count, so that we can seamlessly zoom in from outer space-view into this close-up view. I'm using Simple Mesh Combine from the Asset Store to combine the procedurally-generated floor tiles, in order to speed up performance. So far it's been working out great.
All in all I think the scene is promising, and I'm looking forward to adding in the final details and the dynamic objects!
Update - Dec 23, 2017
After some fiddling with LODs, mesh combining and using low-poly building sets, I finally have a foundation to work with that gives me good framerate, and (hopefully) enough framerate margin to add in details, animations etc. I also experimented with different lighting and color settings.
The Habitat is also now optimized enough that I can put buildings on all three "wings" of the cylinder, which was the initial plan :)
Next up will be adding details to the environment, as well as start on the animated objects using timeline.
Hi there! Habitat 09 is a project I started for Neon Challenge. The inspiration for this environment originates from the O'Neill Cylinder, a concept by scientist Gerard K. O'Neill and popularized by many sci-fi movies and games such as Interstellar, Elysium, and the original Mass Effect series. An O'Neill Cylinder is a massive cylinder in space that can house an entire population, as well as simulate artificial gravity for its inhabitants.
My goal in this project is to utilize tools within Unity, including Cinemachine, Timeline and the Post-Processing Stack of course, as well as the resources available in the Unity Asset Store, to create an environment that captures the epic setting of this gigantic orbital space colony. In order to achieve this, the entire environment - including the Orbital Colony, the city inside, as well as the capital ships and nearby planet, are all built in a single Unity Scene. I'm sure there'll be plenty of optimization that'll have to be done to make this work :)
This project is a solo project, so I'm using ProBuilder and QuickEdit from the ProCore Bundle to create simple shapes or modify asset to fit the scene, and relying on what's available on the Asset Store for object models. I've listed the assets used in this project at the end of this article, so if you like what you see in the scene, please feel free to check out the talented artists that made those assets.
Environment Creation Approach
I'm building a fully fleshed-out city within the space station object model, so it's important to be able to create large areas of the city efficiently. The city consists of procedurally-created "Megatiles" with buildings, foliage, props etc, which are then also stitched together procedurally to form the entire city. This gets me probably to 80% of the final environment, after which I'll modify manually to finalize.
I'm using Unity's LOD system rigorously to make sure tiles that are far from the camera are much less detailed than close-up ones. For examples, the furthest tiles only have buildings and the base tile visible (no props, roads or foliage), and even those use simplified meshes to reduce vertex count.
Progress / Notes
In the following weeks I'll be posting updates on my progress, and how I'm using the newer features of Unity 2017.2 to implement the scene. This is the first time I'm using Timeline and Cinemachine, so it'll be interesting to see how it pans out! In the meantime, here are some short GIFs of works-in-progress for your viewing pleasure.
Habitat 09 houses a population of 2 million people within a cylinder 1.5 miles wide and 5 miles long, and has a roughly similar population density of today's San Francisco. It's also situated along an interstellar supply route, acting as a port for passenger and cargo capital ships. In this scene, the planet in the background is rendered on a different camera that stays stationary but tracks the main camera's rotation. This allows it to stay in place, or move at a much slower pace in relation to the main camera, giving the illusion of scale.
Artificial gravity is maintained through the constant rotation of the main cylinder, hence the curved shape of the city. Living there would be a trippy experience, to say the least! I'll report back later on whether having a curved layout (having a variable UP vector) introduces any new considerations when using Unity's Timeline.
So far I'm pretty impressed with Cinemachine. All the panning shots here were much easier to plan because I was able to see how they'd look just by dragging the virtual cameras around in the scene. I'm sure I'll find more neat features when I start animating street-level objects, so stay tuned for more :)
Store Assets Used
Here's a rundown on the Unity Asset Store assets I've been using for the project. I'll be updating this list to make sure I didn't miss any assets. Check them out if you like them!
Model creation and editing: ProCore Bundle by ProCore
Mesh simplification for LODs: Mesh Simplify by Ultimate Game Tools
Planet in background: Planets by Forge3D.
Space Station: Modular Space Station G8 by CGPitbull