2015-08-11 4 views
0

Вот как у меня есть моя настройка Sound Manager для небольшой RPG, и мне просто интересно, была ли это хорошей практикой.Unity - Создание звукового менеджера

Что я пытаюсь сделать, было бы, чтобы мои два метода (PlayBGMusic и PlaySound) были «общедоступными», поэтому мне не пришлось бы захватывать GameObject по тегу и скрипту почти во всех моих других сценариях, которые хотите играть звук. Если я сделаю их «public static», тогда мне придется сделать мои переменные одинаковыми, что уберет от размещения что-либо в инспекторе.

public class Sound_Manager : MonoBehaviour { 
    // Allow the user to decide if music should be on or off. 
    public bool backgroundMusicOn; 
    // Allow the user to decide if sound should be on or off. 
    public bool soundOn; 
    // The music volume. 
    [Range(0,1)] 
    public float musicVolume; 
    // The sound volume. 
    [Range(0,1)] 
    public float soundVolume; 
    // The Background music to be used for any manipulations. 
    private AudioSource _bgMusic; 

// Play a background song. 
public void PlayBGMusic(AudioSource music){ 
... 
} 

// Mute Current Background Song. 
public void MuteUnMuteBGMusic(){ 
.... 
} 

// Play a sound. 
public void PlaySound(AudioClip sfx, Vector3 location){ 
... 
} 
} 

Это правильный способ справиться с чем-то подобным или есть другой способ, который может быть проще?

+0

С появлением [AudioMixer] (http://docs.unity3d.com/Manual/AudioMixerOverview) у меня не было больше необходимости иметь звуковой менеджер в моих проектах больше. – Fabricio

ответ

1

Я рекомендую превратить звуковой менеджер в одноэлементный класс. Таким образом, вы можете иметь все свойства в инспекторе и использовать объект singleton для глобального доступа ко всем вашим свойствам, даже полностью уничтожая игровой объект, когда это не нужно.

2

Я думаю, что вы не можете играть в BGmusic и звук в одном GameObject, потому что каждый звук должен играть с единственным источником звука, это мой код AudioManager.

using UnityEngine; 
using System.Collections; 
using System.Collections.Generic; 

public class AudioManager : MonoBehaviour 
{ 
    public AudioClip[] audioSources; 
    public GameObject audioPrefabSource; 
    public Dictionary<string,AudioClip> audioClips; 
    static GameObject audioPrefab; 
    static GameObject instance; 
    static AudioSource musicPlayer; 
    public static AudioManager audioManager; 
    Dictionary<string,Audio> aliveSounds; 
    AudioListener al; 

    void Awake() 
    { 
      audioManager = this; 
      al = GetComponent<AudioListener>(); 
      audioClips = new Dictionary<string, AudioClip>(); 
      foreach (AudioClip a in audioSources) { 
        audioClips.Add (a.name, a); 
      } 

      instance = this.gameObject; 
      audioPrefab = audioPrefabSource; 
      musicPlayer = audio; 
      aliveSounds = new Dictionary<string, Audio>(); 
      //DontDestroyOnLoad(gameObject); 
    } 

    void Update() 
    { 
      if (!GameSetting.hasMusic) { 
        musicPlayer.Pause(); 
      } else { 
        if (!musicPlayer.isPlaying) { 
          musicPlayer.Play(); 
        } 
      } 
      if (!GameSetting.hasSound && aliveSounds.Count > 0) { 
        foreach (Audio a in aliveSounds.Values) { 
          a.StopSound(); 
        } 
        aliveSounds.Clear(); 
      } 
      if (!al.enabled) { 
        al.enabled = true; 
      } 
    } 

    public static void PlaySoundOnce (string name) 
    { 
      if (!GameSetting.hasSound) { 
        return; 
      } 
      if (!audioManager.audioClips.ContainsKey (name)) { 
        return; 
      } 
      GameObject go = GameObject.Instantiate (audioPrefab) as GameObject; 
      go.transform.parent = instance.transform; 
      Audio a = go.GetComponent<Audio>(); 
      a.PlaySoundOnce (audioManager.audioClips [name]); 
    } 


    public static void PlayMusic (string name) 
    { 
      if (!GameSetting.hasMusic) { 
        return; 
      } 

      if (musicPlayer.clip == null || musicPlayer.clip.name != name) { 
        //  musicPlayer.clip = audioManager.audioClips [name]; 
        musicPlayer.clip = Resources.Load ("Audio/" + name, typeof(AudioClip)) as AudioClip; 
        musicPlayer.Stop(); 
        musicPlayer.loop = true; 
        musicPlayer.Play(); 
      } else { 
        musicPlayer.loop = true; 
        musicPlayer.Play(); 
      } 

    } 
} 

Существует еще один класс для аудио, его необходимо сделать для аудиофайла.

using UnityEngine; 
using System.Collections; 

public class Audio : MonoBehaviour 
{ 
    public void PlaySoundOnce (AudioClip audioClip) 
    { 
      StartCoroutine (PlaySoundCoroutine (audioClip)); 
    } 

    IEnumerator PlaySoundCoroutine (AudioClip audioClip) 
    { 
      audio.PlayOneShot (audioClip); 
      yield return new WaitForSeconds (audioClip.length); 
      Destroy (gameObject); 
    } 

    public void PlaySoundLoop (AudioClip audioClip) 
    { 
      audio.clip = audioClip; 
      audio.loop = true; 
      audio.Play(); 
    } 

    public void StopSound() 
    { 
      audio.Stop(); 
      Destroy (gameObject); 
    } 
} 

Нравится это, и я проигнорировал положение звука, я использовал 2D-звук.

enter image description here

+0

Вы правы, но другие источники звука имеют свой собственный компонент для сцены, в которой он находится, звукорежиссер должен быть для фоновой музыки и простой – LumbusterTick

+0

Вы можете играть как в один GameObject, так и в моем PlaySound. Я создаю temp gameobject и добавляю аудиоисточник к нему и время от времени уничтожать звуковой клип. – JoeyL

Смежные вопросы