236 lines
		
	
	
	
		
			7.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			236 lines
		
	
	
	
		
			7.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using UnityEngine;
 | 
						|
using System;
 | 
						|
using UnityEngine.Audio;
 | 
						|
using System.Collections;
 | 
						|
 | 
						|
public class AudioManager : MonoBehaviour{
 | 
						|
 | 
						|
    [Tooltip("The music mixer.")]
 | 
						|
    [SerializeField] AudioMixerGroup mainMixer = default;
 | 
						|
    [Tooltip("The SFX mixer.")]
 | 
						|
    [SerializeField] AudioMixerGroup sfxMixer = default;
 | 
						|
 | 
						|
    [Space]
 | 
						|
    [SerializeField] Sound[] sounds = default;
 | 
						|
 | 
						|
    public static AudioManager instance;
 | 
						|
 | 
						|
    // Start is called before the first frame update
 | 
						|
    void Awake(){
 | 
						|
        if (instance == null){
 | 
						|
            instance = this;
 | 
						|
        }else{
 | 
						|
            Destroy(gameObject);
 | 
						|
            return;
 | 
						|
        }
 | 
						|
        DontDestroyOnLoad(gameObject);
 | 
						|
 | 
						|
        foreach (Sound s in sounds){
 | 
						|
            s.source = gameObject.AddComponent<AudioSource>();
 | 
						|
 | 
						|
            if(s.type == Sound.Type.Music)
 | 
						|
                s.source.outputAudioMixerGroup = mainMixer;
 | 
						|
            else
 | 
						|
                s.source.outputAudioMixerGroup = sfxMixer;
 | 
						|
 | 
						|
            s.source.clip = s.clip;
 | 
						|
 | 
						|
            s.source.volume = s.volume;
 | 
						|
            s.source.pitch = s.pitch;
 | 
						|
            s.source.loop = s.loop;
 | 
						|
            s.source.playOnAwake = false;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    #region Play
 | 
						|
    /// <summary> Play a sound with a certain name setted on the inspector. </summary>
 | 
						|
    public void Play(string name){
 | 
						|
        Sound s = Array.Find(sounds, sound => sound.name == name);
 | 
						|
        if (s == null){
 | 
						|
            Debug.LogWarning("Sound: " + name + " not found!");
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
        s.source.volume = s.volume;
 | 
						|
        s.source.pitch = s.pitch;
 | 
						|
        s.source.Play();
 | 
						|
    }
 | 
						|
 | 
						|
    /// <summary> Play a sound with a certain name setted on the inspector.
 | 
						|
    /// Set the randomPitch to true to make the sound start with a random pitch variation setted on the inspector. </summary>
 | 
						|
    public void Play(string name, bool randomPitch){
 | 
						|
        Sound s = Array.Find(sounds, sound => sound.name == name);
 | 
						|
        if (s == null){
 | 
						|
            Debug.LogWarning("Sound: " + name + " not found!");
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
        if (randomPitch){
 | 
						|
            s.source.volume = s.volume * (1f + UnityEngine.Random.Range(-s.volumeVariance / 2f, s.volumeVariance / 2f));
 | 
						|
            s.source.pitch = s.pitch * (1f + UnityEngine.Random.Range(-s.pitchVariance / 2f, s.pitchVariance / 2f));
 | 
						|
        }else{
 | 
						|
            s.source.volume = s.volume;
 | 
						|
            s.source.pitch = s.pitch;
 | 
						|
        }
 | 
						|
        s.source.PlayOneShot(s.clip);
 | 
						|
    }
 | 
						|
 | 
						|
    /// <summary> Play a sound with a certain name setted on the inspector.
 | 
						|
    /// Make the sound start with a certain delay. </summary>
 | 
						|
    public void Play(string name, float delay){
 | 
						|
        Sound s = Array.Find(sounds, sound => sound.name == name);
 | 
						|
        if (s == null){
 | 
						|
            Debug.LogWarning("Sound: " + name + " not found!");
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
        s.source.volume = s.volume;
 | 
						|
        s.source.pitch = s.pitch;
 | 
						|
        s.source.PlayDelayed(delay);
 | 
						|
    }
 | 
						|
 | 
						|
    /// <summary> Play a sound with a certain name setted on the inspector.
 | 
						|
    /// Play it with a randomPitch and delay. </summary>
 | 
						|
    public void Play(string name, float delay, bool randomPitch){
 | 
						|
        Sound s = Array.Find(sounds, sound => sound.name == name);
 | 
						|
        if (s == null){
 | 
						|
            Debug.LogWarning("Sound: " + name + " not found!");
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
        if (randomPitch){
 | 
						|
            s.source.volume = s.volume * (1f + UnityEngine.Random.Range(-s.volumeVariance / 2f, s.volumeVariance / 2f));
 | 
						|
            s.source.pitch = s.pitch * (1f + UnityEngine.Random.Range(-s.pitchVariance / 2f, s.pitchVariance / 2f));
 | 
						|
        }else{
 | 
						|
            s.source.volume = s.volume;
 | 
						|
            s.source.pitch = s.pitch;
 | 
						|
        }
 | 
						|
        s.source.PlayDelayed(delay);
 | 
						|
    }
 | 
						|
    #endregion
 | 
						|
 | 
						|
    #region PlayOneShot
 | 
						|
    /// <summary> Play a sound with a certain name without overlapping. </summary>
 | 
						|
    public void PlayOneShot(string name){
 | 
						|
        Sound s = Array.Find(sounds, sound => sound.name == name);
 | 
						|
        if (s == null){
 | 
						|
            Debug.LogWarning("Sound: " + name + " not found!");
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
        s.source.volume = s.volume;
 | 
						|
        s.source.pitch = s.pitch;
 | 
						|
        s.source.PlayOneShot(s.clip);
 | 
						|
    }
 | 
						|
 | 
						|
    /// <summary> Play a sound with a certain name without overlapping. 
 | 
						|
    /// Set the randomPitch to true to make the sound start with a random pitch variation setted on the inspector. </summary>
 | 
						|
    public void PlayOneShot(string name, bool randomPitch){
 | 
						|
        Sound s = Array.Find(sounds, sound => sound.name == name);
 | 
						|
        if (s == null){
 | 
						|
            Debug.LogWarning("Sound: " + name + " not found!");
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
        if (randomPitch){
 | 
						|
            s.source.volume = s.volume * (1f + UnityEngine.Random.Range(-s.volumeVariance / 2f, s.volumeVariance / 2f));
 | 
						|
            s.source.pitch = s.pitch * (1f + UnityEngine.Random.Range(-s.pitchVariance / 2f, s.pitchVariance / 2f));
 | 
						|
        }else{
 | 
						|
            s.source.volume = s.volume;
 | 
						|
            s.source.pitch = s.pitch;
 | 
						|
        }
 | 
						|
        s.source.PlayOneShot(s.clip);
 | 
						|
    }
 | 
						|
    #endregion
 | 
						|
 | 
						|
    /// <summary> Pause a sound with a certain name setted on the inspector. </summary>
 | 
						|
    public void Pause(string name){
 | 
						|
        Sound s = Array.Find(sounds, sound => sound.name == name);
 | 
						|
        if (s == null){
 | 
						|
            Debug.LogWarning("Sound: " + name + " not found!");
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
        s.source.Pause();
 | 
						|
    }
 | 
						|
 | 
						|
    /// <summary> Unpause a sound with a certain name setted on the inspector. </summary>
 | 
						|
    public void UnPause(string name){
 | 
						|
        Sound s = Array.Find(sounds, sound => sound.name == name);
 | 
						|
        if (s == null){
 | 
						|
            Debug.LogWarning("Sound: " + name + " not found!");
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
        s.source.UnPause();
 | 
						|
    }
 | 
						|
 | 
						|
    /// <summary> Stop a sound with a certain name setted on the inspector. </summary>
 | 
						|
    public void Stop(string name){
 | 
						|
        Sound s = Array.Find(sounds, sound => sound.name == name);
 | 
						|
        if (s == null){
 | 
						|
            Debug.LogWarning("Sound: " + name + " not found!");
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
        s.source.Stop();
 | 
						|
    }
 | 
						|
 | 
						|
    public void StopAll(){
 | 
						|
        foreach(Sound s in sounds){
 | 
						|
            if(s.source != null){
 | 
						|
                s.source.Stop();
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    AudioSource GetSource(string name)
 | 
						|
    {
 | 
						|
        Sound s = Array.Find(sounds, sound => sound.name == name);
 | 
						|
        if (s == null)
 | 
						|
        {
 | 
						|
            Debug.LogWarning("Sound: " + name + " not found!");
 | 
						|
            return null;
 | 
						|
        }
 | 
						|
 | 
						|
        return s.source;
 | 
						|
    }
 | 
						|
 | 
						|
    public IEnumerator FadeOut(string name, float FadeTime)
 | 
						|
    {
 | 
						|
        AudioSource audioSource = GetSource(name);
 | 
						|
        if (audioSource != null && audioSource.isPlaying)
 | 
						|
        {
 | 
						|
            float startVolume = audioSource.volume;
 | 
						|
 | 
						|
            while (audioSource.volume > 0)
 | 
						|
            {
 | 
						|
                audioSource.volume -= startVolume * Time.deltaTime / FadeTime;
 | 
						|
 | 
						|
                yield return null;
 | 
						|
            }
 | 
						|
 | 
						|
            audioSource.Stop();
 | 
						|
            audioSource.volume = startVolume;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    public IEnumerator FadeIn(string name, float FadeTime)
 | 
						|
    {
 | 
						|
        AudioSource audioSource = GetSource(name);
 | 
						|
        if (audioSource != null && !audioSource.isPlaying)
 | 
						|
        {
 | 
						|
            float volume = audioSource.volume;
 | 
						|
            audioSource.volume = 0;
 | 
						|
            audioSource.Play();
 | 
						|
 | 
						|
            while (audioSource.volume < volume)
 | 
						|
            {
 | 
						|
                audioSource.volume += Time.deltaTime / FadeTime;
 | 
						|
 | 
						|
                yield return null;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
    }
 | 
						|
}
 |