Unity_JK框架【5】音效系统实现

news2025/5/15 4:27:01

在游戏开发中,音频是不可或缺的一部分,它能够极大地增强游戏的沉浸感和趣味性。今天,我们就用JK框架 探讨一下如何在Unity中实现一个强大的音频系统,并且通过实际的测试脚本来验证其功能👏。

一、音频模块类:AudioModule

模块概述

AudioModule类是整个音频系统的核心,它负责管理背景音乐和特效音乐的播放、音量控制、循环和暂停等功能。让我们先来看看这个类的整体结构和关键属性😃。

关键属性

  • BGAudioSource:用于播放背景音乐的AudioSource组件。
  • EffectAudioPlayPrefab:特效音乐播放器的预制体。
  • EffectAudioDefaultQuantity:对象池预设的播放器数量,默认为20个。
  • audioPlayList:存储场景中所有生效的特效音乐播放器的列表。

音量和播放控制

AudioModule类中,我们可以通过一系列属性来控制全局音量、背景音乐音量、特效音乐音量,以及是否静音、循环和暂停等状态😜。例如:

[SerializeField, Range(0, 1), OnValueChanged("UpdateAllAudioPlay")]
private float globalVolume;
public float GlobalVolume
{
    get => globalVolume;
    set
    {
        if (globalVolume == value) return;
        globalVolume = value;
        UpdateAllAudioPlay();
    }
}

这里的GlobalVolume属性可以用来设置全局音量,并且当音量值发生变化时,会调用UpdateAllAudioPlay方法来更新所有播放器的音量。

背景音乐播放

AudioModule类提供了多种方法来播放背景音乐,包括单个音频剪辑的播放和音频剪辑数组的循环播放。例如:

public void PlayBGAudio(AudioClip clip, bool loop = true, float volume = -1, float fadeOutTime = 0, float fadeInTime = 0)
{
    IsLoop = loop;
    if (volume != -1)
    {
        BGVolume = volume;
    }
    fadeCoroutine = StartCoroutine(DoVolumeFade(clip, fadeOutTime, fadeInTime));
}

这个方法可以播放指定的音频剪辑,并且支持淡入淡出效果,让背景音乐的切换更加平滑😏。

特效音乐播放

对于特效音乐,AudioModule类提供了PlayOneShot方法来播放一次性的音效。例如:

public void PlayOneShot(AudioClip clip, Component component = null, bool autoReleaseClip = false, float volumeScale = 1, bool is3d = true, Action callBack = null)
{
    // 初始化音乐播放器
    AudioSource audioSource = GetAudioPlay(is3d);
    if (component == null) audioSource.transform.SetParent(null);
    else
    {
        audioSource.transform.SetParent(component.transform);
        audioSource.transform.localPosition = Vector3.zero;
        // 宿主销毁时,释放父物体
        component.OnDestroy(OnOwerDestory, audioSource);
    }
    // 播放一次音效
    audioSource.PlayOneShot(clip, volumeScale);
    // 播放器回收以及回调函数
    callBack += () => PlayOverRemoveOwnerDesotryAction(component);         // 播放结束时移除宿主销毁Action
    RecycleAudioPlay(audioSource, clip, autoReleaseClip, callBack);
}

这个方法可以在指定的位置或组件上播放特效音乐,并且支持自动回收播放器和资源释放。

二、测试音频系统类:TestAudioSystem

测试概述

TestAudioSystem类是一个简单的测试脚本,用于验证AudioModule类的功能。它在游戏开始时播放背景音乐,并且在用户点击鼠标时播放点击音效😃。

测试代码

public class TestAudioSystem : MonoBehaviour
{
    public AudioClip bgAudio;
    public AudioClip clickAudio;
    // Start is called before the first frame update
    void Start()
    {
        //针对背景音乐的循环
        AudioSystem.IsLoop = false;

        AudioSystem.PlayBGAudio(bgAudio);
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            //播放点击音效
            //AudioSystem.PlayOneShot(clickAudio,Vector3.zero,false,1,false, OnClickAudioOver);

            //通过资源加载的形式加载音效  回收设为True
            AudioSystem.PlayOneShot(R.DefaultLocalGroup.clickMuc,Vector3.zero,true,1,false, OnClickAudioOver);
        }
    }

    private void OnClickAudioOver()
    {
        Debug.Log("您点击了一次,音效播放完毕");
    }
}

在这个脚本中,我们可以看到如何使用AudioSystem类来播放背景音乐和特效音乐,并且在音效播放完毕后执行回调函数。

三、音效管理的好处

1. 优化性能

  • 减少内存占用:通过合理的资源管理,可以避免重复加载相同的音效文件,减少内存的消耗。音效通常很大,如果不加以管理,可能会影响游戏的性能,尤其是在移动设备上。

  • 按需加载:音效可以在需要时动态加载和卸载,避免不必要的资源占用。例如,背景音乐通常在游戏开始时加载,而在场景切换时可以暂停或卸载。

