对于Unity3D的音乐音效这块一直没有好好的看过,现在准备好好的研究一下,并作为一个笔记记录下。

支持格式

在游戏中,一般存在两种音乐,一种是时间较长的背景音乐,一种是时间较短的音效(比如按钮点击,开枪音效等)。

Unity3D支持下面几种音乐格式:

  • AIFF:适用于较短的音乐文件可用作游戏打斗音效
  • WAV:适用于较短的音乐文件可用作游戏打斗音效
  • MP3:适用于较长的音乐文件可用作游戏背景音乐
  • OGG:适用于较长的音乐文件可用作游戏背景音乐

音乐组件

Unity3D中对音乐进行了封装,总体来说,要播放音乐需要3个基本的组件,下面我们来看看这3个组件。

AudioListener

一般我们创建场景时在主Camera上就会带有这个组件,该组件只有一个功能,就是监听当前场景下的所有音效的播放并将这些音效输出,如果没有这个组件,则不会发出任何的声音。好消息是,我们不需要创建多个该组件,一般场景中只需要在任意的GameObject上添加一个该组件就可以了,但是要保证这个GameObject不被销毁,所以一般按照Unity的做法,在主摄像机中添加即可。

AudioSource

控制一个指定音乐播放的组件,可以通过属性设置来控制音乐的一些效果,可以查看官方的文档:http://docs.unity3d.com/Manual/class-AudioSource.html

下面列出一些常用的属性:

  • AudioClip:声音片段,还可以在代码中去动态的截取音乐文件。
  • Mute:是否静音。
  • Bypass Effects:是否打开音频特效。
  • Play On Awake:开机自动播放。
  • Loop:循环播放。
  • Volume:声音大小,取值范围0.0 到 1.0。
  • Pitch:播放速度,取值范围在 -3 到 3 之间 设置1 为正常播放,小于1 为减慢播放 大于1为加速播放。

AudioClip

当我们把一个音乐导入到Unity3D中,这个音乐文件就会变成一个AudioClip对象,即我们可以直接将其拖拽到AudioSource的AudioClip属性中,也可以通过Resources或AssetBundle进行加载,加载出来的对象类型就是AudioClip。

看例子

播放音乐的简单例子

这个例子我们直接通过简单的拖拽的点击不写一行代码实现音乐的播放。

新建一个场景,给Main Camera添加一个Audio Source组件,并将我们的音乐文件拖拽到Audio Clip属性上,勾选Loop使其可以进行循环播放。

运行程序就可以听到声音了。

3D音效效果

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加载

这里我们看看通过代码如何实现音乐的控制和播放。

我们把我们的音乐文件放到Resources文件夹中,新建一个场景和一个GameObject,并将下面的脚本添加到这个GameObject上即可:

 using UnityEngine;

 public class ResourcesDemo : MonoBehaviour
{
private AudioSource _audioSource; void Start()
{
//添加 Audio Source 组件
_audioSource = this.gameObject.AddComponent<AudioSource>(); //加载 Audio Clip 对象
AudioClip audioClip = Resources.Load<AudioClip>("bgm"); //播放
_audioSource.loop = true;
_audioSource.clip = audioClip;
_audioSource.Play();
}
}

运行就可以听到声音了。

AssetBundle加载

音乐在AssetBundle中又该如何控制和播放呢?

首先我们需要通过脚本对文件进行打包。

 using UnityEditor;
using UnityEngine; public class AssetBundleCreator
{
[MenuItem("Demo/CreateAssetBundle")]
private static void CreateAssetBundle()
{
BuildPipeline.BuildAssetBundle(null, new []
{
AssetDatabase.LoadMainAssetAtPath("Assets/Audio/bgm.ogg"),
AssetDatabase.LoadMainAssetAtPath("Assets/Audio/sound.ogg")
},
Application.streamingAssetsPath + "/Audio.assetbundle",
BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets | BuildAssetBundleOptions.UncompressedAssetBundle,
BuildTarget.StandaloneWindows64);
}
}

接下来新建一个场景和一个GameObject,并将下面的脚本添加到这个GameObject上即可:

 using UnityEngine;

 public class AssetBundleDemo : MonoBehaviour
{
private AudioSource _audioSource; void Start()
{
AssetBundle assetBundle = AssetBundle.CreateFromFile(Application.streamingAssetsPath + "/Audio.assetbundle"); //添加 Audio Source 组件
_audioSource = this.gameObject.AddComponent<AudioSource>(); //加载 Audio Clip 对象
AudioClip audioClip = assetBundle.Load("sound", typeof(AudioClip)) as AudioClip; //播放
_audioSource.loop = true;
_audioSource.clip = audioClip;
_audioSource.Play();
}
}

Play和PlayOneShot的区别

AudioSource播放声音提供了两种方法,分别如下:

public void Play(ulong delay = );
public void PlayOneShot(AudioClip clip, float volumeScale = 1.0F);

那么这两个方法有啥区别呢,或者说在什么样的情况下应该使用哪个方法呢?

我们先看看Play方法,该方法可以和其它方法配合使用,比如Pause(暂停)和Stop(停止),播放的是clip属性对应的Audio Clip对象,同一时刻只会有一个clip音乐进行播放。如果要同时使用Play方法播放两个音乐就需要再添加一个Audio Source对象了。

而PlayOneShot是指马上播放一个音乐且只播放一次,同时Pause和Stop对其无效,如果我们调用该方法播放多次音乐,则多个音乐会同时被播放出来。

使用场景

Play方法适合播放背景音乐,因为背景音乐同一时刻只会有一个再播放,而且还需要可以控制其播放和暂停等。

