I recently had the opportunity to work on Devil Jam; a roguelite survivor game.
One of the characteristic elements of survivor games is that player skills can often be augmented and upgraded. Think about damage increases and projectile speed increases. But also increasing the projectile size, which can result in some fun, technical challenges for us VFX artists.
The art director and game designer requested that as the projectile shrinks, the thickness of the disk should remain consistent. A simple scale down would look off in this case. And as a true VFX artist would say: “I can build a shader for that!”.
The solution I settled on was a fairly straight forward one. I would have a mesh that is a flat ring. When it scales up, the inner circle of vertices should be pushed outward slightly, keeping the ring consistent in width.

I made a quick mesh in Blender and made sure the UV’s would be mapped so that v0 to v1 would go from the outer edge to the inner edge, resulting in a gradient that’s black on the outer edge, and white on the inner edge.

With a mesh like this, we can basically control which vertices get pushed outwards, i.e. the white part of the gradient.

After a bit of trial and error, I ended up with this shader.
What I’m doing here is taking the V coordinates (i.e. the gradient going from outer edge to inner edge) and multiplying it with both the vertex position and a float that lets me set to what degree the vertices should be pushed.
The only thing left is actually controlling the actual displacement. I.e. if the scale of the object = 1, the vertices shouldn’t be pushed outwards, and anything that’s > 1 should start pushing the vertices. Luckily Amplify Shader Editor has the Object Scale node, which checks the object’s scale and returns the scale as a float to the shader. This is perfect for our case, as we can use this value to drive the functionality with a lerp. The one thing I did was remap the values, so it adds a bit more control.
Then it was a simple matter of adding visuals to the shader, a simple panning texture that emulates a rotating fire disk, and additional particles in both local- and world-space.
And with that, the projectile is complete!
Though there are some limitations to this setup, especially if it were to scale to high or near-zero values. Luckily this wouldn’t happen in any real scenario in this game.