对于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方法适合播放音效,由于音效通常只会播放一次且不须要其它的控制,同时多个音效播放时是能够共存的,便可以听到多个声音。