unity全局音量管理/全局音量设置与音量设置界面(含静音功能)

这篇具有很好参考价值的文章主要介绍了unity全局音量管理/全局音量设置与音量设置界面(含静音功能)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 前言

本文将会介绍如何使用audiomixer实现全局音量控制,并且会介绍如何实现游戏内的含静音功能的音量设置界面。

本人也是个初学者,在看过一些关于音量管理的教程后,发现使用audiomixer实现全局音量控制可能是最方便、功能最完备、强大的,因此在这里分享一下自己的实现方法。如果有错误,还请指出捏

基础

音效成功播放需要两个先决条件:音频源 (Audio Source) 音频监听器 (Audio Listener)。

音频源 (Audio Source) 在场景中播放音频,而音频监听器 (Audio Listener) 充当类似于麦克风的设备。它接收来自场景中任何给定音频源的输入,并通过计算机扬声器播放声音。

unity全局音量管理/全局音量设置与音量设置界面(含静音功能)

AudioListener和AudioSource

 其中,Audio Listener 会在相机创建时自动创建,当同一场景中的Audio Listener数量大于1时,unity编辑器会报错unity全局音量管理/全局音量设置与音量设置界面(含静音功能)

混音器 (Audio Mixer) 允许混合各种音频源,对音频源应用效果。在音频源脚本(Audio Source)的Output挂载AudioMixer的Group Controller文件后,这个音频源就会放出应用了AudioMixer效果的音频。基于此,通过使用代码对AudioMixer的音量进行动态调整,我们就可以实现游戏内动态调整这一个音频源的音量,进而调整全局音量了。

逻辑:

游戏中的音频大致可分为 音效(Sound) 和音乐(Music)两种,因此我们这里就只实现对音效和音乐的设置,同时实现对主音量(Master)的设置

unity全局音量管理/全局音量设置与音量设置界面(含静音功能)

逻辑关系

 文章来源地址https://www.toymoban.com/news/detail-479429.html

 AudioMixer制作

1.create->AudioMixerunity全局音量管理/全局音量设置与音量设置界面(含静音功能)

 2.打开AudioMixer

unity全局音量管理/全局音量设置与音量设置界面(含静音功能)

这个NewAudioMixer就是新建的AudioMixer

 3.点击Group的加号创建Music、Sound,并设置好层级关系

unity全局音量管理/全局音量设置与音量设置界面(含静音功能)

需要拖动,将三个group的层级关系设置为如图所示

 4.在每个group的inspector中右键Volume,并将volume属性暴露出去unity全局音量管理/全局音量设置与音量设置界面(含静音功能)

5.如图所示,重命名暴露出去的volume属性unity全局音量管理/全局音量设置与音量设置界面(含静音功能)

至此,AudioMixer就基本完成了。将AudioMixer文件夹下的Audio Mixer Group Controller文件拖动到AudioSource的Output中,这个AudioSource放出的音频就都将会应用对应Group的效果。

下面,我们就可以通过动态设置刚才暴露出的volume属性来实现音量设置了。开始愉快的写代码吧~

 

音量设置面板实现

在这里,我简单地假设开发情形如下:有两个场景,每个场景播放不同的背景音乐。那么,就只需要在两个场景中创建两个搭载了AudioSource,并循环播放bgm的空物体,即可实现播放背景音乐的需求

unity全局音量管理/全局音量设置与音量设置界面(含静音功能)

如图所示

 而音效的播放,则是在所有场景中都会频繁地使用到,并且播放的音效各不相同,因此需要创建一个用于播放音效的持续单例脚本,使其在场景切换时不被摧毁,并且便于其他脚本调用播放音效的脚本,满足整个游戏的音效播放需求。

至于音量设置,由常理可知音量是全局均可设置的,因此也使用持续单例模式开发,并且用滑动条(sliider)来调节音量。

同时:我们需要实现音量设置面板的如下功能:

1.静音按钮

2.取消静音时回调滑动条到未静音时的值

那么,我们将这一个功能的实现分为两个部分:持续单例AudioManager,以及一个继承了monobehavior的脚本,用于控制其所处场景的音量ui。

 

