unity混音

前言
在游戏中,通常我们需要控制整个游戏的主音量(全局音量),并且单独控制背景音乐和其他音效(攻击、爆炸之类)的音量,这时我们可以用Audio Mixer来解决。

如果文章中有哪些地方写的不对, 欢迎指出。

 

提醒
在这篇教程中我将重新创建一个简单的工程来给大家演示,并且我当前使用的Unity版本为2018.1.1f1。

本文并非零基础教程,但是写了有点太详细,且有大约30张图,所以又臭又长...

工程中用到3个音频文件作为测试,分别为背景音乐、玩家攻击和敌人爆炸。

 

正文
1、新建工程导入资源
将3个音频文件放在Audio目录下:

 

 

2、创建音量调节面板UI
 创建了3个滑动条分别控制主音量、音乐和音效,并且将滑动条的默认值设为1:

 

 
3、创建声音播放源
(1)背景音乐

创建一个空物体(GameObject)来作为背景音乐的载体,改名为Background Music,添加一个Audio Source组件(要使用Audio Mixer控制音量必须要用Audio Source来播放音频),将背景音乐音频文件拖到AudioClip中,勾选Loop让背景音乐循环播放:

 

(2)玩家攻击音效

创建一个空物体改名为Player,添加Audio Source组件,将玩家攻击音效拖入AudioClip,取消勾选Play On Awake:

 

 并且添加了一个名为Player的脚本(脚本放在Scripts文件夹下)来模拟玩家攻击播放攻击音效,代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{

private AudioSource audioSource;

void Start ()
{
audioSource = GetComponent<AudioSource>();
}

void Update () {
if (Input.GetKeyDown(KeyCode.Q))
{
audioSource.Play(); // 按下Q键播放玩家攻击音效
}
}
}
(3)敌人爆炸音效

和设置Player步骤相同,只不过物体和脚本名变成了Enemy,播放按键设为E,拖入敌人爆炸音效,取消勾选Play On Awake:

 

 
3、创建Audio Mixer
1. 在Audio文件夹下创建Mixers文件夹,右键点击Mixers文件夹 --> Creat --> Audio Mixer:

 

2. 创建后改名为MasterMixer,我们用这个Audio Mixer来控制全局音量;双击打开我们创建的MasterMixer,将打开的窗口拉出来方便我们查看:

 

3. 接下来我们单击选择Groups下的Master,再点击Groups右边的 + 添加成员;我们需要创建两个成员,分别命名为Music和SoundEffect:

 

4. 我们会发现MasterMixer下多出了几个东西

 

5. 我们要用Music成员来控制背景音乐,所以我们把Music成员拖到Background Music物体的Audio Source组件下的Output中:

 

6. 然后我们点击Mixers右边的 + ,再创建一个名为SoundEffectMixer的Audio Mixer,我们用这个Mixer而来管理玩家攻击和敌人爆炸音效,并且将这个Mixer也放到Mixers文件夹下,方便管理:

 

7. 然后我们选择刚创建的SoundEffectMixer,单击选择Master,点击Groups右边的 + ,创建两个成员,分别为PlayerAttack和EnemyExplosion,分别代表玩家攻击和敌人爆炸音效:

 

8. 我们再次单击左键选择SoundEffectMixer,拖到上面的MasterMixer,然后会弹出一个窗口,选择SoundEffect:

 

9. 将PlayerAttack成员拖到Player物体的Audio Source组件下的Output中;

将EnemyExplosion成员拖到Enemy物体的Audio Source组件下的Output中:

 

 

10. 我们现在看一下Mixer和成员间的层级关系:

现在我们可以通过MasterMixer下的Master来控制全局主音量,通过Music来控制背景音乐音量,通过SoundEffect来控制玩家攻击和敌人爆炸音效。

 

 
4、暴露参数
我们需要先将Master、Music和SoundEffect的参数暴露(Expose)出来,这样我们才可以通过代码去控制音量:

1. 首先暴露出Master的参数:

 

2. 然后点击Exposed Parameters,选择我们刚暴露出来的Master的参数,按下F2更改名字为MasterVolume:

 

3. 对Music和SoundEffect进行同样的操作(1,2步操作),然后我们就有3个暴露出来的参数:

 

 
5、控制音量
现在我们有了参数就可以让我们控制音量了,那么接下来就进行音量的控制:

1. 在Menu Canvas(也可以新建一个空物体,随意)下新建一个脚本名为AudioManager,代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Audio;

