top of page

Tropical Gunfight

Tropical Gunfight is a one versus one shooter developed by 13 students as a university project in Unreal Engine 4.

Content

1. Project Summary

2. Skybox Structure

3. Configuring the Animation Tree

4. Conclusion



Project Summary

Tropical Gunfight is set on a tropical island, and the players shoot with bolt-action carabines. Unlike automatic weapons, the bolts of the rifles in Tropical Gunfight must be fed manually by the player. The games' multiplayer works over steam and can be played with another person both locally and over internet. The following trailer shows the project.

During this project, I was responsible for project management and team coordination in general, but particularly in the game and level design department. Therefore, I was responsible for lighting the game and I blockouted most of the scenes as well as built the main menu level. The maintaining of important documents such as a game design document was also my task. This was mostly done in confluence to enhance the transparency and give every member the possibility to read all the documents and even add something.

In addition, I wrote several shaders, effects, the sky sphere, and a volumetric cloud system and configured the animation tree. I will explain the skybox, cloud system and the animation tree in this section.


Skybox Structure

The sky sphere is generated in a Blueprint with a reasonably simple structure oriented on the default Unreal Engine sky sphere. Parameters of the sky are controlled in a data table that is read from a function, and these parameters are used in the sky material.

On construction, a dynamic material instance of the chosen sky material is created, and the shader is refreshed.

The visual style of the sky can be adjusted in a data table. The function GetDataFromTable reads these values and parameterizes the sky material.

It is possible to create more presets as they can be chosen by the user. Furthermore, the style of clouds directly in the sky and their texture can be altered and chosen.

All textures -the sky sphere and the clouds- are hand-painted by me.



Sky Material

In general, everything that the user can change in the data table must also be a parameter in the sky material. The material used is an unlit, opaque, surface material with emissive color as the only input.

To simulate movement in the sky, a time function is used, and the result is then multiplied into banners as the time parameter.

The general colors and properties of the sky itself and the clouds in it are separated. Therefore, clouds have different movement speeds. To diversify the sky, there is a total of three clouds that can each have different textures. However, it must be noted that the cloud textures must be black and white since the user can alter their color.

In the sky material, the different sky colors, such as horizon and dome, are defined over a curve and color. These serve as a part of a lerp to smoothen the gradient. A texture that defines different stages of the sky is used as an alpha value is said lerp.

Another texture in the material determines the position and transparency of the clouds. This is also to enhance the natural gradient in the skybox and give the user the possibility of deciding how stylized the sky sphere should be.



Volumetric Clouds

To add another level of depth to the sky, I decided to familiarise myself with Unreal Engines' volumetric cloud system. Since I had no previous experience with this topic, I followed WorldofLevelDesign's tutorials on that subject matter.

I wrote several cloud materials that utilized different displacement maps to fit the style we were looking for. The final clouds use a Perlin noise to achieve the fluffy visual style since other displacement maps did not work well.

Parameters such as the speed of the clouds in each axis, the scale and the density can be configured.


Integration of the Sky in the Game

To achieve a consistent visual result of the sky, the parameterization of the values to fit everything together was very important. In addition, the sky atmosphere and the primary light sources of the game had to be configured as well.

The result of the entire sky fit the game very well, but changing values is quite complicated due to the dependencies that occurred. The end result can be seen in the picture below and in the project gallery.



Configuring the Animation Tree

The player character in Tropical Gunfight requires a total of three animation trees. Since only the arms are visible to oneself, but the whole character is visible to the opponent, a first and third-person animation tree are required. Furthermore, the player has no weapon in the lobby before choosing their character, requiring a full animation tree in third-person while not armed.

The animation graphs for the third-person characters are very similar since the player has essentially seven states: idle, crouch, walk, sprint, falling, landing, and jump. With jump branching into start jump and jump loop.

The transitions between the states are mostly dependent on a boolean. For example, the player is crouching, so isCrouching is true. As soon as they stop pressing the assigned key and keep walking, isCrouching is false, and they transition into the walk state.

This also applies to the first-person animation tree. But, if the player is not holding a gun, no animations are triggered since the arms are not seen. As soon as the player has a weapon, the character uses the soldier animation blueprint.

The main difference here is that the player now has an aiming state. This is also relevant inside the state itself. The respective blend space is determined by whether the player is aiming.


Footprints

Additionally, the character leaves footprints depending on the ground and the speed they are moving. The footprints consist of a decal and a particle system used in a blueprint. Here, the lifetime of the footprint is determined, meaning it fades and then is destroyed.

Each animation received a notifier that's triggered when the foot hits the ground. If the line trace value is true, a sound that is fitting for the underground is played.

Whether or not a footprint is drawn depends on the surface type. So only grass, sand, and dirt produce a footprint. The type of particle system depends on the player's state.



Conclusion

During this project, I learned a lot of new things, such as configuring animation blueprints or volumetrics. Furthermore, due to good planning on my accord, it was possible for me also to accomplish optional things such as the particle systems for the footprints. In the future, I would like to revisit volumetric clouds and learn more about that topic.

Since Tropical Gunfight is a multiplayer game learning about replication and how the steam integration works was fascinating. And I deepened my knowledge of performance and optimization since we encountered severe frame drops.

What went well

  • Team: SVN version control and integration in Unreal was easy to work with - even for the artists

  • Team: Important gameplay elements such as multiplayer were implemented early on

  • Personally: Implementation of different systems that enhanced the player's experience

  • Personally: Was able to support my team and resolve conflicts

What went wrong

  • Team: Implementation of animations in Unreal

  • Team: Lack of communication caused re-works

  • Personally: Was not able to delegate tasks as well as I should have been

  • Personally: I did not enforce playtesting enough

Project Gallery

bottom of page