PlayOneShot方法适合播放音效,因为音效一般只会播放一次且不需要其它的控制,同时多个音效播放时是可以共存的,即可以听到多个声音。

源文件下载

http://pan.baidu.com/s/1eQCW7AE

Unity3D音乐音效学习笔记的更多相关文章

  1. Unity3D音乐音效研究-MIDI与波表

    其实音乐音效这个命题本身没什么好研究的. Unity3D提供了丰富的结构和使用方式,足够使用了. 但是我有一些小小的想法和需求,一般的Unity资料并没有给我答案. 一个是容量要小.MP3.OGG的高 ...

  2. Unity3D之UGUI学习笔记(一):UGUI介绍以及Canvas

    UGUI是Unity3D4.6官方提供的UI系统,支持2D和3D UI的开发. Unity3D UI史 OnGUI 在Unity4.6之前,官方提供的是OnGUI函数来开发UI界面,当然问题也比较多, ...

  3. Unity3D之UGUI学习笔记(三):EventSystem

    在UGUI中,EventSystem实现了所有关于交互方面的功能,和NGUI不一样的地方是,我们终于可以摆脱添加Box Collider了! 下面我们来学习一下. 对于按钮来说,直接有onClick的 ...

  4. Unity3D之ScriptableObject学习笔记

    不同与C#提供的Serializable序列化功能,ScriptableObject是Unity3D提供的一个数据存储类,我们接下来学习一下这个类的功能. 官方文档 http://docs.unity ...

  5. Unity3d - RPG项目学习笔记(一)

    通过NGUI和工程素材,学习泰课项目——黑暗之光. 现阶段心得整理: 一.开始界面 开始界面显示顺序为:①白幕渐隐:②镜头拉近:③标题渐显:④按键响应. 1.1 白幕渐隐 NGUI是一个非常强大的插件 ...

  6. Unity3D之移植学习笔记:移植到Android平台更好的方法

    接上文,之前我们采用了直接将Unity项目导出为Eclipse项目来修改的方式,这种做法存在的一个最大的问题就是:每当Unity被修改之后,都需要重新导出,而每次导出的项目在Android平台方面的J ...

  7. Unity3D之移植学习笔记:移植到Android平台

    首先,我们需要一台已经配置好可以开发Android应用的计算机,这里我使用的是Windows系统+Eclipse+ADT的开发环境,当然也可以使用Android Studio或者使用Mac系统都可以. ...

  8. Unity3D之UGUI学习笔记(二):Rect Transform与Anchor

    Rect Transform 我们都知道,Unity3D中所有的GameObject都必须要携带一个Transform组件,且该组件无法移除,那么作为UI显示的GameObject则不是携带Trans ...

  9. I3D Next-Gen Game Development with Unity3D Vol I学习笔记(上)

    这部教程主题是讲述如何在Unity中安放模型以及对场景进行优化(面对的是次世代平台).第二章看到一半,看不下,索性直接凭借Maya和Torque的经验自己操作. 看教程总结的原则如下(or tips) ...

随机推荐

  1. DrawDib函数组的使用

    Microsoft的针对与设备无关位图(DIB位图),在其WIN32 SDK的Multimedia中提供了一组绘制DIB位图的高性能函数组──DrawDib函数组.DrawDib函数组是一组不依赖于图 ...

  2. 【转】【Android】对话框 AlertDialog -- 不错不错

    原文网址:http://blog.csdn.net/feng88724/article/details/6171450 本讲介绍一下Android基本组件:对话框AlertDialog. API: j ...

  3. JAVA JDK1.5-1.9新特性

    1.51.自动装箱与拆箱:2.枚举(常用来设计单例模式)3.静态导入4.可变参数5.内省 1.61.Web服务元数据2.脚本语言支持3.JTable的排序和过滤4.更简单,更强大的JAX-WS5.轻量 ...

  4. Java异常的分类

    1. 异常机制       异常机制是指当程序出现错误后,程序如何处理.具体来说,异常机制提供了程序退出的安全通道.当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器.       传 ...

  5. [转]解决crystal report水晶报表在浏览器提示bobj未定义的错误

    网上的中文文章(比如这篇文章)都是写的部署到服务器后出现的问题,同时也指出要把crystal report的aspnet_client文件夹拷贝到对应项目的根目录里,这样就可以正常显示了,但是具体到我 ...

  6. bjfu1109 最小公倍数和

    这题真是过了n年才a.最早是在2010年北大培训比赛上看到的这题,当时我不会,竹教主也不会,但他记下来了,研究一段时间后就会了,还把这题加到我校oj上.过了这么多年,我上网搜,关于这个问题的解题报告还 ...

  7. bjfu1097 图标排列

    这是2011年百度之星的一道题.这题的做法就是找规律,规律找对了,代码极水.规律我一开始也没有找到,后来经人提醒,发现如下规律:对于每个开发者,其所有应用的分离度和一定是其第一个应用与最后一个应用的距 ...

  8. <转>Python学习推荐

    书籍推荐 基本了解: <<A Byte of Python>> (Python简明教程http://sebug.net/paper/python/) 网上有资源,两小时了解基本 ...

  9. 查看系统或者Jmeter的Properties

    工作台-非测试元件-Property Display,可以显示系统或者Jmeter的Properties

  10. BFC--绝对值得你思考

    CSS BFC(Block Formatting Context)      BFC是W3C CSS 2.1规范中的一个概念,他决定了元素如何对其内容进行定位,以及与其他元素的关系和相互作用.     ...