9.音效模块
9.1 知识点
音效模块的作用
- 统一管理音乐音效相关
音效管理器
定义BaseAudioManager类:
创建一个名为BaseAudioManager的类,它继承自BaseSingletonInCSharp
声明私有成员变量:
声明了一系列私有成员变量,包括backgroundMusicNode、backgroundMusicAudioSource、backgroundMusicVolume用于管理背景音乐,以及soundEffectNode、soundEffectAudioSourceList、soundEffectVolume用于管理音效。
构造函数:
在构造函数中,添加了一个生命周期更新事件的监听器,以便在每帧更新时执行特定操作。
OnUpdate方法:
这是生命周期更新事件的处理方法,用于检查和移除已经停止播放的音效音频源。
PlayBackgroundMusic方法:
用于播放背景音乐,首先检查背景音乐音频源是否已经存在,如果不存在则创建一个,然后异步加载背景音乐资源,设置音频源属性,并播放背景音乐。
PauseBackgroundMusic方法:
用于暂停背景音乐的播放,如果背景音乐音频源存在的话。
StopBackgroundMusic方法:
用于停止背景音乐的播放,如果背景音乐音频源存在的话。
ChangeBackgroundMusicVolume方法:
用于改变背景音乐的音量,首先更新音量属性,然后如果背景音乐音频源存在的话,也更新音频源的音量。
PlaySoundEffect方法:
用于播放音效,首先检查音效游戏对象是否已经存在,如果不存在则创建一个,然后异步加载音效资源,创建音频源,设置音频源属性,并播放音效。同时,将音频源添加到音效音频源列表中,并执行可选的回调函数。
ChangeSoundEffectVolume方法:
用于改变音效的音量,首先更新音量属性,然后遍历音效音频源列表,更新所有音频源的音量。
StopSoundEffect方法:
用于停止指定的音效,如果该音效存在于音效音频源列表中,将其从列表中移除,并停止播放并销毁音频源。
进行测试
声明nowAudioSource成员变量:
定义了一个名为nowAudioSource的成员变量,用于存储当前正在播放的音频源。
Update方法:
Update方法是Unity中的帧更新方法,用于在每一帧更新时检查输入并执行相应的操作。
- 检测按键输入:
- 在Update方法中,通过检测不同的键盘按键输入来触发不同的音频管理操作。
- 当按下空格键(KeyCode.Space)时,调用BaseAudioManager.Instance.PlayBackgroundMusic(“Black”)播放背景音乐。
- 当按下P键(KeyCode.P)时,调用BaseAudioManager.Instance.PauseBackgroundMusic()暂停背景音乐。
- 当按下S键(KeyCode.S)时,调用BaseAudioManager.Instance.StopBackgroundMusic()停止背景音乐。
- 当按下A键(KeyCode.A)时,调用BaseAudioManager.Instance.PlaySoundEffect(“Gun”, true, (audioSource) => { nowAudioSource = audioSource; })播放音效,并将当前音频源赋值给nowAudioSource。
- 当按下X键(KeyCode.X)时,调用BaseAudioManager.Instance.PlaySoundEffect(“Gun”, false, (audioSource) => { nowAudioSource = audioSource; })播放音效(不循环),同样将当前音频源赋值给nowAudioSource。
- 当按下D键(KeyCode.D)时,调用BaseAudioManager.Instance.StopSoundEffect(nowAudioSource)停止当前音效。
- 通过方向键上和下来调整背景音乐的音量,按下方向键上时,调用BaseAudioManager.Instance.ChangeBackgroundMusicVolume(1.0f)增加音量,按下方向键下时,调用BaseAudioManager.Instance.ChangeBackgroundMusicVolume(0.1f)减小音量。
- 通过方向键左和右来调整音效的音量,按下方向键左时,调用BaseAudioManager.Instance.ChangeSoundEffectVolume(1.0f)增加音量,按下方向键右时,调用BaseAudioManager.Instance.ChangeSoundEffectVolume(0.1f)减小音量。
9.2 知识点代码
BaseAudioManager
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
// 音频管理器的基类,负责管理背景音乐和音效
public class BaseAudioManager : BaseSingletonInCSharp<BaseAudioManager>
{
// 用于播放背景音乐的游戏对象和音频源
private GameObject backgroundMusicNode; // 背景音乐的游戏对象
private AudioSource backgroundMusicAudioSource = null; // 背景音乐的音频源
private float backgroundMusicVolume = 1; // 背景音乐的音量
// 用于播放音效的游戏对象和音频源列表
private GameObject soundEffectNode = null; // 音效的游戏对象
private List<AudioSource> soundEffectAudioSourceList = new List<AudioSource>(); // 音效的音频源列表
private float soundEffectVolume = 1; // 音效的音量
// 构造函数,初始化并监听生命周期更新事件
public BaseAudioManager()
{
// 添加生命周期更新事件监听
BaseMonoBehaviourManager.Instance.onUpdate.AddListener(OnUpdate);
}
// 每帧更新方法
private void OnUpdate()
{
// 遍历音效音频源列表,移除已经停止播放的音频源
for (int i = soundEffectAudioSourceList.Count - 1; i >= 0; --i)
{
if (!soundEffectAudioSourceList[i].isPlaying)
{
// 停止并销毁不再使用的音频源
GameObject.Destroy(soundEffectAudioSourceList[i]);
soundEffectAudioSourceList.RemoveAt(i);
}
}
}
// 播放背景音乐
public void PlayBackgroundMusic(string BackgroundMusicName)
{
if (backgroundMusicAudioSource == null)
{
// 创建背景音乐的游戏对象和音频源
backgroundMusicNode = new GameObject();
backgroundMusicNode.name = "BackgroundMusicNode";
backgroundMusicAudioSource = backgroundMusicNode.AddComponent<AudioSource>();
}
// 异步加载背景音乐资源,并设置音频源属性,然后播放
BaseResourceManager.Instance.LoadAsync<AudioClip>("Music/BackgroundMusic/" + BackgroundMusicName, (audioClip) =>
{
backgroundMusicAudioSource.clip = audioClip;
backgroundMusicAudioSource.loop = true; // 背景音乐循环播放
backgroundMusicAudioSource.volume = backgroundMusicVolume; // 设置背景音乐音量
backgroundMusicAudioSource.Play(); // 播放背景音乐
});
}
// 暂停背景音乐
public void PauseBackgroundMusic()
{
if (backgroundMusicAudioSource == null) return;
// 暂停背景音乐的播放
backgroundMusicAudioSource.Pause();
}
// 停止背景音乐
public void StopBackgroundMusic()
{
if (backgroundMusicAudioSource == null) return;
// 停止背景音乐的播放
backgroundMusicAudioSource.Stop();
}
// 改变背景音乐的音量
public void ChangeBackgroundMusicVolume(float backgroundMusicVolume)
{
this.backgroundMusicVolume = backgroundMusicVolume;
if (backgroundMusicAudioSource == null)
return;
// 更新背景音乐的音量
backgroundMusicAudioSource.volume = this.backgroundMusicVolume;
}
// 播放音效
public void PlaySoundEffect(string name, bool isLoop, UnityAction<AudioSource> callBack = null)
{
if (soundEffectNode == null)
{
// 创建音效的游戏对象
soundEffectNode = new GameObject();
soundEffectNode.name = "SoundEffectNode";
}
// 异步加载音效资源,并创建音频源,然后播放音效
BaseResourceManager.Instance.LoadAsync<AudioClip>("Music/SoundEffect/" + name, (audioClip) =>
{
AudioSource audioSource = soundEffectNode.AddComponent<AudioSource>();
audioSource.clip = audioClip;
audioSource.loop = isLoop; // 设置音效是否循环播放
audioSource.volume = soundEffectVolume; // 设置音效音量
audioSource.Play(); // 播放音效
soundEffectAudioSourceList.Add(audioSource); // 将音频源添加到列表中
// 执行回调函数(如果有)
if (callBack != null)
callBack(audioSource);
});
}
// 改变音效的音量
public void ChangeSoundEffectVolume(float soundEffectVolume)
{
this.soundEffectVolume = soundEffectVolume;
for (int i = 0; i < soundEffectAudioSourceList.Count; ++i)
soundEffectAudioSourceList[i].volume = soundEffectVolume;
}
// 停止指定的音效
public void StopSoundEffect(AudioSource audioSource)
{
if (soundEffectAudioSourceList.Contains(audioSource))
{
// 从音效列表中移除音频源,停止播放,并销毁
soundEffectAudioSourceList.Remove(audioSource);
audioSource.Stop();
GameObject.Destroy(audioSource);
}
}
}
Lesson09_音效模块
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lesson09_音效模块 : MonoBehaviour
{
AudioSource nowAudioSource;
private void Update()
{
// 按下空格键播放背景音乐
if (Input.GetKeyDown(KeyCode.Space))
{
BaseAudioManager.Instance.PlayBackgroundMusic("Black");
}
// 按下P键暂停背景音乐
if (Input.GetKeyDown(KeyCode.P))
{
BaseAudioManager.Instance.PauseBackgroundMusic();
}
// 按下S键停止背景音乐
if (Input.GetKeyDown(KeyCode.S))
{
BaseAudioManager.Instance.StopBackgroundMusic();
}
// 按下A键播放音效(循环播放)
if (Input.GetKeyDown(KeyCode.A))
{
BaseAudioManager.Instance.PlaySoundEffect("Gun", true,(audioSource)=>
{
nowAudioSource = audioSource;
});
}
// 按下x键播放音效(循环播放)
if (Input.GetKeyDown(KeyCode.X))
{
BaseAudioManager.Instance.PlaySoundEffect("Gun", false, (audioSource) =>
{
nowAudioSource = audioSource;
});
}
// 按下D键停止音效
if (Input.GetKeyDown(KeyCode.D))
{
BaseAudioManager.Instance.StopSoundEffect(nowAudioSource);
}
// 调整背景音乐音量(示例中使用方向键上和下)
if (Input.GetKeyDown(KeyCode.UpArrow))
{
BaseAudioManager.Instance.ChangeBackgroundMusicVolume(1.0f); // 增加音量
}
else if (Input.GetKeyDown(KeyCode.DownArrow))
{
BaseAudioManager.Instance.ChangeBackgroundMusicVolume(0.1f); // 减小音量
}
// 调整音效音量(示例中使用方向键左和右)
if (Input.GetKeyDown(KeyCode.LeftArrow))
{
BaseAudioManager.Instance.ChangeSoundEffectVolume(1.0f); // 增加音量
}
else if (Input.GetKeyDown(KeyCode.RightArrow))
{
BaseAudioManager.Instance.ChangeSoundEffectVolume(0.1f); // 减小音量
}
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com