AudioManager脚本

(我偷懒,就把播放音效功能和AudioManager脚本写到一起了,虽然这样不会有什么大问题,但二者终究不是同一个功能,可能会导致代码比较混乱)

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Audio;

//使用单例模式开发,继承单例父类,使其在场景切换时不销毁
//同时包括音量设置功能和播放音效功能
public class AudioManager : PersistentSingleton<AudioManager>
{
    [SerializeField] AudioMixer audioMixer;
    
    //改变音调
    const float pitchMin = 0.9f;
    const float pitchMax = 1.1f;
    
    //用于判断静音与否
    private bool IsMuteMaster = false;
    private bool IsMuteMusic = false;
    private bool IsMuteSound = false;
    //用于储存静音前的音量
    private float LastMaster;
    private float LastMusic;
    private float LastSound;

    //音量设置
    //Slider on click:调节音量,若静音则取消静音
    public void MasterSldOnClick(GameObject image, Slider slider)
    {
        audioMixer.SetFloat("vMaster", slider.value);
        if (IsMuteMaster == false) return;
        else
        {
            image.SetActive(false);
            IsMuteMaster = false;
        }
    }
    public void MusicSldOnClick(GameObject image, Slider slider)
    {
        audioMixer.SetFloat("vMusic", slider.value);
        if (IsMuteMusic == false) return;
        else
        {
            image.SetActive(false);
            IsMuteMusic = false;
        }
    }
    public void SoundSldOnClick(GameObject image, Slider slider)
    {
        audioMixer.SetFloat("vSound", slider.value);
        if (IsMuteSound == false) return;
        else
        {
            image.SetActive(false);
            IsMuteSound = false;
        };
    }

    //Button on click:若静音则取消静音并回调音量;若未静音则静音并储存音量
    public void MasterBtnOnClick(GameObject image, Slider Master)
    {
        if (IsMuteMaster)
        {
            image.SetActive(false);
            IsMuteMaster = false;
            Master.value = LastMaster;
        }

        else
        {
            image.SetActive(true);
            LastMaster = Master.value;
            Master.value = Master.minValue;
            IsMuteMaster = true;
        }
    }
    public void SoundBtnOnClick(GameObject image, Slider Sound)
    {
        if (IsMuteSound)
        {
            image.SetActive(false);
            IsMuteSound = false;
            Sound.value = Instance.LastSound;
        }

        else
        {
            image.SetActive(true);
            LastSound = Sound.value;
            Sound.value = Sound.minValue;
            IsMuteSound = true;
        }
    }
    public void MusicBtnOnClick(GameObject image, Slider Music)
    {
        if (IsMuteMusic)
        {
            image.SetActive(false);
            IsMuteMusic = false;
            Music.value = LastMusic;
        }

        else
        {
            image.SetActive(true);
            LastMusic = Music.value;
            Music.value = Music.minValue;
            IsMuteMusic = true;
        }
    }
    

    [SerializeField] AudioSource SoundPlayer;
    //播放音效
    public void PlaySound(AudioClip audioClip)
    {
        SoundPlayer.pitch = 1;
        SoundPlayer.PlayOneShot(audioClip);
    }

    // 改变音调,主要用于重复播放的音效
    public void PlayRandomSound(AudioClip audioClip)
    {
        SoundPlayer.pitch = Random.Range(pitchMin , pitchMax );
        SoundPlayer.PlayOneShot(audioClip);
    }

    public void PlayRandomSound(AudioClip[] audioClip)
    {
        PlayRandomSound(audioClip[Random.Range(0, audioClip.Length)]);
    }
}

其中 ,PersistentSingleton为持续泛型单例父类,使脚本挂载的物体不随场景改变而销毁,并且使其他脚本更容易调用本脚本内容。代码见下,详情可见unity单例,实现全局保存/跨场景传输数据

using UnityEngine;

public class PersistentSingleton<T> : MonoBehaviour where T : Component
{
    public static T Instance { get; private set; }