2. 灵活的控制和配置

  • 集中控制:将音效的管理集中在一个地方(比如通过音效管理器),能够方便地统一控制所有音效的播放、暂停、音量调节等。

  • 音效切换:可以根据不同的游戏场景或用户操作来切换背景音或提示音,例如,切换场景时播放不同的背景音乐,或者在用户点击按钮时播放音效。

  • 音量和音效管理:可以在全局层面控制音效的音量,允许玩家设置音效的开关,或者在特定情况下(如游戏暂停时)关闭音效。

3. 增强用户体验

  • 情绪营造:通过合理的背景音和提示音配合,可以有效增强游戏的氛围。例如,背景音乐能够帮助玩家沉浸在游戏的世界中,而提示音则能够在玩家执行某个动作时提供即时反馈。

  • 减少噪音干扰:如果不管理音效资源,可能会出现重复的、不必要的音效,使得游戏体验变得嘈杂。而集中管理音效资源能让开发者轻松避免这种情况。

4. 可维护性和可扩展性

  • 统一管理:集中管理音效资源意味着,所有音效的逻辑和资源文件都能在一个地方找到,便于后期维护、修改和更新。例如,如果要修改某个音效的音量或替换背景音乐,只需要在一个地方做调整,避免在多个脚本中修改。

  • 易于扩展:随着游戏内容的增加,音效资源会不断增加,集中管理使得新增和扩展音效变得更加容易。你可以通过音效管理器方便地为不同的游戏场景、UI 按钮等添加音效。

5. 简化调试

  • 快速定位问题:音效管理有助于将所有音效的相关问题集中在一个模块中。如果音效出现问题(如没有播放或播放不正确),开发人员可以在音效管理器中集中调试,而无需查找多个脚本或物体。

  • 统一调试工具:在调试阶段,可以通过音效管理器的接口进行音效的实时控制,比如暂停所有音效、调整音量、切换背景音乐等,从而提高调试效率。

四、总结

通过AudioModule类和TestAudioSystem类的结合,我们实现了一个功能完善的Unity音频系统。这个系统可以方便地管理背景音乐和特效音乐的播放,并且支持音量控制、循环和暂停等功能。希望这篇博客能够帮助你更好地理解和实现Unity中的音频系统😘!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2375794.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

鸿蒙 从打开一个新窗口到Stage模型的UIAbility组件

打开一个新的窗口 我们首先来实现如何在一个应用中打开一个新窗口,使用的模型是 Stage 模型 在项目文件里,新建一个 newWindow.ets 新文件 src/main/ets/pages/newWindow.ets newWindow.ets文件里面随便写点什么都行,这里是第一步创建的文件…

长短期记忆网络(LSTM)深度解析:理论、技术与应用全景

长短期记忆网络(LSTM)作为循环神经网络(RNN)的重要变体,通过门控机制有效解决了传统RNN的梯度消失问题,成为时序数据处理的核心技术。本文从理论起源、数学建模、网络架构、工程实现到行业应用,…

c语言第一个小游戏:贪吃蛇小游戏02

接上文继续学习 ncurse的上下左右键获取 想要使用ncurse的功能键,也就是键盘快捷键,不是q、r、t,是 上下左右、F1、F2等等的键,我们叫做功能键要是想用这些功能键需要使用keypad函数 Keypad(stdscr,1); 从stdscr接收标准中&…

Android架构之自定义native进程

在Android五层架构中,native层基本上全是c的世界,这些c进程基本上靠android世界的第一个进程init进程创建,init通过rc配置文件,创建了众多的c子进程,也是这众多的c进程,构建了整个android世界的native层。 …

《100天精通Python——基础篇 2025 第18天:正则表达式入门实战,解锁字符串处理的魔法力量》

目录 一、认识正则表达式二、正则表达式基本语法2.1 行界定符2.2 单词定界符2.3 字符类2.4 选择符2.5 范围符2.6 排除符2.7 限定符2.8 任意字符2.9 转义字符2.10 反斜杠2.11 小括号2.11.1 定义独立单元2.11.2 分组 2.12 反向引用2.13 特殊构造2.14 匹配模式 三、re模块3.1 comp…

Nuitka 已不再安全? Nuitka/Cython 打包应用逆向工具 -- pymodhook

pymodhook是一个记录任意对Python模块的调用的库,用于Python逆向分析。 pymodhook库类似于Android的xposed框架,但不仅能记录函数的调用参数和返回值,还能记录模块的类的任意方法调用,以及任意派生对象的访问,基于pyob…

【C】初阶数据结构14 -- 归并排序

本篇文章主要是讲解经典的排序算法 -- 归并排序 目录 1 递归版本的归并排序 1) 算法思想 2) 代码 3) 时间复杂度与空间复杂度分析 (1) 时间复杂度 (2) 空间复杂度 2 迭代版本的归并…

华为网路设备学习-21 IGP路由专题-路由过滤(filter-policy)

