“声音”音源设置和音效播放

学习如何使用音效系统,背景音乐和其他特别的音效,跳跃攻击等等

学习如何在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,抖动的效果会好一些,根据需求去修改

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ICP许可证网站模板审核专用下载

ICP许可证网站模板审核专用下载 在当今的数字化时代&#xff0c;互联网的合规性变得尤为重要&#xff0c;特别是在中国。ICP许可证&#xff0c;即互联网信息服务业务经营许可证&#xff0c;是经营性网站必须持有的合法证件。为了帮助网站快速达到合规要求&#xff0c;选择合适…

出海IAA产品如何提升广告展示率?

大家好&#xff0c;我是牢鹅&#xff01;对于出海有做IAA的开发者来说&#xff0c;收益的增长至关重要。而广告收益&#xff0c;又与广告展示率息息相关。 牢鹅根据自身经验和AdMob的一些公开资料&#xff0c;总结了下面几点和提升广告展示率的方法&#xff0c;大家可以对照进…

在不支持AVX的linux上使用PaddleOCR

背景 公司的虚拟机CPU居然不支持avx, 默认的paddlepaddle的cpu版本又需要有支持avx才行,还想用PaddleOCR有啥办法呢? 是否支持avx lscpu | grep avx 支持avx的话,会显示相关信息 如果不支持的话,python运行时导入paddle会报错 怎么办呢 方案一 找公司it,看看虚拟机为什么…

数字图像处理的概念(二)

一 图像处理的概念 1 图像处理的内容 它是研究图像的获取、传输、存储、变换、显示、理解与综合利用的一门崭新学科。根据抽象程度不同可分为三个层次&#xff1a;狭义图像处理、图像分析和图像理解。如图 1.2.1 所示。 具体而言&#xff0c;数字图像处理的内容包括 图像的数…

【OceanBase探会】云与 AI 赋能一体化数据库的创新之旅

前言 哈喽&#xff0c;大家好&#xff0c;我是不叫猫先生&#xff0c;非常荣幸受邀参加2024年10月23日的「OceanBase2024年度发布会」&#xff0c;感受这场数据库技术的盛宴。 在云和 AI 时代&#xff0c;构建一体化数据库已成为现代数据架构的核心。随着数据量的激增和应用场…

Linux系统块存储子系统分析记录

1 Linux存储栈 通过网址Linux Storage Stack Diagram - Thomas-Krenn-Wiki-en&#xff0c;可以获取多个linux内核版本下的存储栈概略图&#xff0c;下面是kernel-4.0的存储栈概略图&#xff1a; 2 存储接口、传输速度 和 协议 2.1 硬盘 《深入浅出SSD&#xff1a;固态存储核心…

信息安全工程师(69)数字水印技术与应用

前言 数字水印技术是一种在数字媒体中嵌入特定信息的技术&#xff0c;这些信息可以是版权信息、元数据等。 一、数字水印技术的定义与原理 数字水印技术&#xff08;Digital Watermarking&#xff09;是将一些标识信息&#xff08;即数字水印&#xff09;直接嵌入数字载体&…

ASP.NET Core开发Chatbot API

本文介绍基于ASP.NET Core的Chatbot Restful API开发&#xff0c;通过调用大语言模型的SDK&#xff0c;完成一个简单的示例。并且通过容器化进行部署. 安装 首先需要安装.NET环境&#xff0c;笔者在Ubuntu 22.04通过二进制包进行安装&#xff0c;Windows和Mac下都有installer…

DDR Study - LPDDR Write and Training

参考来源&#xff1a;JESD209-4B&#xff0c;JESD209-4E LPDDR Initial → LPDDR Write Leveling and DQ Training → LPDDR Read and Training → LPDDR Write and Training → LPDDR Clock Switch → PIM Technical Write Command 基于JEDEC标准中可以看到Write Timing信息…

LC专题:图