    protected virtual void Awake()
    {
        if (Instance == null)
        {
            Instance = this as T;
        }
        else if (Instance != this)
        {
            Destroy(gameObject);
        }

        DontDestroyOnLoad(gameObject);
    }
}

 写完AudioManager脚本后,将AudioManager挂载到一个第一个场景的空物体上,以便生效(或是挂载到可以调节音量的第一个场景也行)。然后再将刚做好的AudioMixer和用于播放音效的AudioSource拖进脚本里面就行了~

unity全局音量管理/全局音量设置与音量设置界面(含静音功能)

AudioSource和AudioManager如上图所示
在这种实现方式下,需要把AudioSource放在AudioManager下,防止跨场景销毁。但这是基于只用这一个音源就可满足整个游戏音效需求的大前提下的,可能会有更好的实现方法。

 

AudioManager是全局起作用的,只需要在调节滑动条(slider)时调用三个SldOnClick函数/点击按钮时调用三个BtnOnClick函数,即可以实现全局调节音量的功能。

不过值得注意的是,三个BtnOnClick函数中有一条命令:Sound.value = Instance.LastSound。这条命令不会导致bug,会正常触发SldOnClick,因为SldOnClick的触发条件实际上是On Value Change(所有slider都是),只要值变化就可以触发,而并非一定要click。

 

各场景音量设置界面,以及设置界面脚本

下面,我们需要为每个场景创建音量设置界面,这里只创建一个场景的,因为其他场景也是一样的,实际开发时复制粘贴就行。

1.滑动条(slider)

slider组件比较复杂,虽然不难,但是创建一个功能完备的slider也不是一两句就能说完的,这里时跳过,不懂的小伙伴可以去找些教程,先创建一个能用的滑动条。

unity全局音量管理/全局音量设置与音量设置界面(含静音功能)

 

2.音量设置界面

unity全局音量管理/全局音量设置与音量设置界面(含静音功能)

按照上图思路,继续创建音效和音乐的设置界面。unity全局音量管理/全局音量设置与音量设置界面(含静音功能)

 3.设置界面脚本

using UnityEngine;
using UnityEngine.UI;

public class TestScene : MonoBehaviour
{
    [Header("-----音量设置条-----")]
    [SerializeField] Slider Master;
    [SerializeField] Slider Music;
    [SerializeField] Slider Sound;

    //SldOnClick:传递参数以触发AudioManager的SldOnClick
    public void MasterSldOnClick(GameObject image)
    {
        AudioManager.Instance.MasterSldOnClick(image, Master);
    }
    public void MusicSldOnClick(GameObject image)
    {
        AudioManager.Instance.MusicSldOnClick(image, Music);
    }
    public void SoundSldOnClick(GameObject image)
    {
        AudioManager.Instance.SoundSldOnClick(image, Sound);
    }

    //BtnOnClick:传递参数以触发AudioManager的BtnOnClick
    public void MasterBtnOnClick(GameObject image)
    {
        AudioManager.Instance.MasterBtnOnClick(image, Master);
    }
    public void SoundBtnOnClick(GameObject image)
    {
        AudioManager.Instance.SoundBtnOnClick(image, Sound);
    }
    public void MusicBtnOnClick(GameObject image)
    {
        AudioManager.Instance.MusicBtnOnClick(image, Music);
    }

}

这个脚本实际上只是起到了传递参数的作用,这么做一方面时因为,多个参数的函数不能挂载到button、slider等组件上,另一方面是因为, AudioManager是持续单例,在某些场景中不是初始存在,无法直接挂载到组件上,需要使用代码动态调用。

将这个脚本挂载到场景中(随便哪都行),并将三个slider挂载到脚本上即可。unity全局音量管理/全局音量设置与音量设置界面(含静音功能)

 3.配置按键与滑动条

以Master按键和滑动条为例:

unity全局音量管理/全局音量设置与音量设置界面(含静音功能)

将刚才设置好的脚本挂到button组件下,并选择MasterBtnOnClick函数,将按键的子物体image挂到这个函数下面

unity全局音量管理/全局音量设置与音量设置界面(含静音功能)

Sound、Music同上

