UnityVR--AudioManager--音频管理中心

这篇具有很好参考价值的文章主要介绍了UnityVR--AudioManager--音频管理中心。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言

建立音频配置文件AudioConfig

建立音频管理AudioManager

使用AudioManager播放音效


前言

  关于音频组件的简单使用请详见VideoPlayer&AudioSource,不过在一个工程项目中,会有很多的声音文件,播放的时间和条件也不相同,因此在实际制作中,需要集中管理,这就是建立AudioManager的原因。

  先做好准备,下载好需要的声音片段,这里准备了背景音效bgm和走路音效step,存放到Assets/Resources/Audio文件夹下

建立音频配置文件AudioConfig

  1. 创建一个AudioConfig.cs脚本:

[CreateAssetMenu(fileName = "AudioConfig", menuName = "tang/AudioConfig", order = 1)]
public class AudioConfig : ScriptableObject //继承这个类,会将配置文件作为唯一的实例保存
{
    public string audioPath = "Audio/";  //音频的总路径,在Resources/Audio下
    [Range(0, 1)]
    public float mainVolume = 1;    //主音量
    [Range(0, 1)]
    public float effectVolume = 1;  //音效音量
    [Range(0, 1)]
    public float bgmVolume = 1;     //背景音乐音量
    public List<AudioData> audioLibrary;
}

  说明:(1)CreateAssetMenu用于在Project窗口中点右键的菜单中生成一个自己命名的菜单,这里生成一个AudioConfig菜单,用于配置AudioConfig类中的参数

UnityVR--AudioManager--音频管理中心

   (2)ScriptableObject类,用于存储配置数据,详见ScriptableObject使用指南_YY-nb的博客

  2. AudioConfig类中的AudioData,定义了音效的设置参数,可以直接写在AudioConfig.cs脚本中:

[Serializable]  //将AudioData序列化,以便于在面板中看到
public struct AudioData
{
    //通过字符串找到相应的声音片段
    public string key;
    //音频资源文件
    public AudioClip clip;
    //音量控制属性
    [Range(0,1)]
    public float volume;
    //音频类型
    public EAudioType type;
}

  3. AudioData中的类型EAudioType,是一个枚举类型,定义了音效的类型,比如背景音效、跑步音效等

public enum EAudioType
{
    BGM,EFFECT
}

  4. 这样,在右键->tang->AudioConfig之后,就可以新建一个声音配置文件,在它的管理列表中点“+”号就可以添加一个新的音效片段的管理数据,这些数据将被放入AudioManager的字典中随时调用。

UnityVR--AudioManager--音频管理中心

建立音频管理AudioManager

  在这里要设置对于背景音效、效果音等不同类型音的:播放、停止、调整音量等一些实用工具,根据项目的需要还可以设计一些其他的实用工具。这些都写在AudioManager.cs中,这是一个管理阶层的工具,同样继承于SingleMono单例,挂在场景中的SingleMono空节点上。

  1. 先定义一下管理中需要使用到的参数:建立一个播放背景音的声音源和一个播放音效的声音源,建立音量参数,以及一个字典用于存储声音片段及相关的数据:

public class AudioManager : SingleMono<AudioManager>
{
    public AudioSource bgmSource; //背景音声音源
    public GameObject effectSource;//音效声音源
    public AudioConfig audioConfig; //声音配置文件,自定义

    [Range(0, 1)] private float mainVolume = 1;    //总的音量,规定取值范围
    [Range(0, 1)] private float effectVolume = 1;  //音效音量
    [Range(0, 1)] private float bgmVolume = 1;     //背景音乐音量

    //定义一个字典用于存储音效名及需要传输的数据
    private Dictionary<string, AudioData> audioLibrary;

    void Awake()
    {
        audioLibrary= new Dictionary<string, AudioData>();
        foreach(var data in audioConfig.audioData)
        {//遍历一下audioConfig中的audioData列表
            //将列表中的所有数据加入到字典中
            audioLibrary.Add(data.key, data);
        }
        mainVolume = audioConfig.mainVolume; //把在面板中设置的音量值加载进来
        effectVolume = audioConfig.effectVolume;
        bgmVolume = audioConfig.bgmVolume;
    }
}

  这需要在场景中设置两个空节点,bgmSource和effectSource,bgmSource中加入AudioSource组件,effectSource节点空着。并将它们和上面的AudioConfig文件拖入到相应的三个public变量中:

