예제 #1
0
    /// <summary>
    /// Garbage collection, a coroutine that keeps on running till the object is destroyed
    /// </summary>
    private IEnumerator AddAudioSourceCR(AudioSourceContainer source)
    {
        Instance.AudioSources.Add(source);

        float TimeStopped = 0;

        // Keep Running till it has stopped for one second
        while (TimeStopped < 0.5f)
        {
            if (source == null)
            {
                yield break;
            }

            if (source.AudioSource.time == 0)
            {
                TimeStopped += Time.deltaTime;
            }
            else
            {
                TimeStopped = 0;
            }

            yield return(null);
        }

        Instance.Destroy(source);
        //source = null;
    }
예제 #2
0
    public static AudioSourceContainer Play(AudioSample sample, Vector3 position)
    {
        AudioSourceContainer soundObject = RegisterAndCreateAudioSourceContainer(sample);

        soundObject.transform.position = position;

        return(Play(soundObject));
    }
예제 #3
0
    private void Destroy(AudioSourceContainer source)
    {
        //Debug.Log("DESTROY " + source.gameObject.name);

        AudioLayerSettings settings = AudioLayerManager.GetAudioLayerSettings(source.Layer);

        Instance.AudioSources.Remove(source);
        GameObject.DestroyImmediate(source.gameObject);
        settings.ClipsPlaying--;
    }
예제 #4
0
    private static AudioSourceContainer RegisterAndCreateAudioSourceContainer(AudioSample sample)
    {
        GameObject soundObject = AudioSourceContainer.CreateContainer(sample);

        AudioSourceContainer cont = soundObject.GetComponent <AudioSourceContainer>();
        AudioLayerSettings   audioLayerSettings = AudioLayerManager.GetAudioLayerSettings(sample.Layer);

        //Register
        Instance.AddAudioSource(cont);
        audioLayerSettings.ClipsPlaying++;

        return(cont);
    }
예제 #5
0
    private static void ResumeUnmuteEtc(AudioSourceContainer con1)
    {
        if (!con1.AudioSource.isPlaying)
        {
            con1.AudioSource.Play();
        }

        AudioLayerSettings settings = AudioLayerManager.GetAudioLayerSettings(con1.Layer);

        if (!settings.Mute)
        {
            con1.AudioSource.mute = false;
        }
    }
예제 #6
0
    public static GameObject CreateContainer(AudioSample sample)
    {
        GameObject soundObject = new GameObject();

        soundObject.name = "AudioSourceObject " + sample.Name;
        AudioSourceContainer container = soundObject.AddComponent <AudioSourceContainer>();

        container.AudioSource = soundObject.AddComponent <AudioSource>();
        container.Name        = sample.Name;
        container.Sample      = sample;

        container.SetSettingsFromSample(sample);

        return(soundObject);
    }
예제 #7
0
    private static IEnumerator crossFadeCR(AudioSample sampleFrom, AudioSample sampleTO, float duration)
    {
        float dt = 0;
        AudioSourceContainer con1 = FindOrPlay(sampleFrom);
        AudioSourceContainer con2 = FindOrPlay(sampleTO);

        float v1 = con1.VolumeModifier; //con1.AudioSource.volume;
        float v2 = con2.VolumeModifier; //con2.AudioSource.volume;

        ResumeUnmuteEtc(con1);
        ResumeUnmuteEtc(con2);

        con2.AudioSource.Play();

        //Debug.Log("XF in AM: " + con1.VolumeModifier + "," + con2.VolumeModifier + " dur " + duration + " dt " + dt + " " + con1.gameObject.GetInstanceID() + ", " + con2.gameObject.GetInstanceID());

        float startTime = Time.timeSinceLevelLoad;

        while (dt < duration)
        {
            float t = dt / duration;

            con1.VolumeModifier = Mathf.Max((1 - t), 0) * v1;
            con2.VolumeModifier = Mathf.Min(t, 1) * v2;

            //Debug.Log(con1.AudioSource.volume + " " + con2.AudioSource.volume);

            dt = Time.timeSinceLevelLoad - startTime;
            yield return(null);
        }

        //Debug.Log("XF FIN in AM: " + con1.VolumeModifier + "," + con2.VolumeModifier + " dur " + duration + " dt " + dt);
        con2.VolumeModifier   = v2;
        con1.VolumeModifier   = v1;
        con1.AudioSource.mute = true;

        MuteAndDestroyAfter(con1, 5.0f);

        //con1.AudioSource.volume = 0;

        //con1.AudioSource.Stop();
    }
예제 #8
0
    private static IEnumerator MuteAndDestroyAfterCR(AudioSourceContainer source, float time)
    {
        source.AudioSource.mute = true;
        float dt = 0;

        //Debug.Log("MuteAndDestroyAfterCR");

        while (dt < time && source.AudioSource.mute)
        {
            dt += Time.deltaTime;
            yield return(null);
        }

        if (source.AudioSource.mute)
        {
            Instance.Destroy(source);
        }

        yield break;
    }
예제 #9
0
 public static void Stop(AudioSourceContainer source)
 {
     source.AudioSource.Stop();
 }
예제 #10
0
 private void AddAudioSource(AudioSourceContainer source)
 {
     // Handle destroy
     // Handle limit
     StartCoroutine(AddAudioSourceCR(source));
 }
예제 #11
0
 private static void MuteAndDestroyAfter(AudioSourceContainer source, float time)
 {
     Instance.StartCoroutine(MuteAndDestroyAfterCR(source, time));
 }
예제 #12
0
 private static AudioSourceContainer Play(AudioSourceContainer audioSource)
 {
     audioSource.AudioSource.Play();
     return(audioSource);
 }