文章目录 133. 克隆图 133. 克隆图 题目链接&#xff1a;https://leetcode.cn/problems/clone-graph/?envTypestudy-plan-v2&envId2024-spring-sprint-100 又一次写到这个题目&#xff0c;思路仍然不清晰&#xff0c;给我的感觉是使用递归解题&#xff0c;但是递归具体…

基于springboot企业微信SCRM管理系统源码带本地搭建教程

系统是前后端分离的架构&#xff0c;前端使用Vue2&#xff0c;后端使用SpringBoot2。 技术框架&#xff1a;SpringBoot2.0.0 Mybatis1.3.2 Shiro swagger-ui jpa lombok Vue2 Mysql5.7 运行环境&#xff1a;jdk8 IntelliJ IDEA maven 宝塔面板 系统与功能介绍 基…

雷池社区版有多个防护站点监听在同一个端口上,匹配顺序是怎么样的

如果域名处填写的分别为 IP 与域名&#xff0c;那么当使用进行 IP 请求时&#xff0c;则将会命中第一个配置的站点 以上图为例&#xff0c;如果用户使用 IP 访问&#xff0c;命中 example.com。 如果域名处填写的分别为域名与泛域名&#xff0c;除非准确命中域名&#xff0c;否…

顶点着色网格转换为 UV 映射的纹理化网格

https://dylanebert-instanttexture.hf.space/ 简介 顶点着色是一种将颜色信息直接应用于网格顶点的简便方法。这种方式常用于生成式 3D 模型的构建&#xff0c;例如InstantMesh。然而&#xff0c;大多数应用程序更偏好使用 UV 映射的纹理化网格。 InstantMeshhttps://hf.co/sp…

3D-IC——超越平面 SoC 芯片的前沿技术

“3D-IC”&#xff0c;顾名思义是“立体搭建的集成电路”&#xff0c;相比于传统平面SoC&#xff0c;3D-IC引入垂直堆叠芯片裸片&#xff08;die&#xff09;和使用硅通孔&#xff08;TSV&#xff09;等先进封装技术&#xff0c;再提高性能、降低功耗和增加集成度方面展现了巨大…

H7-TOOL的LUA小程序教程第15期:电压,电流,NTC热敏电阻以及4-20mA输入(2024-10-21,已经发布)

LUA脚本的好处是用户可以根据自己注册的一批API&#xff08;当前TOOL已经提供了几百个函数供大家使用&#xff09;&#xff0c;实现各种小程序&#xff0c;不再限制Flash里面已经下载的程序&#xff0c;就跟手机安装APP差不多&#xff0c;所以在H7-TOOL里面被广泛使用&#xff…

springboot080房屋租赁管理系统的设计与实现(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;房屋租赁管理系统的设计与实现 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好…

Java 输入与输出(I\O)之对象流与对象序列化

什么是Java的对象流&#xff1f; Java对象流是用于存储和读取基本数据类型数据或对象数据的输入输出流。 Java的对象流可分为两种&#xff1a; 1&#xff0c;对象输入流类ObjectInputStream 用于从数据源读取对象数据&#xff0c;它是可以读取基本数据类型数据或对象数据的输…

pikachu靶场CSRF-token测试报告

目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、抓包使用burp生成csrf脚本 四、源代码分析 五、结论 一、测试环境 1、系统环境 渗透机&#xff1a;本机(127.0.0.1) 靶 机&#xff1a;本机(127.0.0.1) 2、使用工具/软件 Burp sui…

python+大数据+基于热门视频的数据分析研究【内含源码+文档+部署教程】

博主介绍&#xff1a;✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ &#x1f345;由于篇幅限制&#xff0c;想要获取完整文章或者源码&#xff0c;或者代做&am…

QT 调用QRencode库生成二维码和使用Code128生成简单条形码

目录导读 前言使用Code128生成简单条形码使用QRencode库生成二维码添加QRencode.Pri 模块化 前言 对在QT开发中使用QRencode库生成二维码 和使用Code128生成简单条形码 进行一个学习使用总结。 使用Code128生成简单条形码 ‌Code128条形码是一种高密度条码&#xff0c;广泛应用…