UnityVR--AudioManager--音频管理中心 UnityVR--AudioManager--音频管理中心

   2. 加入播放BGM的一些工具,这里只是列举了一些,当需要其他的BGM控制工具时再来增加:

    //播放背景音效
    public void PlayBGM(string key, bool isLoop, Action onComplete = null)
    {//通过key找到字典中相应的数据,是否循环,播放完毕后回调
        AudioData data;
        if (!audioLibrary.TryGetValue(key, out data))
        {//字典中没有找到该key 
            Debug.LogError("音频:" + key + "播放出错!");
            return;
        }
        float volume = mainVolume + data.volume + bgmVolume;//最终音量
        //使用AudioSource的API设置并播放音效
        bgmSource.clip = data.clip;
        bgmSource.loop = isLoop;
        bgmSource.volume = volume;
        bgmSource.Play();//使用AudioSource的API-Play()播放音效
    }
    //使用AudioSource的API暂停和取消暂停
    public void PauseBGM()
    {
        bgmSource.Pause();
    }
    public void unPauseBGM()
    {
        bgmSource.UnPause();
    }
    public void changeBGMVolume(float volume)
    {//修改音量值,传入一个音量系数
        bgmSource.volume = bgmSource.volume / bgmVolume * volume;
        bgmVolume = volume;
    }
    public void ResetBGMVolume()
    {//重置音量
        bgmSource.volume = bgmSource.volume / bgmVolume * audioConfig.bgmVolume;
        bgmVolume = audioConfig.bgmVolume;
    }
    public void StopBGM(Action onComplete = null)
    {//停止播放
        bgmSource.Stop();
        bgmSource.clip = null;
        onComplete?.Invoke(); //回调
    }

   3. 加入播放其他音效的一些办法,也包括了上面这些方法,有所不同的是,背景音乐同时播放的只有一个,而音效可能会播放多个。因此音效的AudioSource组件需要动态添加,需要播放几个音效就要添加几个组件:

    public AudioSource PlayEffect(string key, bool isloop)
    {//播放音效
        AudioData data;
        if (!audioLibrary.TryGetValue(key, out data))
        {
            Debug.LogError("音频:" + key + "播放音效出错!");
            return default;
        }
        float volume = mainVolume * data.volume * effectVolume;//最终音效音量计算

        //音效有可能会同时播放多个,所以AudioSource组件有可能加载多个
        AudioSource[] sources = effectSource.GetComponents<AudioSource>();

        //是否找到空闲的AudioSource组件
        bool bTmp = false;
        foreach(var audios in sources)
        {
            if(!audios.isPlaying)  //如果这个AudioSource不在播放状态
            {
                audios.clip = data.clip;
                audios.loop = isloop;
                audios.volume = volume;
                bTmp = true;        //将判断改为在用状态
                audios.Play();      //开始播放音效
                return audios;      //播放完成之后,将值返回出去
            }
        }

        if (!bTmp)
        {
            var source = effectSource.AddComponent<AudioSource>();  //如果没有找到空闲的AudioSource则增加一个
            source.clip = data.clip;
            source.loop = isloop;
            source.volume = volume;
            source.Play();
            return source;
        }
        return default;
    }

使用AudioManager播放音效

  定义一个Test.cs随意挂在场景

public class Test : MonoBehaviour
{
    // 播放音频
    void Start()
    {
        AudioManager.Instance.PlayBGM("BGM", true); //播放背景音效
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.T))  //按下T键时播放音效
        {
            AudioManager.Instance.PlayEffect("Step", false);
        }
    }
}

  相应的AudioConfig设置:

UnityVR--AudioManager--音频管理中心

   效果就不放了,声音播放也没有办法展示。文章来源地址https://www.toymoban.com/news/detail-483563.html

