Quiver

Quiver is a collaboration piece I made together with animator Anders Nilsson. It was made using Unreal Engine 5.6 in 2 weeks half-time during the Specialization course at The Game Assembly, where I wanted to focus on VFX. 

I approached Anders to see if he had any projects that could use some VFX, and he showed me Quiver. I suggested that the character could whistle to get the arrow to return, like Yondu in Guardians of the Galaxy. This got us both excited to collaborate on this project. He did all the animation, and I did all the particle systems and VFX, and we both collaborated on the Blueprint setup to make it all come together.

Goals:

  • Collaboration with animator Anders
  • Create wind-based VFX for Archer Character
  • Blueprint functionality for recalling the arrow
  • Different hit effects on different surfaces
  • "Bullet hole" Decal

Shooting Arrow VFX Breakdown

We wanted the VFX to be primarily wind-based. This was achieved with a combination of spiraling meshes, panning textures, small particles and leaves. A deeper breakdown of the animations can be found in Anders portfolio here.

Aiming and shooting VFX consists of:

  • Wind and leaves around the Archer.
  • Wind around the Arrow and arm.
  • Small particles that moves towards the arrowhead.
  • Flare to indicate when you can shoot.
  • Wind, leaves and shockwave firing the arrow.
  • Trail and leaves following the fired arrow.

Charging Wind around Archer

Charging Wind around Arrow

Arrow Charged Flare

Shoot

Hit Effects and Data structure

The Arrow plays different hit effects depending on the surface it hits. To keep track of this, I set up a Data Table to organize which Physical Material was connected to which Particle system and Enums for easy use in Blueprints. I also set up an option for different sounds but we didn't have time to implement it in the end.

Base Hit Flare

Hit Wood

Hit Stone

Hit Dirt

"Bullet hole" Decal

Hit decals are spawned when the arrow hits something at random orientation and automatically despawn after a few seconds to save on performance. 

Problem with Decal Normals

The first problem is that decal normals don't take the normals of the underlying geometry into account. This is especially noticeable on curved surfaces, like a tree stem. This can be solved by recalculating the normals based on the projected geometry. 

This causes another problem. The projected normals overwrite the underlying surface's normals and make the face normals look bad. To deal with this, I created an opacity mask to keep the surface's normals and only use the decal's normal where it should be.

Recalling the Arrow

We took a lot of inspiration from The Leviathan Axe in God of War and Yondu's arrow from the Guardians of the Galaxy movie when making the Recalling functionality. We use a spline between the archer's hand and the arrow's location to get a nice curve to move the arrow along. 

Recalling Arrow Effects consists of:

  • Whistling particles.
  • Charging particles from the arrow.
  • Pop flare when the arrow gets unstuck.
  • Small physics impulse (if enabled).
  • Arrow trail with some leaves.
  • Catching particles.

Whistle

Catch

Character Blueprint

Arrow Blueprint

The Character and Arrow blueprints are closely linked together. Before shooting, the arrow exists as part of the skeletal mesh. When firing, we hide the arrow bone and spawn an arrow projectile in its place, which is the Arrow Blueprint. We keep a reference to the fired Arrow in the Character Blueprint for easy access when we want to recall it.


When we recall the arrow, we move it along a spline attached to the player using a timeline. The timeline makes sure that the arrow's travel time will perfectly align with the catching animation. On catch, we switch out the blueprint for the skeletal mesh arrow again and remove the arrow blueprint.

Reflections

Working Together

We had daily syncs in the morning during the project and we were constantly iterating and testing stuff out. It was a great way to inspire and motivate each other and a good way to get a lot of regular feedback. I think it is a lot more fun to work in a group to help each other and to amplify each other's work.

Check out Ander's Portfolio here

Audio made by Gustav Wall

Lessons Learned

  • Creating VFX in combination with animation
  • How to render decal normals properly
  • Setting up Data Tables to easily group assets makes future work easier

Other assets by:

Rigg made by Kiel Figgins

Environment assets by Andrey Gubin