UE4 Winter Game Jam Update #3: Conclusion & Lessons

TL:DR: Got a bit too ambitious with level design, got burned out and missed the deadline. Nonetheless, learned a bunch during the 3ish days I had to work on the game. I didn’t want to take too many shortcuts so 3rd party asset usage was minimal. (See video at bottom.)

Here’s a few things I got better at:

1.) Building Landscapes

Good landscapes use as few polys as possible, functions to hide level boundaries and is shaped/textured in a way that guides the player towards points of interest. It was interesting trying to emphasize and de-emphasize certain parts of the environment through smoothening of geometry and textures. The eye is attracted to noisy high-contrast areas.

Another thing that cropped up a few times was the issue of scale. I frequently found myself making the spacing way too large because I wasn’t using a reference humanoid mesh. It’s too easy to scale something to be 50x larger than it should because in the editor we see relative size, not absolute.

From a technical standpoint, I finally learned how to blend various textures together into a single landscape as well as use the various sculpting tools- flatten, smoothen, ramp, alpha mask, etc- to achieve the desired effect. This was a huge milestone in improving my outdoor level design.

2.) Texturing

Substance painter is the shiz. I already knew how to use masks to apply different materials to different parts of the mesh, but now I really see the power of “painting”. You can take a bland repeated texture, add a bit of noise and human imperfection and it looks great. Also, there needs to be some consistency in how all assets are textured, e.g. if the environment is snowy, all the outdoor assets should be painted with snow. It seems obvious in retrospect, but I nearly overlooked it. (Turtle and cabin models courtesy of Blendspace users.)

3.) UV Unwrapping

It’s not that bad. Once you get a knack for finding where the seams should be placed in a mesh and add them, the 3D modeling program can delivery pretty good automatic unwrapping results. At least with Blender, that’s the case.

4.) Animation + Character State

I’m getting more and more comfortable with the Blender->UE4 animation workflow. I see the benefits of exporting an armature-only FBX file for importing additional animations to UE4.

Made a few animations that would blend into each other based on character state. It was a matter of ensuring that the character had public variables to determine what state it was in, e.g. on the ground, in the air, or gliding. The animation blueprint would then either turn booleans into normalized blend values (see #7) or use the provided blend value. That value would be used for the animation Blend node. A bit of nesting was needed since there was a ground animation and- in the air- you can be dropping or gliding.

5.) Volumes

In order to mix things up a bit, I added event triggers that would change the camera angle at certain checkpoints. Also added a post-process volume with a blend radius so that the overall color grading would smoothly transition as the character gradually moved closer to a certain area.

7.) Smoothness

Gameplay programming generally consists of booleans or finitely enumerated states, so smoothly blending between states isn’t automatically gained. The “next gen” feel of a game comes partially from the smooth blending of animations, giving an organic visual.

So for the camera, I attached it to a Spring Arm component, which- after enabling camera lag- made the camera smoothly and loosely follow the character.

Then for the character animations themselves, I used the Blend node which needed to be fed a value to determine the blend amount.

The key ingredient for both the camera and the character animations was the FInterp node, which smoothly transitions a float from a start value to an end value, each of which can change on each tick and somehow the node manages to “just work”.

6.) Packaging

Lastly, as I conclude this post, I finally packaged the game to an executable. I originally hoped that it would be a quick one-click task, but I needed to install a bunch of SDK dependencies. Once those were finished, it was indeed a one-click process. Now I know..

Looking forward to returning to previous projects with some newfound knowledge.

Full gameplay demo video: