最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Unity實(shí)現(xiàn)高效的音效管理類的示例代碼

 更新時(shí)間:2023年03月22日 10:28:47   作者:極客柒  
這篇文章主要為大家詳細(xì)介紹了如何通過(guò)Unity實(shí)現(xiàn)高效的音效管理類,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的可以了解一下

效果

自動(dòng)維護(hù)一個(gè) AudioSource的池子

如果超過(guò)了池子的峰值 池子會(huì)生成一個(gè)新的AudioSource對(duì)象來(lái)進(jìn)行擴(kuò)容

  • 支持2D音效調(diào)用方式 public void PlaySound( string url, float volume = 1.0f, bool loop = false )
  • 支持2D音樂(lè)調(diào)用方式 public void PlayMusic( string url, float volume = 1.0f, bool loop = true )
  • 支持3D音效調(diào)用方式 public void PlaySoundAtPoint( string url, Vector3 position, float volume = 1f )

食用方式

更改這塊的加載 用你們自己框架里的加載方式 或者 走 Resource.Load

源碼

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>
    /// 初始化 給音效節(jié)點(diǎn)們一個(gè)爸爸
    /// </summary>
    /// <param name="root"></param>
    public void Init( Transform root )
    {
        transform = root;
        LoadAudioClip();//默認(rèn)音效加載
    }

    /// <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>
    /// 緩存一個(gè)音效到池子里
    /// </summary>
    /// <param name="audioClip"></param>
    public void Cache( AudioClip audioClip )
    {
        if ( !audioClips.ContainsKey( audioClip.name ) )
        {
            audioClips.Add( audioClip.name, audioClip );
        }
    }

    /// <summary>
    /// 需要主動(dòng)去調(diào)用這個(gè)更新檢查  當(dāng)然你也可以開(kāi)一個(gè)定時(shí)器來(lái)檢測(cè)
    /// </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>
    /// 設(shè)置 音效系統(tǒng)音量 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>
    /// 設(shè)置 音樂(lè)系統(tǒng)音量 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>
    /// 設(shè)置音效靜音狀態(tài)
    /// </summary>
    /// <param name="isMute"></param>
    public void SetSoundMuteState( bool isMute )
    {
        soundMute = isMute;
        foreach ( var asource in soundSources )
        {
            asource.mute = soundMute;
        }
    }

    /// <summary>
    /// 設(shè)置音樂(lè)靜音狀態(tài)
    /// </summary>
    /// <param name="isMute"></param>
    public void SetMusicMuteState( bool isMute )
    {
        musicMute = isMute;
        foreach ( var asource in musicSources )
        {
            asource.mute = musicMute;
        }
    }

    /// <summary>
    /// 播放音樂(lè) 默認(rèn)循環(huán)播放
    /// </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相關(guān)的音效
    /// 因?yàn)槭强梢酝瑫r(shí)存在多個(gè)相同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>
    /// 播放音效 默認(rèn)單次播放
    /// </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世界播放一個(gè)音效  指定一個(gè)位置
    /// </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實(shí)現(xiàn)高效的音效管理類的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于Unity音效管理類的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C#獲取任務(wù)欄顯示進(jìn)程的方法

    C#獲取任務(wù)欄顯示進(jìn)程的方法

    這篇文章主要介紹了C#獲取任務(wù)欄顯示進(jìn)程的方法,涉及C#針對(duì)進(jìn)程操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-08-08
  • C#串口通信總是丟數(shù)據(jù)的原因及解決方案

    C#串口通信總是丟數(shù)據(jù)的原因及解決方案

    在上位機(jī)開(kāi)發(fā)中,串口通信是一個(gè)非常常見(jiàn)的通信方式,尤其是在與嵌入式設(shè)備、PLC、傳感器等硬件設(shè)備進(jìn)行交互時(shí),串口通信簡(jiǎn)單、直接且廣泛應(yīng)用,但它也有自己的局限性,那么,為什么你的C#串口通信總是丟數(shù)據(jù)?本文將深度分析串口通信丟數(shù)據(jù)的原因,并提供一些有效的解決方案
    2025-02-02
  • C#信號(hào)量用法簡(jiǎn)單示例

    C#信號(hào)量用法簡(jiǎn)單示例

    這篇文章主要介紹了C#信號(hào)量用法,結(jié)合簡(jiǎn)單C#控制臺(tái)應(yīng)用程序形式分析了信號(hào)量的功能、定義、調(diào)用、釋放等操作技巧,需要的朋友可以參考下
    2016-07-07
  • C#編程調(diào)用Cards.dll實(shí)現(xiàn)圖形化發(fā)牌功能示例

    C#編程調(diào)用Cards.dll實(shí)現(xiàn)圖形化發(fā)牌功能示例

    這篇文章主要介紹了C#編程調(diào)用Cards.dll實(shí)現(xiàn)圖形化發(fā)牌功能,結(jié)合實(shí)例形式分析了C#動(dòng)態(tài)鏈接庫(kù)調(diào)用及圖形操作技巧,需要的朋友可以參考下
    2017-06-06
  • C# Path類---文件路徑解讀

    C# Path類---文件路徑解讀

    這篇文章主要介紹了C# Path類---文件路徑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • c# 如何更簡(jiǎn)單的使用Polly

    c# 如何更簡(jiǎn)單的使用Polly

    這篇文章主要介紹了c# 如何更簡(jiǎn)單的使用Polly,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-03-03
  • C#11新特性使用案例詳解

    C#11新特性使用案例詳解

    這篇文章主要為大家介紹了C#11新特性的使用案例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • DevExpress實(shí)現(xiàn)GridControl刪除所有行的方法

    DevExpress實(shí)現(xiàn)GridControl刪除所有行的方法

    這篇文章主要介紹了DevExpress實(shí)現(xiàn)GridControl刪除所有行的方法,對(duì)于C#初學(xué)者有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2014-08-08
  • C#實(shí)現(xiàn)查殺本地與遠(yuǎn)程進(jìn)程的方法

    C#實(shí)現(xiàn)查殺本地與遠(yuǎn)程進(jìn)程的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)查殺本地與遠(yuǎn)程進(jìn)程的方法,可實(shí)現(xiàn)針對(duì)特定進(jìn)程的關(guān)閉操作,是C#進(jìn)程操作的一個(gè)典型應(yīng)用,需要的朋友可以參考下
    2014-12-12
  • .net使用Aspose.Words進(jìn)行Word替換操作的實(shí)現(xiàn)代碼

    .net使用Aspose.Words進(jìn)行Word替換操作的實(shí)現(xiàn)代碼

    之前在工作中,需要實(shí)現(xiàn)Word打印功能,并且插入圖片。當(dāng)時(shí)采取的方式則是使用書(shū)簽進(jìn)行操作。首先在word內(nèi)插入書(shū)簽,完成后,存為模板。程序加載該模板,找到書(shū)簽,并在指定位置寫(xiě)入文字即可
    2013-05-05

最新評(píng)論

清苑县| 申扎县| 和顺县| 孝感市| 阳春市| 探索| 甘泉县| 囊谦县| 吉安市| 西平县| 静乐县| 克什克腾旗| 土默特左旗| 台安县| 财经| 平凉市| 临海市| 黄浦区| 遵义市| 卢氏县| 壤塘县| 平果县| 南川市| 临江市| 玛多县| 清涧县| 怀化市| 呼伦贝尔市| 务川| 乐安县| 武平县| 库车县| 武功县| 青阳县| 鲁甸县| 依安县| 寻甸| 八宿县| 襄汾县| 洪湖市| 彰武县|