對於Unity3D的音樂音效這塊一直沒有好好的看過,如今準備好好的研究一下,並做爲一個筆記記錄下。html
在遊戲中,通常存在兩種音樂,一種是時間較長的背景音樂,一種是時間較短的音效(好比按鈕點擊,開槍音效等)。oop
Unity3D支持下面幾種音樂格式:ui
Unity3D中對音樂進行了封裝,整體來講,要播放音樂須要3個基本的組件,下面咱們來看看這3個組件。this
通常咱們建立場景時在主Camera上就會帶有這個組件,該組件只有一個功能,就是監聽當前場景下的全部音效的播放並將這些音效輸出,若是沒有這個組件,則不會發出任何的聲音。好消息是,咱們不須要建立多個該組件,通常場景中只須要在任意的GameObject上添加一個該組件就能夠了,可是要保證這個GameObject不被銷燬,因此通常按照Unity的作法,在主攝像機中添加便可。spa
控制一個指定音樂播放的組件,能夠經過屬性設置來控制音樂的一些效果,能夠查看官方的文檔:http://docs.unity3d.com/Manual/class-AudioSource.html。3d
下面列出一些經常使用的屬性:code
當咱們把一個音樂導入到Unity3D中,這個音樂文件就會變成一個AudioClip對象,即咱們能夠直接將其拖拽到AudioSource的AudioClip屬性中,也能夠經過Resources或AssetBundle進行加載,加載出來的對象類型就是AudioClip。htm
這個例子咱們直接經過簡單的拖拽的點擊不寫一行代碼實現音樂的播放。對象
新建一個場景,給Main Camera添加一個Audio Source組件,並將咱們的音樂文件拖拽到Audio Clip屬性上,勾選Loop使其能夠進行循環播放。blog
運行程序就能夠聽到聲音了。
Unity爲啥要把音樂播放拆分紅這3個組件呢?固然是有緣由的,我的認爲其中最重要的就是實現3D音效效果。
若是咱們將Audio Listener看做一雙耳朵的話就能夠很好的理解什麼是3D音效效果了,Unity會根據Audio Listener對象所在的GameObject和Audio Source所在的GameObject判斷一下距離和位置來模擬真實世界中的音量近大遠小的效果。
首先,找到咱們導入的音樂文件,必須設置爲3D音樂,默認就是。固然若是是2D的音樂就不會有近大遠小的效果了。
咱們新建一個場景,添加3個GameObject,給第一個添加一個Audio Listener組件,其它兩個添加Audio Source組件並賦予兩個音樂文件。
移除Main Camera上的Audio Listener組件,按照下面的位置擺放一下這3個組件。
運行遊戲,返回Scene視窗,拖拽Audio Listener組件的位置,就能夠感覺到比如在兩個音響之間移動的效果了。
(對於每一個Audio Source聲音可傳遞的距離能夠經過拖拽其球形的線條進行調整。)
這裏咱們看看經過代碼如何實現音樂的控制和播放。
咱們把咱們的音樂文件放到Resources文件夾中,新建一個場景和一個GameObject,並將下面的腳本添加到這個GameObject上便可:
1 using UnityEngine; 2 3 public class ResourcesDemo : MonoBehaviour 4 { 5 private AudioSource _audioSource; 6 7 void Start() 8 { 9 //添加 Audio Source 組件 10 _audioSource = this.gameObject.AddComponent<AudioSource>(); 11 12 //加載 Audio Clip 對象 13 AudioClip audioClip = Resources.Load<AudioClip>("bgm"); 14 15 //播放 16 _audioSource.loop = true; 17 _audioSource.clip = audioClip; 18 _audioSource.Play(); 19 } 20 }
運行就能夠聽到聲音了。
音樂在AssetBundle中又該如何控制和播放呢?
首先咱們須要經過腳本對文件進行打包。
1 using UnityEditor; 2 using UnityEngine; 3 4 public class AssetBundleCreator 5 { 6 [MenuItem("Demo/CreateAssetBundle")] 7 private static void CreateAssetBundle() 8 { 9 BuildPipeline.BuildAssetBundle(null, new [] 10 { 11 AssetDatabase.LoadMainAssetAtPath("Assets/Audio/bgm.ogg"), 12 AssetDatabase.LoadMainAssetAtPath("Assets/Audio/sound.ogg") 13 }, 14 Application.streamingAssetsPath + "/Audio.assetbundle", 15 BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets | BuildAssetBundleOptions.UncompressedAssetBundle, 16 BuildTarget.StandaloneWindows64); 17 } 18 }
接下來新建一個場景和一個GameObject,並將下面的腳本添加到這個GameObject上便可:
1 using UnityEngine; 2 3 public class AssetBundleDemo : MonoBehaviour 4 { 5 private AudioSource _audioSource; 6 7 void Start() 8 { 9 AssetBundle assetBundle = AssetBundle.CreateFromFile(Application.streamingAssetsPath + "/Audio.assetbundle"); 10 11 //添加 Audio Source 組件 12 _audioSource = this.gameObject.AddComponent<AudioSource>(); 13 14 //加載 Audio Clip 對象 15 AudioClip audioClip = assetBundle.Load("sound", typeof(AudioClip)) as AudioClip; 16 17 //播放 18 _audioSource.loop = true; 19 _audioSource.clip = audioClip; 20 _audioSource.Play(); 21 } 22 }
AudioSource播放聲音提供了兩種方法,分別以下:
public void Play(ulong delay = 0);
public void PlayOneShot(AudioClip clip, float volumeScale = 1.0F);
那麼這兩個方法有啥區別呢,或者說在什麼樣的狀況下應該使用哪一個方法呢?
咱們先看看Play方法,該方法能夠和其它方法配合使用,好比Pause(暫停)和Stop(中止),播放的是clip屬性對應的Audio Clip對象,同一時刻只會有一個clip音樂進行播放。若是要同時使用Play方法播放兩個音樂就須要再添加一個Audio Source對象了。
而PlayOneShot是指立刻播放一個音樂且只播放一次,同時Pause和Stop對其無效,若是咱們調用該方法播放屢次音樂,則多個音樂會同時被播放出來。
Play方法適合播放背景音樂,由於背景音樂同一時刻只會有一個再播放,並且還須要能夠控制其播放和暫停等。
PlayOneShot方法適合播放音效,由於音效通常只會播放一次且不須要其它的控制,同時多個音效播放時是能夠共存的,便可以聽到多個聲音。