Project : DUST

Engine : Unreal Engine 5

Platforms : PC

Status : WIP prototype

Date : 2025

What is this project?

DUST is a 3rd person shooter survival / exploration prototype that I’m currently making from scratch, using Unreal Engine 5.

For systems and mechanics, I’m taking references from games that likes to have minimalistic and diegetic ones. ( Astroneer, Dead Space etc.)

Core pillars/intentions are :

  • Explore an unknown place
  • Scouting = living
  • You cannot survive alone (Coop & NPCs)
  • Taking care of your stamina/character is important (Ref: I am alive)

I will try to add multiplayer because I’d love to play around 2 player exploration focused actions/puzzles, including traversal and combat.

Why am I doing it?

I wanted to strengthen my visual scripting skills and learn how to have a better project’s scripting architecture. (No spaghetti code allowed in here!)

And I simply find it fun to do visual scripting and learn new stuff on Unreal, so doing it by crafting a narrow scoped experience looked like a good idea.

What's the plan?

DUST is made from a blank project, where everything will be added through visual scripting.

I started to make the project’s basic systems and mechanics while focusing on readability and flexibility.
Things will be added to the base skeleton and not making it a nightmare is a big concern!

I’m adding metric tools at the same time I’m doing mechanics like jumping, mantling… so I can quickly test by building gyms.
Visual scripting examples will be shown on my implementations!

🚧 Construction details 🚧

Movement

XY Axis simple movement

There is a basic movement system using X & Y inputs, allowing our character to move in all eight directions.

I’m also using these inputs to get directionality, that would be used later as an animation parameter.

Movement function Swizzle XY inputs

Movement states : Jumping & Running

Sprinting & FOV changes

I added a sprint, including camera FOV changes, and a jump action.

I made a state machine to control the character’s move state, using an Enum and booleans. This Enum is used to set the different speeds our character can use.

Typical states to know if the character is jumping or falling are also added.

Clean states debug were added too!

Setting movement states through the move inputs to get the correct MoveSpeed value

Speed setting function taking state Enum

Systems

Character animations

I wanted the project to have an original look and I love the pixel art & 3D world mix (Like Octopath Traveler). I got sprites from Itch.io and integrated them.

While dealing with states, I made the character controller’s animation tree using the PaperZD plugin, a tool for 2D animated projects.

I made my animations assets and linked them with the retrieved directionality from move inputs. The state Enums are used for the AnimTree’s conditionals.

Character controller animation graph

Animation sequences with directionality parameters

Cameras

For cameras, I wanted 2 main types :

  • Third person view
    •  With shoulder aiming focus
  •  Aiming down sights / Switch TPS <> FPS
Took some time to tweak a the cameras’ first draft to get a good feel
 
I had to be careful about the different states my character could be in and prevent unwanted behaviors, like switching TPS/FPS while sprinting.

Switch FPS <> TPS

Get current active camera & stocking it

Aiming Shoulder mode

Systems

Basic mantling

One of the core traversal mechanics will be mantling. The mantling is based on having tagged ledges that can be grabbed by the player. When grabbed, the player can mantle over it.

I wanted this mechanic to feature the haptic feeling of grabbing a ledge & be easy to execute as a player.

To convey a good feel, grabbing a ledge needs you to hold your jump input when going towards it.

Holding the spacebar will grab the ledge if it’s close enough.
Keep holding will not release the ledge.

Climbable ledges have a component on them, tagging them to be visible by the line trace.

Releasing will resume movement and launch the player upwards.

All the scripting for the climbing mechanics will be stored in one of the character pawn’s component

Component on ledge assets giving them the ‘Climbable’ tag

Input action calling the client custom events

Ledge Climb function, launched by the client first, then running on the server

The Ledge Data function triggers the LineTrace and stores the data, used for the grabbing mechanic

Launching a LineTrace from a custom component and checking if it’s ‘climbable’, then returns the data
Only tracing after the jump climax

Detecting climbable ledges with tracing

Grabbing function, stopping movement and reposition of pawn character

Ejecting from the ledge

What's up with this project?

I’ve had a lot of fun working on this project so far.
It’s nicely coming along and the overall project architecture looks very clean.

Adding the multiplayer was a real pain at first (I must admit) but now I’m feeling confident about creating new mechanics and prototyping fun 2-player gameplay modules with exploration, traversal and puzzles.

What are the next objectives?

  • Adding traversal/coop mechanics

  • First level design draft :
    • Environmental storytelling touches
    • World design shaped by the basic game loop, traversal mechanics and landmarks used for scouting

  • Enemy/dangerous environmental anomaly

W I P