ExplosionEffect.cs
using Sandbox;
using SpriteTools;

public sealed class ExplosionEffect : Component
{
	[Property] public SpriteRendererLayer Sprite { get; set; }

	private TimeSince _spawnTime;
	public float Lifetime { get; set; }

	public Color ColorA { get; private set; }
	public Color ColorB { get; private set; }
	public float Opacity { get; set; }

	protected override void OnAwake()
	{
		base.OnAwake();

		LocalScale = new Vector3( 1f, 0.925f, 1f ) * 2.85f * Globals.SPRITE_SCALE;
		//Sprite.Size = new Vector2( 1f, 0.95f ) * 2.85f;
		_spawnTime = 0f;
		Sprite.PlaybackSpeed = 1.75f;
	}

	public void Init( Color colorA, Color colorB, float opacity )
	{
		ColorA = colorA;
		ColorB = colorB;
		Opacity = opacity;

		Sprite.Tint = colorA.WithAlpha( opacity );
	}

	protected override void OnUpdate()
	{
		Sprite.Tint = Color.Lerp(ColorA, ColorB, Utils.Map( _spawnTime, 0f, Lifetime, 0f, 1f, EasingType.QuartOut ) ).WithAlpha( Utils.Map( _spawnTime, 0f, Lifetime, Opacity, 0f, EasingType.Linear ) );

		if ( _spawnTime > Lifetime )
		{
			Manager.Instance.RemoveExplosionEffect( this );
			GameObject.Destroy();
		}
	}
}