public class AudioManager : MonoBehaviour
{

public AudioMixer audioMixer; // 进行控制的Mixer变量

public void SetMasterVolume(float volume) // 控制主音量的函数
{
audioMixer.SetFloat("MasterVolume", volume);
// MasterVolume为我们暴露出来的Master的参数
}

public void SetMusicVolume(float volume) // 控制背景音乐音量的函数
{
audioMixer.SetFloat("MusicVolume", volume);
// MusicVolume为我们暴露出来的Music的参数
}

public void SetSoundEffectVolume(float volume) // 控制音效音量的函数
{
audioMixer.SetFloat("SoundEffectVolume", volume);
// SoundEffectVolume为我们暴露出来的SoundEffect的参数
}
}
2. 将MasterMixer拖到AudioManager脚本上:

 

3. 然后我们将3个滑动条分别绑定这3个函数:

 

 

4. 将3个滑动条都绑定号函数后,我们就可以通过滑动条来分别控制Master、Music和SoundEffect的值了:


5. 但是现在滑动条只能让参数的值在1和0间变化,声音大小没有变化,所以我们需要修改滑动条的最小值和最大值来解决;

我们先要测试下声音的大小区间,点击Edit in Play Mode,拖动滑动块,找出声音最小和最大的值:

 

6. 然后我们修改滑动条的最小值和最大值:

 

7. 全部滑动条都调整好了之后我们就可以正常调节音量的大小了;

(1)主音量控制全局音量(包括了背景音乐和音效)

(2)音乐控制背景音乐

(3)音效控制玩家攻击和敌人爆炸音效

 

 
4、结束语
完结撒花,累死我了...
————————————————
原文链接:https://blog.csdn.net/iFasWind/article/details/81182579

转载于:https://www.cnblogs.com/xiaoahui/p/11553769.html

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

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

相关文章

一个较完整的关键字过滤解决方案(上)

如果您希望看到关键字过滤算法的话那么可能就要失望了。博客园中已经有不少关于此类算法的文章&#xff08;例如这里和这里&#xff09;&#xff0c;虽然可能无法直接满足特定需求&#xff0c;但是已经足够作为参考使用。而本文的目的&#xff0c;是给出一个较为完整的关键字过…

【转】Thunderbird中配置签名

原文网址&#xff1a;https://support.mozilla.org/zh-CN/kb/Thunderbird%E4%B8%AD%E9%85%8D%E7%BD%AE%E7%AD%BE%E5%90%8D “签名”是一块自动附加到每个您发出的消息的文字&#xff08;包括新消息和对收到消息的回复&#xff09;。他们通常用来提供与每个消息有关的附加联系信…

依赖注入Bean属性——手动装配Bean

一、构造方法注入 其中&#xff0c;可以根据不同的参数列表调用不同的重载的构造方法&#xff1b; 其中&#xff0c;基本数据类型没有包&#xff0c;引用类型都有包路径&#xff0c;基本类型对应封装类&#xff1b; 二、通过property标签调用类的set方法注入 三、通过p命名空间…

ADO.NET数据库

ASP.NET提供了ADO.NET技术&#xff0c;它是ASP.NET应用程序与数据库进行交互的一种技术。 ADO.NET技术把对数据库的操作分为几个步骤&#xff0c;并为每个步骤提供对象来封装操作过程&#xff0c;从而使对数据库的操作变得简单易行。 ADO.NET组件通过以下两个主要的组件将数据访…

十天学会ASP.Net——(2)

2.Web控件 1&#xff09;WebControl基类属性 参考http://msdn.microsoft.com/zh-cn/library/7zt8s89c 2&#xff09;Form控件&#xff08;很简单&#xff09; 应用&#xff1a;实现如下效果 <form id"form1" runat"server"> <div> 班级:<br…

Spring表达式

一、SpEL 其中&#xff0c;直接写也可以赋值&#xff0c;‘ ’ 单引号引起来后成为一个字符串对象&#xff0c;可以调用String的方法&#xff1b; 二、引用另外一个bean 装配这个类的bean&#xff1a; 1、第一种方法&#xff0c;property标签中使用bean引用 2、使用Spring表达…

集合属性注入值

一、集合注入&#xff0c;装配bean的时候&#xff0c;即在xml中添加bean的时候 1、List集合 2、set集合&#xff0c;无序&#xff0c;即无索引&#xff0c;所以也无重复&#xff0c; 3、map key-value键值对双列集合&#xff0c;内置接口Entry 4、Properties集合&#xff0c;可…

QuerySyntax(查询语法)

Code/// <summary>/// QuerySyntax&#xff08;查询语法&#xff09;的摘要说明/// </summary>public class QuerySyntax { public int ID { get; set; } public string Name { get; set; } public void QuerySyntaxTest() { List<Quer…

二、ceph编译源码、单机搭建调试环境

