学习如何使用音效系统,背景音乐和其他特别的音效,跳跃攻击等等
学习如何在unity当中使用整套的音效系统,使用之前,我们先来确定一下我们要使用的音乐和音效,在Unity Asset Store当中搜索,添加到我们的unity当中
在unity中下载导入资源
音效全部导入
背景音乐只导入第一个
在Project中创建一个新的文件夹,起名为Audio;将导入的音频添加到这个文件夹下方
这些音乐和音效我们都可以点击,然后在屏幕右侧,点击屏幕右下角的双横线,然后就可以播放了
接下来我们来实现这些音频的资源
添加一个新物体,在Hierarchy窗口Create Empty,命名为Audio Manager;放入manager的分类下边
在Add Component--Audio(这个分类里面有非常多的内容;Audio Listener,可以听到所有的内容,但是需要一个媒体来播放音乐,就是Audio Source一个音频资源,在资源当中可以播放不同的声音片段,例如攻击跳跃等等)
我们首先先看一下我们的Main Camera 中,默认有Audio Listener组件,代表我们的摄像机就是耳朵,走到哪听到哪
接下来我们到场景当中去放置音源,然后用这些音源来播放不同的声音片段,就能够实现音效的效果了
在我们这个2D项目当中,我们直接在Audio Manager身上挂载音源,来持续不断地播放就好了
摄像机上有Audio Listener原因就是有时候可以使用一些3D的音效,只有走进的时候,才会播放,这样的话,我们就会挂载特殊的物体身上,比如野猪来回巡逻的时候,可能会发出喘息声和走路的声音,在他身上会有一个移动的音效,他也有一定的范围,只有我们的摄像机进入这个范围之后,才能够监听这个音效,
接下来我们来简单设置一下,学习如何来使用这些组件
首先在Audio Manager上面添加Audio Sorce
里面有非常多的内容(Audio Clip音频片段,Play On Awake运行游戏时自动播放,Loop循环)
下面还要有关于3D的音效暂时不用;BGM背景音乐要循环播放,且在游戏一开始就播放;可以添加音乐片段到Audio Clip中,运行测试一下效果
我们其他的音效,攻击跳跃等等,不会持续不断的播放,也不会在游戏一开始就播放,所以我们再添加另外一个Audio Source,这个取消勾选Play On Awake和Loop,用这个来播放其他的音效
然后,我们要用代码来控制什么时候把哪个片段放到对应的Audio Source里面去播放来实现我们想要的效果
在Script文件夹下再创建一个文件夹Audio,在此文件夹内创建一个代码AudioManager(音频管理脚本)
创建好了之后,将代码挂载到我们的Audio Manager身上
我们要在不同的AudioSource里面播放不同的片段,首先要获得这两个不同的AudioSource
打开代码进行编写
想要使用音频相关的内容,要调用这个命名空间UnityEngine.Audio(此命名空间为了使用AudioMixer),这样我们就可以使用所有的Audio的组件了
然后我们继续创建变量,首先是AudioSource,一个BGMSource,一个FXSource
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Audio;
public class AudioManager : MonoBehaviour
{
public AudioSource BGMSource;
public AudioSource FXSource;
}
保存返回unity
对这两个变量进行赋值
首先将标记Loop的AudioSource拖拽进去;不被标记的拖拽到FXSource
实现游戏音乐和音效的播放方式有非常多的方法,根据不同的项目有不同的实现功能
我们先以攻击为例子,找到Player--Attack1,2,3;每次启动的时候,我们都要播放一下这个音效,所以我们可以把要播放的音效直接挂载这三个身上,然后用他们去通知我们的AudioManager接下来要播放这个音效了(跨代码,跨物体的播放和传递数据,创建Event事件的方法,通过这个事件,同时带着我们的这个变量参数传递进去)
还是要用ScriptableObject的方法,在ScriptableObject文件夹下创建代码PlayAudioEventSO(传递音频文件的事件)
打开代码
先调用UnityEngine.Event
代码中要实现的是ScriptableObject
在上方使用CreateAssetMenu
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
[CreateAssetMenu(menuName ="Event/PlayAudioEventSO")]
public class PlayAudioEventSO : ScriptableObject
{
}
接下来创建我们的unity Action,传递进来的变量类型就是每一个Audio Clip
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
[CreateAssetMenu(menuName ="Event/PlayAudioEventSO")]
public class PlayAudioEventSO : ScriptableObject
{
public UnityAction<AudioClip> OnEventRaised;
public void RaiseEvent(AudioClip audioClip)
{
OnEventRaised?.Invoke(audioClip);
}
}
这样我们就写好了这个事件方法
保存返回unity
在事件文件夹当中,我们来创建Event;先创建一个叫做FX Audio Event SO,在创建一个BGM Audio Event SO
可以看到我们用同一个类型的ScriptableEvent “PlayAudioEventSO”,可以创建多个资源文件,那么分别来播放不同的音效和背景音乐
我们先以Attack为例子,我们要在它身上标记Clip,而且我要通过时间的方式进行广播,所以我们要创建一个单独的代码,来标记我所使用的音乐,起名为AudioDefination(音频自定义脚本)在Audio文件夹下创建
然后将这个代码挂载在Attack1,2,3这三个物体上
打开代码,进行编写
首先我们要通过一个事件的方式,进行广播来传递,我们先来创建一下这个事件playAudioEvent,然后我们还要有音频的片段,还希望有一个布尔值的判断,判断这个内容是不是一开始就播放(FX不会在一开始就执行,所以要用在OnEnable当中去执行这个方法)
勾选Play OnEnable,那么就在OnEnable当中去播放这个音乐
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AudioDefination : MonoBehaviour
{
public PlayAudioEventSO PlayAudioEvent;
public AudioClip audioClip;
public bool playOnEnable;
private void OnEnable()
{
}
}
具体的音乐如何播放,我们创建一个单独的函数方法PlayAudioClip,如何我们让我们的PlayAudioEvent OnEventRaised把我们的AudioClip传递进去,这样我们就成功的传递了这个片段
如果我们要在这个物体启动的时候播放的话,我们来判断一下,如果Play OnEnable就PlayAudioClip
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AudioDefination : MonoBehaviour
{
public PlayAudioEventSO PlayAudioEvent;
public AudioClip audioClip;
public bool playOnEnable;
private void OnEnable()
{
if (playOnEnable)
PlayAudioClip();
}
public void PlayAudioClip()
{
PlayAudioEvent.RaiseEvent(audioClip);
}
}
保存返回unity
首先这三个物体所要使用的这个PlayAudioEvent就是FX的Events,我们希望通过这个事件的通道将音效传递过去
Attack1,选择音效46;Attack2,3选择47
这三个都要勾选上Play OnEnable,这个物体一激活,inspector窗口显示出来,就要播放我们的音效,
广播有了,接下来回到AudioManager代码当中添加对应的监听,
创建两个同样类型的监听
监听的时候我们就要加入这个事件,把函数注册到这个事件的启动当中,OnDisable注销这个函数方法
用编译器帮助生成OnFXEvent,将clip传递进来,当前clip为这个clip,然后让器进行播放play单次播放
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Audio;
public class AudioManager : MonoBehaviour
{
[Header("事件监听")]
public PlayAudioEventSO FXEvent;
public PlayAudioEventSO BGMEvent;
public AudioSource BGMSource;
public AudioSource FXSource;
private void OnEnable()
{
FXEvent.OnEventRaised += OnFXEvent;
}
private void OnDisable()
{
FXEvent.OnEventRaised -= OnFXEvent;
}
private void OnFXEvent(AudioClip clip)
{
FXSource.clip = clip;
FXSource.Play();
}
}
保存返回unity,
把AudioManager上的事件监听添加进去
运行测试,注意观察FX AudioSource会自动获得Clip
回到代码,再写一个函数的方法,添加BGM
我们希望每一个场景当中都有一个空物体告诉我们的AudioManager当前要播放的音乐是啥;我们继续创建这个方法,把它加到我们的这个事件当中
这个新创建的函数方法和我们刚才实现的是一样的,只不过变成了BGM
现在我们就成功写好了我们的AudioManager,有了事件的监听,给变量也简单做一个分类
public class AudioManager : MonoBehaviour
{
[Header("事件监听")]
public PlayAudioEventSO FXEvent;
public PlayAudioEventSO BGMEvent;
[Header("组件")]
public AudioSource BGMSource;
public AudioSource FXSource;
private void OnEnable()
{
FXEvent.OnEventRaised += OnFXEvent;
BGMEvent.OnEventRaised += OnBGMEvent;
}
private void OnDisable()
{
FXEvent.OnEventRaised -= OnFXEvent;
BGMEvent.OnEventRaised -= OnBGMEvent;
}
private void OnBGMEvent(AudioClip clip)
{
BGMSource.clip = clip;
BGMSource.Play();
}
private void OnFXEvent(AudioClip clip)
{
FXSource.clip = clip;
FXSource.Play();
}
}
private void OnFXEvent(AudioClip clip)
{
FXSource.clip = clip;
FXSource.Play();
}
}
保存返回unity
BGM我们要怎样做呢(目前我们只有一个场景,后续还需要创建下一个场景)
在这个场景当中,我们场景一个新的GameObject-Create Empty,命名为BGM,在这个物体上只挂载我们的Audio Definition,所添加的事件就是BGMAudioClip,AudioClip我们就选择我们要使用的BGM的那个背景音乐,勾选Play OnEnable
运行游戏测试一下
还无法实现BGM,因为我们还没有使用场景的加载,所以一个场景加载的时候,所有的物体会被重新启动,我们将BGM关掉,重新启动一下就会有背景音乐
这样我们就成功播放了这个音乐
这个音效有的时候,我们不容易控制它的声音的大小,稍后我们制作一个暂停的菜单来控制整体的音效
我们先学习如何把不同的音效输入到不同的轨道,然后进行混音的输出,所以接下来我们要学习的重要内容就是AudioMixer
window菜单--Audio--AudioMixer(混音台)打开这个窗口
可以上下调节音乐,然后将他们整体输出
接下来,我们要来创建一下AudioMixer,在Setting文件夹下创建一个新文件夹AudioMixer
点击“ + ”,创建一个AudioMixer文件,他也是一个资产文件,起名为MainMixer
选中MainMixer,我们就可以在AudioMixer的窗口下看到它的内容
目前只有一个轨道MainMixer主输出的音轨,然后我们希望有多条音轨,一个是监听我们的BGM,一个是监听FX;很可能我们还需要监听其他各种各样的功能,比如人声或者环境音,白噪音等等
那我们用Groups添加子轨道,目前只有一个Master,点击“ + ”;然后就会创建一个子轨道起名为BGM;再次选中Master,点击“ + ”,这样会创建一个平级的子轨道起名为FX
我们选择AudioManager物体,接下来我们来看看这两个AudioSource组件下有一个选项OutPut,要把当前这个音源输出到AudioMixer的哪个Groups
第一个是BGM,第二个是FX
无论你的声音效果怎么样,我们都可以通过调音台去调整整体的音量
还可以使用主音轨输出,调节整个游戏的声音,一半游戏都会有音量条件;我们把主音轨的音量拉下来,那么BGM和FX的声音都会减小;拉大都会拉大(还可以通过很多其他的方式来调整我慢慢的音效)
目前我们可以运行测试一下;可以根据自己的要求调整一下音效
再做一个小调整
我们的野猪在一开始播放的时候,他会有一个暂停,然后马上一个回头
打开一下Enemy的代码,一开始的waitTimeCounter,一旦这个waitTime大于0的话,他就会持续不断地在这TimeCounter中进行相减,所以我们要把这个注销掉,不在一开始的时候给他重置时间,这样他会一开始的时候就正常走动
有的时候我们的设备在播放这个项目的时候,摄像机跟随人物移动会有一些类似的抖动;如果你认为画面有抖动的感觉,可以选择mainCamera,在inspector窗口--Update Method更新的方式;默认情况下选择的是Smart Update,可以改成Fixed Update,抖动的效果会好一些,根据需求去修改