Unity引擎2D游戏开发,音源设置和音效播放

发布时间 2023-12-31 13:18:55作者: 心霖の雨

导入资源包

在Unity Assets Store当中,下载导入下面两个资源包到Unity中
image

在Unity中,下载导入到项目当中
image

新建一个文件夹,命名为Audio,将导入的两个文件夹放进来
image

挂载音效

打开Main Camera,能够发现该摄像机带有一个名为“Audio Listener”的组件
image
该组件用于监听音源发出的声音
当摄像机拥有监听组件时,只要摄像机的位置在音源播放的范围内,就能够捕捉到该声音

Audio Manager上添加Audio Source组件,该组件用于播放BGM
image
Play On Awake:启动时播放,一般用于当作BGM时使用
Loop:循环

再添加一个Audio Source,用于播放音效,取消勾选Play On Awake
image

编写代码控制音效的播放

用代码去获取不同的Audio Source播放不同的片段

创建名为AudioManager的C#脚本
image

挂载到Audio Manager
image

创建两个全局变量,用于挂在不同的Audio Source

// 背景音乐源
public AudioSource BGMSource;
// 音效源
public AudioSource FXSource;

将两个AudioSource拖入进行挂载
image

接下来以攻击为例,当Attack Area中任意一段启动的时候就需要播放音效,所以需要把音效挂载在它们之上。接着用它们去通知Audio Manager来播放需要执行的音效。因此,在这种跨物体传递的场景下,需要通过创建Event事件的方法,将需要的变量进行传递

新建一个PlayAudioEventSO C#脚本
image

在内部实现RaiseEvent()事件方法,由于需要传递AudioClip,所以UnityAction泛型写为AudioClip

using UnityEngine;
using UnityEngine.Events;

[CreateAssetMenu(menuName = "Event/PlayAudioEventSO")]
public class PlayAudioEventSO : ScriptableObject
{
    public UnityAction<AudioClip> OnEventRaised;

    public void RaiseEvent(AudioClip clip)
    {
        OnEventRaised?.Invoke(clip);
    }
}

在Events文件夹内,创建两个Event,分别为BGM Audio EventFX Audio Event
image

接下来,需要在每一段攻击标记需要用哪一个Clip,并且还需要以事件的方式进行广播。因此,创建一个单独的代码,标记使用的音乐片段,命名为AudioDefiniton
image

创建三个全局变量

public PlayAudioEventSO playAudioEvent;
public AudioClip audioClip;
// 是否在启动时播放
public bool playOnEnable;

创建PlayAudioClip()方法用于执行音乐片段

public void PlayAudioClip()
{
    playAudioEvent.OnEventRaised(audioClip);
}

创建OnEnable()方法,判断在启动时进行播放

private void OnEnable()
{
    if (playOnEnable)
    {
        PlayAudioClip();
    }
}

将Attack1、2、3分别选中FX Audio Event和各自的音效Audio Clip。并勾选上Play On Enable,只要物件激活时就开始播放
image

那么这时候事件广播已经创建好,那么接下来就要做事件监听的任务

AudioManager脚本中,添加两个事件监听的全局变量

[Header("事件监听")]
// 音效事件监听
public PlayAudioEventSO FXEvent;
// 背景音乐事件监听
public PlayAudioEventSO BGMEvent;

创建事件注册OnEnable()方法和注销OnDisable()方法的方法

private void OnEnable()
{
    FXEvent.OnEventRaised += OnFXEvent;
}

private void OnDisable()
{
    FXEvent.OnEventRaised -= OnFXEvent;
}

将传入的Clip赋值给AudioSourceClip中,并执行Play()方法

private void OnFXEvent(AudioClip clip)
{
    FXSource.clip = clip;
    FXSource.Play();
}

设置好两个Event事件
image

此时,执行攻击动作就会有攻击的音效

同理,BGM的事件监听也写好

private void OnEnable()
{
    FXEvent.OnEventRaised += OnFXEvent;
    BGMEvent.OnEventRaised += OnFXEvent;
}

private void OnDisable()
{
    FXEvent.OnEventRaised -= OnFXEvent;
    BGMEvent.OnEventRaised -= OnBGMEvent;
}

private void OnBGMEvent(AudioClip clip)
{
    BGMSource.clip = clip;
    BGMSource.Play();
}

创建一个Empty Object,命名为BGM。绑定Audio Definition脚本,设置好组件和片段后,勾选Play On Enable
image

此时,开始游戏重新启用下该组件即可有BGM

音效混音轨道

打开Window菜单,选中Audio,点击Audio Mixer
image

与此同时,在Settings文件夹下,创建Audio Mixer文件,命名为Main Mixer
image

想要为每一种声音建立各自轨道,那么点击Groups旁边的加号生成一条音轨
image

Audio Source中,点击Output即可选择刚才生成的音轨
image