1.主摄像头上挂载几个AudioSource
这个可以根据需要挂载不同的个数,做一个池子
2.代码编写
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
/// <summary>
/// 音效类型枚举
/// </summary>
public enum SoundType
{
SoundTyp_click,//按钮点击
}
public class AudioController : Singleton<AudioController>,IController
{
// 背景音乐播放器
private AudioSource backMusicAudioSource;
// 音效播放器
private List<AudioSource> soundAudioSources = new List<AudioSource>();
private Dictionary<string, AudioClip> audioDic;
static private string soundKey = "soundKey";
static private string musicKey = "musicKey";
// //音效是否静音
public bool soundMute
{
get
{
string sound = PlayerPrefs.GetString(soundKey);
return sound.Equals("true");
}
set
{
PlayerPrefs.SetString(soundKey,value ? "true" : "false");
PlayerPrefs.Save();
}
}
private bool startFadeInBgMusic = false;
private bool startFadeOutBgMusic = false;
private float timer = 0;
//背景音乐是否静音
public bool musicMute
{
get
{
string sound = PlayerPrefs.GetString(musicKey);
return sound.Equals("true");
}
set
{
PlayerPrefs.SetString(musicKey,value ? "true" : "false");
PlayerPrefs.Save();
timer = 0;
startFadeInBgMusic = value;
startFadeOutBgMusic = !value;
if (!value)
{
backMusicAudioSource.mute = false;
}
}
}
// 把播放器重新分类
public void Init()
{
audioDic = new Dictionary<string, AudioClip>();
AudioSource[] audioSources = Camera.main.GetComponents<AudioSource>();
if (audioSources.Length > 0)
{
backMusicAudioSource = audioSources[0];
backMusicAudioSource.loop = true;
backMusicAudioSource.mute = musicMute;
//背景音乐
// AssetLoader.LoadAddressableAsync<AudioClip>("december_raining", handle =>
// {
// backMusicAudioSource.clip = handle.Result;
// });
for (int i = 1; i < audioSources.Length; i++)
{
audioSources[i].loop = false;
soundAudioSources.Add(audioSources[i]);
}
}
}
private AudioSource getFreeAudioSource()
{
AudioSource audioSource = null;
for (int i = 0; i < soundAudioSources.Count; i++)
{
AudioSource tmpAudioSource = soundAudioSources[i];
if (!tmpAudioSource.isPlaying)
{
audioSource = tmpAudioSource;
break;
}
}
return audioSource;
}
public void Update()
{
if (startFadeInBgMusic)
{
timer += Time.deltaTime;
float p = Mathf.Clamp01(timer / 2f) ;
backMusicAudioSource.volume = 1 - p;
if (timer > 2f)
{
startFadeInBgMusic = false;
timer = 0;
backMusicAudioSource.mute = true;
}
}
if (startFadeOutBgMusic)
{
timer += Time.deltaTime;
float p = Mathf.Clamp01(timer / 2f) ;
backMusicAudioSource.volume = p;
if (timer > 2f)
{
startFadeOutBgMusic = false;
timer = 0;
}
}
}
/// <summary>
/// 播放和停止背景音乐
/// </summary>
/// <param name="isPlay"></param>
public void playBackMusic(bool isPlay)
{
if (isPlay)
{
if (!backMusicAudioSource.isPlaying)
{
backMusicAudioSource.Play();
}
}
else
{
if (backMusicAudioSource.isPlaying)
{
backMusicAudioSource.Stop();
}
}
}
/// <summary>
/// 播放音效
/// </summary>
/// <param name="type"></param>
public void playSound(SoundType type)
{
if (!soundMute)
{
string soundFileName = "click";
switch (type)
{
case SoundType.SoundTyp_click :
soundFileName = "click";
break;
}
if (audioDic.TryGetValue(soundFileName, out AudioClip ac))
{
AudioSource audioSource = getFreeAudioSource();
if (audioSource != null)
{
audioSource.clip = ac;
audioSource.Play();
}
return;
}
AssetLoader.LoadAddressableAsync<AudioClip>(soundFileName, handle =>
{
AudioSource audioSource = getFreeAudioSource();
if (audioSource != null)
{
audioSource.clip = handle.Result;
audioSource.Play();
audioDic[soundFileName] = handle.Result;
}
});
}
}
}