Thank you for sharing your work process!!
I really like how you've articulated your entire process. This was a very enriching read. A Well deserved feature!
Great article! Thanks for the awesome read.
Jona Marklund did a breakdown of the indie shooter/platformer Ley Lines made in cooperation with his friends in Unity just in 7 weeks: level design, shaders, gun effects, platformer elements and more! Check it out and download the game to enjoy every bit of it.
Sure, my name is Jona Marklund and I am from a small village in the north of Sweden called Abborträsk (literally “seabass swamp”). This year I’m celebrating ten years as a Technical Artist.
Well, the first time I got into 3D production was in 1996 with a dictionary in my lap creating imbalanced Heroes 2 levels that my friends and I could beat even on the highest difficulty. Then somewhere around 1998, I got into Unreal to make it less dark and frightening (those Skaarj were scary, ok!)
But the real start was in 2005 when I started learning 3ds Max from a DVD in French… which I don’t speak. The hobby then went into a serious try at making a living out of it in 2006, when I turned down the law-school to attend Gotland University’s education in Game Design and Art.
Ley Lines Project Start
Ley Lines started as a school project at Futuregames in Stockholm, Sweden, and we set out with the humble goal of creating a truly fluid feeling movement system and an art-style which would be recognized anywhere. We had 7 weeks to achieve it.
As for the inspiration, most of it came from DOOM, Quake and to some degree, Portal, in the sense that we wanted the speed of Quake, the move set of DOOM, and puzzles in an FPS like Portal.
Honestly, the final seven-week project at the school is a Unity-based project, so the choice was pretty much out of our hands. The choice of an FPS though was due to the fact that no one in the group had ever worked on one, which was inevitably going to make it quite a challenge!
As for the advantages of our choice, they mainly came in the form of the engine experience. Our main coder had been coding in Unity for a few years already, and I have personally worked with Unity since the first Windows version 2.1 back in.. 2008?
But the arguably most important advantage is that it’s a lot easier to get a unique looking game inside of Unity than in Unreal. Personally, I think this is because the very same things that make Unreal games be generally thought of as better looking than Unity games, but also have a tendency to make games look very “Unrealy”.
The levels were first designed by two level designers, using nothing but standard Unity boxes. Once the design was nailed down, our two 3D artists set-dressed the entire level.
Other than the boulders, which I’ll get to in the next paragraph, they placed a lot of sci-fi elements designed by our 2D artists to indicate that this was not your everyday pyramid.
As for the reasoning behind the levels being claustrophobic (as you’ve noticed they are quite enclosed), it’s quite simple. We knew we wouldn’t have the time to set-dress huge areas while keeping the quality at the level we wanted for the project.
Finally, while I’d love to say that the placement was done procedurally or using automagic Houdini HDAs, the truth is that it was all placed by hand. Some walls were created as prefab chunks, but let’s just say that the color of both “Ctrl” and “D” has vanished on a few keyboards due to all of that duplication.
With that said, there’s no way we could’ve reached this amount of content without integrating Houdini in the pipeline, but more on that in the next paragraph.
Materials, Decals & Shaders
Let’s start off with the decals: they were painted by our 2D team, then placed manually into the level using the oldest trick in the book, alpha test/cutout materials on a single quad.
One if not the most important aspect of making a pyramid interior work is plenty of blocks and the ability to easily vary these in size and color. This can be a scary proposition as it’s very easy to break texel density and ruin the overall look when asking level designers to place hundreds of blocks. With that said, there’s only a single mesh and a single material being used on the image below.
That’s when the first and most important shader comes into play. It’s a tri-planar mapping shader with a lot of world space grunge maps and position offsets to keep everything on the same texel density while simultaneously making sure that no tiling can easily be seen. Most other shaders were made using Amplify Shader but I wrote this one in HLSL to keep it as performant as possible.
Onto the Houdini part, other than the shader it was vital to have blocks with different edge outlines. To handle these and, actually, all other non-sci-fi meshes the 3D guys sculpted blocks and pillars in ZBrush.
The power of Houdini then allowed me to read everything that 3D put into a specific folder, read their names and based upon these, pushed the high poly meshes through an automatic HDA. Based around a Python node, this HDA made the meshes game-res, created LODs, UVed and pushed the final .fbx-files into the project with the correct naming etc.
To finish the whole look off, I created an underlit HDR using Substance Designer which was used for IBL (Image Based Lighting). As the cherry on top, I used a single directional light which makes use of the collision-boxes to cast shadows, once again to save on performance.
I tell you, there are millions of triangles rendering on every frame, but occlusion culling, cheap shaders, and some LODing make it possible to run the game on the last-gen hardware.
Beyond the stationary things, there are about 15 additional specialized shaders for enemies that can be affected by elemental effects, shields that can be affected by weapons, the ley lines, and many more weapon and environment related stuff.
Now some more important things about these shaders and their implementation. First off, all of the shaders that were to be used by a designer or another artist, all have at least one zero to one slider. This slider makes it easy for scripters to linearly interpolate the effect on and off or have something react to being hit by a bullet.
Other than that these are generally transparent or additive effects with panning, scaling and such happening over time to bring life into the world. Another fun shader is the ice which appears based upon underlying surfaces not to mention the shader that makes things fly through the world as the player approaches.
As a fun little extra we implemented a few post effects in the form of easter egg shades which you can pick up along the way if you find them. They stack, which… results in a rather surreal experience. In the gif below you can see the 80s’ mode (LUT and chromatic aberration) combined with an indie mode (pixelation filter).
Gun Production & Animation
Finally, we came to the gun, the piece de resistance. As expected the gun was first concepted in 2D and then modeled by the 3D team. Once I got my hands on the model I created a simple rig with nothing but two arms and the weapon itself.
After this, I added some effect meshes and created the base animations needed for an idle. Getting hit and weapon switching/modes were generally just additive animations.
An observant viewer will see that in some spots the normals of the mesh have been altered significantly to work with some fun shader effects as the player moves through the world. You will also see the vertex colors, in the case of the weapon energy beam shader, red color scrolls a texture along x and blue along y. They allow for easier mesh authoring and one draw call less.
The actual player animations which are gameplay centric are procedural and based upon the force of landings and different weapon hits or climbing heights, multiplied by a curve to make them feel smooth and natural.
As I’ve mentioned, a lot of effect meshes were added and these all have custom shaders applied which play a lot of different animations depending upon what the weapons are doing. To accomplish this I wrote a couple of scripts which listen for events and then linearly interpolate tens of shader settings, rotate meshes, change lights and activate particle effects. (Fun trivia, the entire flack-fire-gun ammo is actually a particle effect, its collision and some custom attributes deal damage and break walls without any other logic!)
Finally, the different ammo types are important, not just for taking out enemies with elemental shields but also in puzzles. Fire extends spikes while ice freezes them and other hazards. The gun is also used to interact with everything else in the environment. Want an upgrade? Shoot the upgrade station. Want to open a door? Shoot the switch! Why? Did you really enjoy pressing “E” to open a door?
We also wanted to make sure that each ammo wasn’t just a different colored reskin. Regular ammo works with a ray-trace, it just hits. Fire ammo is a bouncing, dangerous but high damaging flack cannon and ice ammo can seek and destroy enemies if you hold the trigger down while aiming at them.
It took exactly seven weeks to create this vertical slice with a few hours extra spent on patching over the past few weeks. The biggest bottlenecks were the AI and the level design. Luckily the other disciplines were able to keep working due to some great planning, so it never became a huge issue.
We plan to launch a few patches in the future and then probably push everything towards a separate game. At least, it is more likely than a “Ley Lines 2”. I’ve set up a mailing list for anyone interested in hearing about our future plans once they’ve been made. Working with a publisher is also an interesting idea, however, we had no time to think things through yet. With that said, if you are a publisher, why not send me a message?