9.音效模块

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

×

喜欢就点赞,疼爱就打赏