unity音頻管理AudioManager

Unity引擎 音樂 JSON XML 獨立遊戲開發 2017-06-24

public enum AudioType

{

BackgroundMusic,

TY_Click,

Jump,

}

首先我們定義三種音效,….反正嘛,,,自己push進去幾種…

新建一個 AudioManager 類,這個類切換場景我們保持不銷燬,因為遊戲所有場景都會有聲音的存在…嗷嗚~~嗷嗚~~嗷嗚~~

遊戲中,一般我們播放一種背景音樂。以及 多種點擊多個button產生的不同點擊音效…等等

在遊戲設置中,我們可以設置音效大小以及關閉 (關閉==零嘛)

private static AudioManager audioManager;

public static AudioManager Instance { get { return audioManager; } }

//播放聲音的組件…都懂的

private AudioSource audioSource;

//聲音的類型,以及路徑。這個類型如果覺得一個Type不夠,自己可以按需求加。

private Dictionary<AudioType, string> audioPathDict;

//緩存音頻文件,下次可以直接用,不需要再加載

private Dictionary<AudioType, AudioClip> audioClipDic;

//緩存池,音頻組件

private List<AudioSource> CacheList;

//使用中的,音頻組件

private List<AudioSource> UseList;

//音樂的音量

private float musicVolume = 1;

//音效的音量

private float soundVolume = 1;

//音樂音量 用於本地讀取PlayerPrefs

private string musicVolumePrefs = “MusicVolume”;

//音效音效 用於本地讀取PlayerPrefs

private string soundVolumePrefs = “SoundVolume”;

//音頻組件緩存池最大長度

private int CacheMaxCount = 10;

void Awake()

{

DontDestroyOnLoad(this.gameObject);

audioManager = this;

//可以使用xml或者json直接讀取,這邊測試,直接寫死

audioPathDict = new Dictionary<AudioType, string>()

{

{ AudioType.BackgroundMusic, “AudioClip/Music/MainMenuScene” },

{ AudioType.TY_Click, “AudioClip/Sound/Sound1”},

{ AudioType.Jump, “AudioClip/Sound/Sound2”},

};

audioSource = gameObject.AddComponent<AudioSource>();

CacheList = new List<AudioSource>();

UseList = new List<AudioSource>();

audioClipDic = new Dictionary<AudioType, AudioClip>();

}

void Start()

{

// 從本地緩存讀取聲音音量

if (PlayerPrefs.HasKey(musicVolumePrefs))

{

musicVolume = PlayerPrefs.GetFloat(musicVolumePrefs);

}

if (PlayerPrefs.HasKey(soundVolumePrefs))

{

musicVolume = PlayerPrefs.GetFloat(soundVolumePrefs);

}

}

/// <summary>

/// 播放背景音樂

/// </summary>

/// <param name=”id“></param>

/// <param name=”loop“></param>

public void PlayMusic(AudioType type, bool loop = true)

{

audioSource.clip = GetAudioClip(type);

audioSource.clip.LoadAudioData();

audioSource.loop = loop;

audioSource.volume = musicVolume;

audioSource.Play();

}

/// <summary>

/// 播放音效

/// </summary>

/// <param name=”id“></param>

public void PlaySound(AudioType type)

{

//當緩存池沒有的時候,新建

if (CacheList.Count != 0)

{

AudioSource audioSource = UnusedToUsed();

audioSource.clip = GetAudioClip(type);

audioSource.clip.LoadAudioData();

audioSource.Play();

StartCoroutine(WaitPlayOver(audioSource));

}

else

{

AddAudioSource();

AudioSource audioSource = UnusedToUsed();

audioSource.clip = GetAudioClip(type);

audioSource.clip.LoadAudioData();

audioSource.volume = soundVolume;

audioSource.loop = false;

audioSource.Play();

StartCoroutine(WaitPlayOver(audioSource));

}

}

/// <summary>

/// 當播放音效結束後,將其移至未使用集合

/// </summary>

/// <param name=”audioSource“></param>

/// <returns></returns>

IEnumerator WaitPlayOver(AudioSource audioSource)

{

//等待音樂播放完畢

yield return new WaitUntil(() => { return !audioSource.isPlaying; });

//加入緩存

UsedToUnused(audioSource);

}

/// <summary>

/// 獲取音頻文件,獲取後會緩存一份

/// </summary>

/// <param name=”id“></param>

/// <returns></returns>

private AudioClip GetAudioClip(AudioType type)

{

if (!audioClipDic.ContainsKey(type))

{

if (!audioPathDict.ContainsKey(type))

return null;

AudioClip ac = Resources.Load(audioPathDict[type]) as AudioClip;

audioClipDic.Add(type, ac);

}

return audioClipDic[type];

}

/// <summary>

/// 添加音頻組件

/// </summary>

/// <returns></returns>

private AudioSource AddAudioSource()

{

if (CacheList.Count != 0)

{

return UnusedToUsed();

}

else

{

AudioSource audioSource = gameObject.AddComponent<AudioSource>();

CacheList.Add(audioSource);

return audioSource;

}

}

/// <summary>

/// 從對象池取出未使用的音頻

/// </summary>

/// <returns></returns>

private AudioSource UnusedToUsed()

{

AudioSource audioSource = CacheList[0];

CacheList.RemoveAt(0);

UseList.Add(audioSource);

return audioSource;

}

/// <summary>

/// 使用音頻結束後加入緩存池

/// </summary>

/// <param name=”audioSource“></param>

private void UsedToUnused(AudioSource audioSource)

{

UseList.Remove(audioSource);

if (CacheList.Count >= CacheMaxCount)

{

Destroy(audioSource);

}

else

{

CacheList.Add(audioSource);

}

}

/// <summary>

/// 修改音樂音量

/// </summary>

/// <param name=”volume“></param>

public void ChangeMusicVolume(float volume)

{

musicVolume = volume;

audioSource.volume = volume;

PlayerPrefs.SetFloat(musicVolumePrefs, volume);

}

/// <summary>

/// 修改音效音量

/// </summary>

/// <param name=”volume“></param>

public void ChangeSoundVolume(float volume)

{

soundVolume = volume;

for (int i = 0; i < CacheList.Count; i++)

{

CacheList[i].volume = volume;

}

for (int i = 0; i < UseList.Count; i++)

{

UseList[i].volume = volume;

}

相關推薦

推薦中...