同样的,给Master的slider挂上 MasterSldOnClick函数,同样的把Master的叉号挂到函数下即可。

至此,整个音量设置界面就做完了unity全局音量管理/全局音量设置与音量设置界面(含静音功能)

 

 

 

 

 

到了这里,关于unity全局音量管理/全局音量设置与音量设置界面(含静音功能)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity光照相关知识和实践 (烘焙光照,环境光设置,全局光照)

    本文将会通过一个简单的场景搭建,介绍如何使用烘焙光照以及相关的注意事项。另外还介绍了Unity内全局光照(GI)的知识和GI实际在游戏内的表现效果。 Unity关于光照相关的参考文档地址:https://docs.unity.cn/cn/current/Manual/LightingOverview.html 下面是一些基本的概念 直接光照指的

    2024年02月15日
    浏览(39)
  • OBS 基础之 混音面板 及 实际静音后,动态后移控件功能

    目录 一、混音面板 1、mixerDock 创建 2、scrollArea 3、volumeWidgets 4、添加音量控件

    2024年02月12日
    浏览(33)
  • android 12.0音量键功能开关(屏蔽音量加减功能)

    在12.0的系统定制化开发中,要求屏蔽掉音量+ 音量-的功能,根据系统属性来判断是否响应音量加减的功能,在系统上层中是由PhoneWindowManage来管理音量键的功能, 所以就要看是PhoneWindowManage.java中怎么处理的音量键的功能 首选看的源码关于音量键的处理 路径:/frameworks/base/se

    2024年02月06日
    浏览(38)
  • Unity中UGUI界面的分辨率适配设置

    以下是个人对Unity中屏幕适配方案的理解: 一、Scale With Screen Size方案(根据屏幕大小自动缩放) 1、如果选用的是下图所示的分辨率适配方案,也就是把Canvas和Canvas Scaler这两个组件中设置和下图一样的话。 还有就是你所制作的UI界面一定是要挂载在和下图中一样设置的Canvas物

    2024年02月16日
    浏览(61)
  • 【Java】学生成绩管理系统(图形化界面实现相关功能)

    从功能的代码实现到界面的展示整个制作过程全部用Java语言实现。         1、在idea创建一个工程文件,在工程文件下创建一个model模块,在model模块下载创建三个package包分别用来存放(BackEndCode)后端代码包、(MainExe)主程序包、(WebCode)界面实现代码包,再在三个包中创建如

    2024年02月03日
    浏览(50)
  • Unity 控制最终输出音量

    可以控制Unity最终输出的音量大小

    2024年02月12日
    浏览(64)
  • Unity使用滑动条Slider控制AudioSource音量,音量不能及时改变的问题

    个人遇到的一个问题:       滑动条Slider控制AudioSource音量,虽然音源大小确实和滑动条值同步改变,但是实际音量并未同步改变, 只有当我关闭UI界面时,音量才会发生改变。 这个问题我试了好久没有解决,所以干脆换一种思路, 通过滑动条控制 AudioMixer 控制音量大小 使

    2023年04月24日
    浏览(48)
  • Android Audio音量设置原理流程分析

    本篇文章主要介绍Android音量设置从App应用层到framework层执行流程,以及相关的细节和原理分析,建议在阅读此文章前去看博主的混音理论篇的声音的音量属性和声音相关公式的推导章节,这对阅读时理解音量等级、音量分贝计算有着很大的益处;如果阅读时发现文章有错误,

    2024年02月15日
    浏览(52)
  • JS控制视频播放、暂停、倍速、音量等功能

    HTML  CSS: JS:(暂时没做优化什么的)

    2024年02月11日
    浏览(51)
  • 如何在Linux设置JumpServer实现无公网ip远程访问管理界面

    JumpServer 是广受欢迎的开源堡垒机,是符合 4A 规范的专业运维安全审计系统。JumpServer 帮助企业以更安全的方式管控和登录所有类型的资产,实现事前授权、事中监察、事后审计,满足等保合规要求。 下面介绍如何简单设置即可使本地jump server 结合cpolar 内网穿透实现远程访问

    2024年02月04日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包