public void StartSonar()
    {
        SonarFxDescriptor descriptor = new SonarFxDescriptor
        {
            mode          = _mode,
            duration      = _duration,
            direction     = _direction,
            origin        = _origin,
            waveColor     = _waveColor,
            waveAmplitude = _waveAmplitude,
            waveExponent  = _waveExponent,
            waveInterval  = _waveInterval,
            waveSpeed     = _waveSpeed
        };

        SonarFx.Instance.StartSonar(descriptor);
    }
    private void EvaluateSonar(float time, SonarFxDescriptor descriptor)
    {
        var evaluationTime   = 1 - time / descriptor.duration;
        var currentWaveColor = descriptor.waveColor.Evaluate(evaluationTime);
        var param            = new Vector4(descriptor.waveAmplitude, descriptor.waveExponent, descriptor.waveInterval, descriptor.waveSpeed);

        Shader.SetGlobalColor(waveColorID, currentWaveColor);
        Shader.SetGlobalVector(waveParamsID, param);
        Shader.SetGlobalFloat(timeFactorID, descriptor.duration - time);
        if (descriptor.mode == SonarMode.Directional)
        {
            Shader.DisableKeyword("SONAR_SPHERICAL");
            Shader.SetGlobalVector(waveVectorID, descriptor.direction.normalized);
        }
        else
        {
            Shader.EnableKeyword("SONAR_SPHERICAL");
            Shader.SetGlobalVector(waveVectorID, descriptor.origin);
        }
    }
 public void StartSonar(SonarFxDescriptor descriptor)
 {
     descriptors.Add(descriptor);
     timers.Add(descriptor.duration);
 }