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.
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.
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.
Hit decals are spawned when the arrow hits something at random orientation and automatically despawn after a few seconds to save on performance.
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.
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.
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.
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.
Lessons Learned