Unity3D 简易音频管理器
依赖于Addressable
依赖于单例模板:传送门
using System.Collections.Generic;
using System.Security.Cryptography;
using System;
using UnityEngine;
using UnityEngine.AddressableAssets;namespace EasyAVG
{public class AudioManager : MonoSingleton<AudioManager>{private AudioSource backgroundMusic = null;private float backgroundValue = 1;private float soundValue = 1;private GameObject soundObj = null;private List<AudioSource> soundList = new List<AudioSource>();void Update(){for (int i = soundList.Count - 1; i > 0; i--){if (!soundList[i].isPlaying){GameObject.Destroy(soundList[i]);soundList.RemoveAt(i);}}}public void PlayBackgroundMusic(string name){if (backgroundMusic == null){GameObject obj = new GameObject("backgroundMusic");backgroundMusic = obj.AddComponent<AudioSource>();}var handle = Addressables.LoadAssetAsync<AudioClip>(name);handle.Completed +=(x) =>{var clip = (AudioClip)x.Result;backgroundMusic.clip = clip;backgroundMusic.loop = true;backgroundMusic.volume = backgroundValue;backgroundMusic.Play();};}public void ChangeBackgroundMusicValue(float v){backgroundValue = v;if (backgroundMusic == null)return;backgroundMusic.volume = backgroundValue;}public void PauseBackgroundMusic(){if (backgroundMusic == null)return;backgroundMusic.Pause();}public void StopBackgroundMusic(){if (backgroundMusic == null)return;backgroundMusic.Stop();}public void PlaySound(string name, bool isLoop, Action<AudioSource> callback = null){if (soundObj == null){soundObj = new GameObject();soundObj.name = "Sounds";}AudioSource source = soundObj.AddComponent<AudioSource>();var handle = Addressables.LoadAssetAsync<AudioClip>(name);handle.Completed +=(x) =>{source.clip = (AudioClip)x.Result;source.loop = isLoop;source.volume = soundValue;source.Play();//音效异步加载结束后,将这个音效组件加入集合soundList.Add(source);if (callback != null)callback(source);};}public void ChangeSoundValue(float v){soundValue = v;for (int i = 0; i < soundList.Count; i++){soundList[i].volume = v;}}public void StopSound(AudioSource source){if (soundList.Contains(source)){soundList.Remove(source);source.Stop();GameObject.Destroy(source);}}}
}