/**************************************************************************** * Copyright (c) 2017 snowcold * Copyright (c) 2017 ~ 2020.5 liangxie * * http://qframework.io * https://github.com/liangxiegame/QFramework * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. ****************************************************************************/ using System; using System.Linq; namespace QFramework { using System.Collections.Generic; using UnityEngine; /// /// TODO:目前,不支持本地化 /// [MonoSingletonPath("[Audio]/AudioManager")] public partial class AudioManager : MonoBehaviour, ISingleton { public AudioPlayer MusicPlayer { get; private set; } public AudioPlayer VoicePlayer { get; private set; } public void OnSingletonInit() { SafeObjectPool.Instance.Init(10, 1); MusicPlayer = AudioPlayer.Allocate(); MusicPlayer.usedCache = false; VoicePlayer = AudioPlayer.Allocate(); VoicePlayer.usedCache = false; CheckAudioListener(); gameObject.transform.position = Vector3.zero; AudioKit.Settings.MusicVolume.Bind(volume => { MusicPlayer.SetVolume(volume); }) .DisposeWhenGameObjectDestroyed(this); AudioKit.Settings.VoiceVolume.Bind(volume => { VoicePlayer.SetVolume(volume); }) .DisposeWhenGameObjectDestroyed(this); AudioKit.Settings.IsMusicOn.Bind(musicOn => { if (musicOn) { if (!string.IsNullOrEmpty(CurrentMusicName)) { AudioKit.PlayMusic(CurrentMusicName); } } else { MusicPlayer.Stop(); } }).DisposeWhenGameObjectDestroyed(this); AudioKit.Settings.IsVoiceOn.Bind(voiceOn => { if (voiceOn) { if (!string.IsNullOrEmpty(CurrentVoiceName)) { AudioKit.PlayVoice(CurrentVoiceName); } } else { VoicePlayer.Stop(); } }).DisposeWhenGameObjectDestroyed(this); AudioKit.Settings.IsSoundOn.Bind(soundOn => { if (soundOn) { } else { ForEachAllSound(player => player.Stop()); } }).DisposeWhenGameObjectDestroyed(this); AudioKit.Settings.SoundVolume.Bind(soundVolume => { ForEachAllSound(player => player.SetVolume(soundVolume)); }).DisposeWhenGameObjectDestroyed(this); } private static Dictionary> mSoundPlayerInPlaying = new Dictionary>(30); public void ForEachAllSound(Action operation) { foreach (var audioPlayer in mSoundPlayerInPlaying.SelectMany(keyValuePair => keyValuePair.Value)) { operation(audioPlayer); } } public void AddSoundPlayer2Pool(AudioPlayer audioPlayer) { if (mSoundPlayerInPlaying.ContainsKey(audioPlayer.Name)) { mSoundPlayerInPlaying[audioPlayer.Name].Add(audioPlayer); } else { mSoundPlayerInPlaying.Add(audioPlayer.Name, new List {audioPlayer}); } } public void RemoveSoundPlayerFromPool(AudioPlayer audioPlayer) { mSoundPlayerInPlaying[audioPlayer.Name].Remove(audioPlayer); } #region 对外接口 public void Init() { Debug.Log("AudioManager.Init"); } private AudioListener mAudioListener; public void CheckAudioListener() { // 确保有一个AudioListener if (!mAudioListener) { mAudioListener = FindObjectOfType(); } if (!mAudioListener) { mAudioListener = gameObject.AddComponent(); } } public string CurrentMusicName { get; set; } public string CurrentVoiceName { get; set; } #endregion public static void PlayVoiceOnce(string voiceName) { if (string.IsNullOrEmpty(voiceName)) { return; } var unit = SafeObjectPool.Instance.Allocate(); unit.SetAudio(Instance.gameObject, voiceName, false); } #region 单例实现 public static AudioManager Instance { get { return MonoSingletonProperty.Instance; } } #endregion public void ClearAllPlayingSound() { mSoundPlayerInPlaying.Clear(); } } }