一、路由过滤(filter-policy) 1、用于控制路由更新、接收的一个工具 2、只能过滤路由信息,无法过滤LSA 二、路由过滤(filter-policy)与动态路由协议 1、距离矢量路由协议 RIP动态路由协议 交换的是路由表&#xff0…

SAP 交货单行项目含税金额计算报cx_sy_zerodivide处理

业务背景:SAP交货单只有数量,没有金额,所以开发报表从订单的价格按数量计算交货单的金额。 用户反馈近期报表出现异常: ****2012/12/12 清风雅雨 规格变更 Chg 修改开始 ** 修改原因:由于余数为0时,可能会报错溢出。…

【Qt】之音视频编程1:QtAV的背景和安装篇

QtAV 背景与核心概念 1. 什么是 QtAV? QtAV 是一个基于 Qt 框架 和 FFmpeg 的多媒体播放库,旨在为 Qt 应用程序提供高性能、跨平台的音视频播放、处理及渲染功能。它封装了 FFmpeg 的底层编解码能力,并通过 Qt 的图形系统(如 QM…

算法与数据结构 - 二叉树结构入门

目录 1. 普通二叉树结构 1.1. 常见术语 1.2. 完全二叉树 (Complete Binary Tree) 1.3. 满二叉树 (Full Binary Tree) 2. 特殊二叉树结构 2.1. 二叉搜索树 (BST) 2.1.1. BST 基本操作 - 查找 2.1.2. BST 基本操作 - 插入 2.1.3. BST 基本操作 - 删除 2.2. 平衡二叉树…

如何使用远程桌面控制电脑

目的: 通过路由器使用pc控制台式机,实现了有线/无线pc与台式机的双向远程桌面控制 最核心就两条:get ip地址与被控制机器的账户与密码。 现象挺神奇:被控制电脑的电脑桌面处于休眠模式,此时强行唤醒被控电脑会导致中断…

SpringMVC-执行流程

目录 前言 一、SpringMVC执行流程 SpringMVC 主要组件 SpringMVC 的执行流程 简要分析执行流程 总结 前言 理解SpringMVC的执行流程是学习SpringMVC工作原理的重要一步。 项目内容参考:SpringMVC-简介及入门-CSDN博客 一、SpringMVC执行流程 SpringMVC 主要组…

计算机网络网络层(下)

一、互联的路由选择协议(网络层控制层面内容) (一)有关路由选择协议的几个概念 1.理想的路由算法 (1)理想路由算法应具备的特点:算法必须正确和完整的,算法在计算上应简单&#x…

深入学习Zookeeper的知识体系

目录 1、介绍 1.1、CAP 理论 1.2、BASE 理论 1.3、一致性协议ZAB 1、介绍 2、角色 3、ZXID和myid 4、 历史队列 5、协议模式 6、崩溃恢复模式 7、脑裂问题 2、zookeeper 2.1、开源项目 2.2、功能 2.3、选举机制 3、数据模型 3.1、介绍 3.2、znode分类 4、监听…

大模型核心运行机制

大模型核心运行机制目录 一、核心架构:Transformer的演进与改进1.1 核心组件包括:1.1.1 自注意力机制(Self-Attention)1.1.2 多头注意力(Multi-Head Attention)1.1.3 位置编码(Positional Encod…

uniapp跨平台开发HarmonyOS NEXT应用初体验

之前写过使用uniapp开发鸿蒙应用的教程,简单介绍了如何配置开发环境和运行项目。那时候的HbuilderX还是4.22版本,小一年过去了HbuilderX的正式版本已经来到4.64,历经了多个版本的更新后,跨平台开发鸿蒙应用的体验大幅提升。今天再…

2025软考【系统架构设计师】:两周极限冲刺攻略(附知识点解析+答题技巧)

距离2025上半年“系统架构设计师”考试已经只剩最后两周了,还没有准备好的小伙伴赶紧行动起来。为了帮助大家更好的冲刺学习,特此提供一份考前冲刺攻略。本指南包括考情分析、答题技巧、注意事项三个部分,可以参考此指南进行最后的复习要领&a…

使用 goaccess 分析 nginx 访问日志

介绍 goaccess 是一个在本地解析日志的工具, 可以直接在命令行终端环境中使用 TUI 界面查看分析结果, 也可以导出为更加丰富的 HTML 页面. 官网: https://goaccess.io/ 下载安装 常见的 Linux 包管理器中都包含了 goaccess, 直接安装就行. 以 Ubuntu 为例: sudo apt instal…

vue3与springboot交互-前后分离【完成登陆验证及页面跳转】

vue3实现与springboot交互【完成登陆及页面跳转】 提示:帮帮志会陆续更新非常多的IT技术知识,希望分享的内容对您有用。本章分享的是node.js和vue的使用。前后每一小节的内容是存在的有:学习and理解的关联性。【帮帮志系列文章】&#xff1a…