Game/Components/SonarComponent.cs
public class SonarComponent : Component
{
	[RequireComponent] public GaussianSplatVolume Volume { get; set; }
	[Property] public float Intensity { get; set; } = 1f;
	[Property] public float TargetSize { get; set; } = 300f;
	[Property] public float TargetSpeed { get; set; } = 5f;
	[Property] public float TimeToFade { get; set; } = 1f;
	[Property] public float FadeTime { get; set; } = 1f;
	[Property] public bool IsSubtractive { get; set; } = false;

	public bool IsDone = false;

	TimeSince timeSinceStart = 0f;

	protected override void OnAwake()
	{
		timeSinceStart = 0;
	}

	protected override void OnUpdate()
	{
		Volume.Mode = IsSubtractive ? SplatVolumeMode.Subtract : SplatVolumeMode.Add;
		Volume.Radius = Volume.Radius.LerpTo( TargetSize, TargetSpeed * Time.Delta );

		if ( IsDone ) return;

		if ( IsSubtractive )
		{
			Volume.Intensity += Time.Delta / FadeTime * Intensity;
			if ( Volume.Intensity >= Intensity )
			{
				IsDone = true;
				Volume.Intensity = Intensity;
			}
		}
		else
		{
			if ( timeSinceStart >= TimeToFade )
			{
				Volume.Intensity -= Time.Delta * FadeTime * Intensity;
				if ( Volume.Intensity <= 0f )
				{
					GameObject.Destroy();
				}
			}
			else
			{
				Volume.Intensity = Intensity;
			}
		}
	}
}