到了这里,关于UnityVR--AudioManager--音频管理中心的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 《Git入门实践教程》前言+目录

    版本控制系统(VCS)在项目开发中异常重要,但和在校大学生的交流中知道,这个重要方向并未受到重视。具备这一技能,既是项目开发能力的体现,也可为各种面试加码。在学习体验后知道,Git多样化平台、多种操作方式、丰富的资源为业内人士提供了方便的同时,也造成

    2024年02月10日
    浏览(66)
  • FPGA学习实践之旅——前言及目录

    很早就有在博客中记录技术细节,分享一些自己体会的想法,拖着拖着也就到了现在。毕业至今已经半年有余,随着项目越来越深入,感觉可以慢慢进行总结工作了。趁着2024伊始,就先开个头吧,这篇博客暂时作为汇总篇,记录在这几个月以及之后从FPGA初学者到也算有一定

    2024年02月03日
    浏览(55)
  • UnityVR--UIManager--UI管理2

    目录 前言  UIManger的实现   1.  需要用到的变量和数据   2. 在构造中的工作   3. 初始化面板   4. 显示面板 5. 隐藏面板和隐藏所有面板   6. 其他小工具  在场景中实现   1.  不同面板的类型设置   2.  场景中的设置   接前篇,上一篇已经有了UITools.cs其中定义了UI面板需要使

    2024年02月13日
    浏览(30)
  • UnityVR--UIManager--UI管理1

    目录 前言 UI节点的结构 需要用到的组件   1. CanvasGroup   2. Button等控件的OnClick()监听   3. EventTrigger 建立UI工具集   1. 管理UI节点   2.  UIBase包含了以下的工具 建立分面板的管理工具——以主面板MainUi为例   UI在项目中的重要性不言而喻,并且UI控件的种类繁多(UGUI简单介绍

    2024年02月11日
    浏览(26)
  • UnityVR--组件6--Animation动画

    目录 新建动画Animation Animation组件解释 应用举例1:制作动画片段 应用举例2:添加动画事件 Animator动画控制器 应用举例3:在Animator中设置动画片段间的跳转 本篇使用的API:Animation、Animator以及Animator类中的SetFloat、SetInteger、SetBool等,以及短小动画片段的制作 新建动画Animati

    2024年02月15日
    浏览(42)
  • UnityVR--组件5--Animation动画

    目录 新建动画Animation Animation组件解释 应用举例1:制作动画片段 应用举例2:添加动画事件 Animator动画控制器 应用举例3:在Animator中设置动画片段间的跳转 本篇使用的API:Animation、Animator以及Animator类中的SetFloat、SetInteger、SetBool等,以及短小动画片段的制作 新建动画Animati

    2024年02月08日
    浏览(43)
  • School StartsFirstProject~UnityVR(HTCVive设备开发)

    @作者 : SYFStrive     质量达到99的文章分享给大家💪 @作者 : SYFStrive @博客首页 : HomePage 🥧: Unity版本2019 💪 📜: VR虚拟现实 📌: 个人社区(欢迎大佬们加入) 👉: 社区链接🔗 📌: 觉得文章不错可以点点关注 👉: VR开发专栏🔗 💃: 程序员每天坚持锻炼💪 🔗: 点

    2024年02月03日
    浏览(34)
  • Unity 音频插件 - MasterAudio 实现音频管理系统

    插件介绍: Master Audio的是一个整体解决方案,所有的丰富的游戏音频需求。内置的音乐闪避,手动和自动的声音触发真正的随机声音变化,音频汇集全3D声音功能。支持所有出口的手机游戏平台,具有一流的性能。 主音频在线帮助网站可在此处找到: Table of Contents 完整的 主

    2023年04月10日
    浏览(45)
  • ealtek高清晰音频管理器(realtek高清晰音频管理器怎么设置win10)

    本文为大家介绍realtek高清晰音频管理器(realtek高清晰音频管理器怎么设置win10),下面和小编一起看看详细内容吧。 我们都使用电脑来听音乐、看电影或者进行其他操作,但是如果我们觉得电脑产生的音效不够立体,我们就会想要去Realtek来设置音频管理器系统音效。不过还是

    2024年02月10日
    浏览(42)
  • 使用端点中心进行补丁管理

    什么是补丁管理 补丁管理是为网络中的所有操作系统和应用程序检测、下载、测试、批准和安装新补丁/缺失补丁的过程。它需要集中查看网络中端点的适用补丁,以便可以一目了然地对易受攻击、高度易受攻击和健康的系统进行分类。这有助于发现需要注意的系统,以便采

    2024年02月16日
    浏览(50)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包