2019独角兽企业重金招聘Python工程师标准>>> 准备一台机器&#xff1a; roottest3:~# cat /proc/version Linux version 3.13.0-32-generic (builddkissel) (gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1) ) #57-Ubuntu SMP Tue Jul 15 03:51:08 UTC 2014 一、下载ce…

C#与Unity 数据存储

使用Json存储数据 1.创建Json文件&#xff0c;直接创建txt文件&#xff0c;将后缀名改为xx.json 2.Json文件的数据格式&#xff0c;中括号表示列表&#xff0c;即中括号下的每个逗号隔开的内容都是列表的每个元素&#xff0c;花括号表示对象&#xff0c;冒号前面的表示属性名&a…

centos linux 系统日常管理4 scp,rsync,md5sum,sha1sum,strace ,find Rsync 常见错误及解决方法 第十七节课...

centos linux 系统日常管理4 scp,rsync,md5sum,sha1sum,strace ,find Rsync 常见错误及解决方法 第十七节课 rsync可以增量同步&#xff0c;scp不行 注意&#xff1a;修改sshd_config文件时候&#xff0c;port字段&#xff0c;sshd不支持监听小于1024 &#xff0c;1~1023不允…

注解@Component方式代替xml装配bean

一、Component 用注解来装配bean 1、 2、对类使用注解&#xff0c;装配bean&#xff1a; 3、类中&#xff0c;注入其他对象&#xff1a; 二、bean.xml中配置Componet方式装配bean 1、开启注解装配bean依赖注入方式和类使用的自动注入 2、 其中&#xff0c;通过类型获取对象时候…

ASP.NET2.0数据操作之创建业务逻辑层

导言 本教程的第一节所描述的数据访问层&#xff08;Data Access Layer&#xff0c;以下简称为DAL&#xff09;已经清晰地将表示逻辑与数据访问逻辑区分开了。不过&#xff0c;即使DAL将数据访问的细节从表示层中分离出来了&#xff0c;可它却不能处理任何的业务规则。比如说&a…

不使用注解和使用注解的web-service-dao结构

一、未使用注解的web-service-dao结构 1、action类源码 其中&#xff0c;service作为一个成员属性&#xff0c;采用的是层层调用&#xff0c;service类中dao作为一个成员属性&#xff0c;再成员方法中调用&#xff1b; 2、bean.xml中装配bean&#xff1a; 3、创建spring容器&am…

awk特殊用法

一、从固定格式中取出IP所在的class&#xff0c;并列出例&#xff1a;class A { 192.168.1.1 192.168.2.1 192.168.3.1 192.168.169.69}class B { 192.168.1.1 192.168.169.69}sed -nr /\{/{:1;N;/\}/!b1;/192.168.169.69/s#^([^{]).*#\1#p} fileawk -vRScla…

XML基础——extensible markup language

一、xml概念 1、xml和html区别 其中&#xff0c;xml是纯文本文件&#xff0c;跨语言&#xff1b;浏览器有html解析器也有xml解析器&#xff1b; 2、和properties配置文件区别 二、xml语法 1、基本语法 三、xml组成部分 中国电脑默认GBK编码格式&#xff08;中文编码&#xff09…

显示单选列表对话框

通过AlertDialog.Builder类的setSingleChoiceItems方法可以创建带单按钮的列表&#xff1a;方法如下&#xff1a;1、从资源文件中装载数据&#xff1a;public Builder setSingleChoiceItems(int itemsId, int checkedItem, final OnClickListener listener)2、从数据集中装载数…

全修CALL

PUSH -1PUSH 0PUSH 0CALL 005A8690ADD ESP,0Cbp send,点全修CTRLf9一直返回到没有参数 基本上这个返回就是 功能CALL 0012EB08 005869B2 返回到 elementc.005869B2 来自 elementc.0058E8A00012EB1C 00588B1F 返回到 elementc.00588B1F 来自 elementc.005869800012EB28 …

OSChina 周六乱弹 —— 这个版本的小红帽听说过吗?

2019独角兽企业重金招聘Python工程师标准>>> 想想当年刚出来工作的时候&#xff0c;小小编还真是单纯&#xff0c;以为广阔天地大有作为&#xff0c;可是呢。。。 上热门&#xff1a;刚出来工作的时候&#xff0c;大人千叮万嘱社会很复杂&#xff0c;要学会控制自己…

XML解析

一、解析xml的两种方式 1、 其中&#xff0c;xml文件被解析之后产生的dom树可能是原xml文件内存的成千上万倍&#xff0c;所以占内存&#xff1b;一般是服务器端&#xff1b; 2、sax逐行读取解析的方式&#xff0c;读一行释放一行&#xff0c;移动端采用&#xff1b; 其中&…