iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Unity如何实现高效的音效管理类
  • 552
分享到

Unity如何实现高效的音效管理类

2023-07-05 14:07:22 552人浏览 安东尼
摘要

本篇内容介绍了“Unity如何实现高效的音效管理类”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!效果自动维护一个 AudiOSource的池

本篇内容介绍了“Unity如何实现高效的音效管理类”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

效果

Unity如何实现高效的音效管理类

自动维护一个 AudiOSource的池子

如果超过了池子的峰值 池子会生成一个新的AudioSource对象来进行扩容

  • 支持2D音效调用方式 public void PlaySound( string url, float volume = 1.0f, bool loop = false )

  • 支持2D音乐调用方式 public void PlayMusic( string url, float volume = 1.0f, bool loop = true )

  • 支持3D音效调用方式 public void PlaySoundAtPoint( string url, Vector3 position, float volume = 1f )

食用方式

更改这块的加载 用你们自己框架里的加载方式 或者 走 Resource.Load

Unity如何实现高效的音效管理类

源码

using ResourceFramework;using System.Collections.Generic;using UnityEngine;public class AudioManager : SingleTon<AudioManager>{    Queue<AudioSource> freeAudioSources = new Queue<AudioSource>();    List<AudioSource> activeAudioSources = new List<AudioSource>();    Dictionary<string, List<AudioSource>> playingSources = new Dictionary<string, List<AudioSource>>();    List<AudioSource> musicSources = new List<AudioSource>();    List<AudioSource> soundSources = new List<AudioSource>();    Dictionary<string, Audioclip> audioClips = new Dictionary<string, AudioClip>();    TransfORM transform;    public float soundVolume { private set; get; } = 1.0f;    public float musicVolume { private set; get; } = 1.0f;    public bool soundMute { private set; get; } = false;    public bool musicMute { private set; get; } = false;    /// <summary>    /// 初始化 给音效节点们一个爸爸    /// </summary>    /// <param name="root"></param>    public void Init( Transform root )    {        transform = root;        LoadAudioClip();//默认音效加载    }    /// <summary>    /// 加载本地音效到音效缓存池    /// </summary>    /// <param name="url"></param>    public void LoadAudioClip( string url = "Assets/AssetBundle/Sounds" )    {        AudioClip[] clips = null;        //#if UNITY_EDITOR        //        var files = System.IO.Directory.GetFiles( url );        //        var clipList = new List<AudioClip>();        //        foreach ( var file in files )        //        {        //            var ac = UnityEditor.AssetDatabase.LoadAssetAtPath<AudioClip>( file );        //            if ( null != ac )        //            {        //                clipList.Add( ac );        //            }        //        }        //        clips = clipList.ToArray();        //#else        List<AudioClip> clipList = new List<AudioClip>();        for ( int i = 0; i < AllSoundName.allSoundPath.Length; i++ )        {            clipList.Add( Loader.LoadAsset<AudioClip>( $"{url}/{AllSoundName.allSoundPath[ i ]}.mp3" ) );        }        clips = clipList.ToArray();        //#endif        foreach ( var clip in clips )        {            audioClips.Add( clip.name, clip );        }    }    /// <summary>    /// 缓存一个音效到池子里    /// </summary>    /// <param name="audioClip"></param>    public void Cache( AudioClip audioClip )    {        if ( !audioClips.ContainsKey( audioClip.name ) )        {            audioClips.Add( audioClip.name, audioClip );        }    }    /// <summary>    /// 需要主动去调用这个更新检查  当然你也可以开一个定时器来检测    /// </summary>    public void OnUpdate()    {        for ( int i = 0; i < activeAudioSources.Count; i++ )        {            if ( !activeAudioSources[ i ].isPlaying )            {                var free = activeAudioSources[ i ];                free.gameObject.SetActive( false );                freeAudioSources.Enqueue( free );                activeAudioSources.RemoveAt( i-- );                soundSources.Remove( free );                musicSources.Remove( free );            }        }    }    /// <summary>    /// 设置 音效系统音量 0~1    /// </summary>    /// <param name="volume"></param>    public void SetSoundSysVolume( float volume )    {        float newVolume = Mathf.Clamp( volume, 0, 1 );        float scale = newVolume / soundVolume;        soundVolume = newVolume;        foreach ( var asource in soundSources )        {            asource.volume *= scale;        }    }    /// <summary>    /// 设置 音乐系统音量 0~1    /// </summary>    /// <param name="volume"></param>    public void SetMusicSysVolume( float volume )    {        float newVolume = Mathf.Clamp( volume, 0, 1 );        float scale = newVolume / musicVolume;        musicVolume = newVolume;        foreach ( var asource in musicSources )        {            asource.volume *= scale;        }    }    /// <summary>    /// 设置音效静音状态    /// </summary>    /// <param name="isMute"></param>    public void SetSoundMuteState( bool isMute )    {        soundMute = isMute;        foreach ( var asource in soundSources )        {            asource.mute = soundMute;        }    }    /// <summary>    /// 设置音乐静音状态    /// </summary>    /// <param name="isMute"></param>    public void SetMusicMuteState( bool isMute )    {        musicMute = isMute;        foreach ( var asource in musicSources )        {            asource.mute = musicMute;        }    }    /// <summary>    /// 播放音乐 默认循环播放    /// </summary>    /// <param name="url"></param>    /// <param name="volume"></param>    /// <param name="loop"></param>    public void PlayMusic( string url, float volume = 1.0f, bool loop = true )    {        if ( freeAudioSources.Count == 0 )        {            GenAudioSouceNew();        }        var audioSource = freeAudioSources.Dequeue();        activeAudioSources.Add( audioSource );        Recoverd( url, audioSource );        audioSource.gameObject.SetActive( true );        audioSource.volume = volume * musicVolume;        audioSource.mute = soundMute;        audioSource.loop = loop;        audioSource.spatialBlend = 0f;        audioSource.clip = GetAudioClip( url );        audioSource.Play();        if ( soundSources.Contains( audioSource ) )        {            soundSources.Remove( audioSource );        }        if ( !musicSources.Contains( audioSource ) )        {            musicSources.Add( audioSource );        }    }    /// <summary>    /// 停掉所有url相关的音效    /// 因为是可以同时存在多个相同url的音效的  它们都有自己的生命周期    /// </summary>    /// <param name="url"></param>    public void StopMusic( string url )    {        if ( playingSources.ContainsKey( url ) )        {            playingSources[ url ].ForEach( s => s.Stop() );            playingSources.Remove( url );        }    }    /// <summary>    /// 播放音效 默认单次播放    /// </summary>    /// <param name="url"></param>    /// <param name="volume"></param>    /// <param name="loop"></param>    public void PlaySound( string url, float volume = 1.0f, bool loop = false )    {        if ( freeAudioSources.Count == 0 )        {            GenAudioSouceNew();        }        var audioSource = freeAudioSources.Dequeue();        activeAudioSources.Add( audioSource );        Recoverd( url, audioSource );        audioSource.gameObject.SetActive( true );        audioSource.volume = volume * soundVolume;        audioSource.mute = soundMute;        audioSource.loop = loop;        audioSource.spatialBlend = 0f;        audioSource.clip = GetAudioClip( url );        audioSource.Play();        if ( musicSources.Contains( audioSource ) )        {            musicSources.Remove( audioSource );        }        if ( !soundSources.Contains( audioSource ) )        {            soundSources.Add( audioSource );        }    }    /// <summary>    /// 3D世界播放一个音效  指定一个位置    /// </summary>    /// <param name="url"></param>    /// <param name="position"></param>    /// <param name="volume"></param>    public void PlaySoundAtPoint( string url, Vector3 position, float volume = 1f )    {        if ( freeAudioSources.Count == 0 )        {            GenAudioSouceNew();        }        var audioSource = freeAudioSources.Dequeue();        activeAudioSources.Add( audioSource );        Recoverd( url, audioSource );        audioSource.gameObject.transform.position = position;        audioSource.gameObject.SetActive( true );        audioSource.clip = GetAudioClip( url );        audioSource.volume = volume * soundVolume;        audioSource.mute = soundMute;        audioSource.loop = false;        audioSource.spatialBlend = 1f;        audioSource.Play();    }    public void PlayClipAtPoint( AudioClip clip, Vector3 position, float volume = 1f )    {        foreach ( var item in audioClips )        {            if ( item.Value == clip )            {                PlaySoundAtPoint( item.Key, position, volume );                break;            }        }    }    public AudioClip GetAudioClip( string url )    {        AudioClip clip = null;        if ( audioClips.TryGetValue( url, out clip ) )        {            return clip;        }        return null;    }    private void GenAudioSouceNew()    {        var obj = new GameObject( $"AudioComponent_{( activeAudioSources.Count + freeAudioSources.Count )}" );        obj.transform.SetParent( transform, true );        var asource = obj.AddComponent<AudioSource>();        asource.loop = false;        asource.volume = 0;        asource.playOnAwake = false;        asource.mute = false;        freeAudioSources.Enqueue( asource );    }    private void Recoverd( string url, AudioSource ac )    {        List<AudioSource> result = null;        if ( !playingSources.TryGetValue( url, out result ) )        {            result = new List<AudioSource>();            playingSources.Add( url, result );        }        result.Add( ac );    }}

“Unity如何实现高效的音效管理类”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: Unity如何实现高效的音效管理类

本文链接: https://www.lsjlt.com/news/352572.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Unity如何实现高效的音效管理类
    本篇内容介绍了“Unity如何实现高效的音效管理类”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!效果自动维护一个 AudioSource的池...
    99+
    2023-07-05
  • Unity实现高效的音效管理类的示例代码
    目录效果食用方式源码效果 自动维护一个 AudioSource的池子 如果超过了池子的峰值 池子会生成一个新的AudioSource对象来进行扩容 支持2D音效调用方式 publi...
    99+
    2023-03-22
    Unity实现音效管理类 Unity音效管理类 Unity音效管理
  • Unity音效空间定位与混响效果如何实现
    在Unity中,音效的空间定位与混响效果可以通过以下方式实现: 空间定位:可以使用Audio Source组件中的Spatial...
    99+
    2024-05-09
    Unity
  • 如何在Unity中实现音效的空间定位和混响效果
    要在Unity中实现音效的空间定位和混响效果,可以按照以下步骤操作: 首先确保你的场景中已经添加了一个Audio Source组...
    99+
    2024-05-09
    Unity
  • LeetCode算法如何实现容器的高效管理?
    在计算机科学中,容器是一种数据结构,可以存储和组织其他对象。容器在编程中发挥着重要的作用,包括但不限于存储,管理和查找数据。在实际编程中,我们经常需要对容器进行操作,如添加,删除,搜索等。LeetCode算法是一种常用的算法思想,可以帮助...
    99+
    2023-06-13
    分布式 leetcode 容器
  • svn高效管理怎么实现
    本篇内容介绍了“svn高效管理怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!svn通过采用分支管理系统的高效管理;简而言之就是用于多...
    99+
    2023-07-02
  • Unity如何实现瞄准镜效果
    这篇文章将为大家详细讲解有关Unity如何实现瞄准镜效果,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Unity实现瞄准镜效果的具体代码,具体内容如下using UnityEngine;usin...
    99+
    2023-06-14
  • 如何实现Unity常用音频操作类
    小编给大家分享一下如何实现Unity常用音频操作类,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体代码如下所示:using UnityEngine;u...
    99+
    2023-06-20
  • Bash中如何使用Java API实现高效的日志管理?
    在现代软件开发中,日志管理是非常重要的一环。通过对日志的记录和分析,我们可以更好地理解应用程序的行为并及时发现潜在的问题。在Bash脚本中,我们可以使用Java API来实现高效的日志管理。 Java API是Java编程语言提供的一套库...
    99+
    2023-10-27
    api django bash
  • 如何利用ASP存储API实现高效的负载管理?
    ASP存储API是一种强大的工具,可以帮助开发者实现高效的负载管理。在本文中,我们将探讨如何利用ASP存储API来实现高效的负载管理,并提供一些演示代码帮助你更好地理解。 一、什么是ASP存储API? ASP存储API是一种用于在应用程序中...
    99+
    2023-07-29
    存储 api load
  • 如何在 Linux 中实现高效的 Go 应用缓存管理?
    在 Linux 中使用 Go 语言开发应用程序已经成为了一个趋势。这是因为 Go 语言具有高效、简单、可靠和并发性强等特点。但是在开发过程中,缓存管理是一个常见的问题。本文将介绍如何在 Linux 中实现高效的 Go 应用缓存管理。 一、G...
    99+
    2023-06-13
    面试 缓存 linux
  • Unity ScrollView如何实现无限循环效果
    小编给大家分享一下Unity ScrollView如何实现无限循环效果,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体内容如下在Unity引擎中ScrollVi...
    99+
    2023-06-20
  • Unity如何实现人像动漫化效果
    这篇文章主要介绍了Unity如何实现人像动漫化效果的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Unity如何实现人像动漫化效果文章都会有所收获,下面我们一起来看看吧。接口介绍:运用对抗生成网络技术,结合人脸检...
    99+
    2023-06-26
  • Unity ScrollView如何实现无限滑动效果
    小编给大家分享一下Unity ScrollView如何实现无限滑动效果,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、效果演示二、前言当邮件中有1000封邮件,...
    99+
    2023-06-20
  • JavaScript实现带音效的烟花特效
    花了半个小时写的代码,这个html5 canvas新年烟花一定不会让大家失望! 首先我们看下静态的效果图: 文章末尾有动态的效果图,滑动即可看到!  JavaScript代码如下:...
    99+
    2024-04-02
  • 如何高效管理香港服务器
    高效管理香港服务器的方法:1、定期更新香港服务器操作系统和应用程序;2、确保香港服务器数据备份正常;3、监控香港服务器的硬件状态、CPU、RAM和磁盘使用情况;4、删除香港服务器中的旧用户和旧应用程序;5、定期修改香港服务器密码;6、使用防...
    99+
    2024-04-02
  • 如何利用PHP接口实现高效的分布式日志管理?
    随着互联网和移动互联网的快速发展,大量的数据被生成和记录,这些数据对于企业的经营和管理都具有非常重要的意义。其中,日志数据作为一种重要的信息资源,被广泛地应用于系统监控、故障排查、性能分析等领域。然而,对于大规模的日志数据,传统的单机存储和...
    99+
    2023-06-27
    接口 分布式 日志
  • 如何利用ASP.NET Core实现高效的大数据存储和管理?
    ASP.NET Core是一种开源的Web框架,可以帮助开发人员快速创建高性能的Web应用程序。当涉及到大数据的存储和管理时,ASP.NET Core可以提供许多有用的工具和功能,使这个过程更加高效和可靠。下面我们将介绍如何利用ASP.NE...
    99+
    2023-07-10
    大数据 leetcode linux
  • 如何在Java中实现高效的缓存加载和缓存管理?
    Java作为一门广泛应用于企业级应用的编程语言,在实现高效的缓存加载和缓存管理方面也有着非常出色的表现。本文将详细介绍如何在Java中实现高效的缓存加载和缓存管理。 一、什么是缓存? 缓存是指将计算出来的结果或者是需要频繁读取的数据存储在内...
    99+
    2023-09-27
    load 缓存 编程算法
  • 如何在 ASP 框架中实现高效的分布式路径管理?
    在ASP框架中实现高效的分布式路径管理,是许多Web应用程序开发人员必须面对的问题。为了解决这个问题,我们需要一个可靠的方案,使应用程序可以快速地响应客户端的请求。本文将介绍如何在ASP框架中实现高效的分布式路径管理,并提供相关演示代码供参...
    99+
    2023-10-19
    框架 path 分布式
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作