Unity 音樂播放全局類


 

今天晚了LOL, 發現里面的聲音系統做得很不錯,於是最近就寫了一份反正以后也用的到,2D音樂全局播放.

項目跟PoolManager對象池插件結合了.

 

解決的問題:

1. 已經播放的聲音,可以馬上暫停或者減少音量等等

2. 實現音樂全局控制

3. 音樂和音效分開控制

4. 音樂重疊播放

 

類如下:

AudioShot 音樂實體類

SoundController 全局音樂控制類

SoundPanel 音樂面板

 

image

 

代碼如下:

AudioShot實體類:

using UnityEngine;
using System.Collections;

public class AudioShot : MonoBehaviour {
    public AudioSource audioSource;
    public string audioName;
}

 

SoundController類:

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

/*
 * 2D音樂播放全局控制類
 * 如果有音樂已經在播放了,改變聲音大小,或者停止播放 
 * 可控制已經在播放的音樂馬上暫停,或改變當前的音量
 */
public class SoundController : MonoBehaviour {

    private float fxVolume = 1;              //音效聲音大小
    private float musicVolume = 1;           //音樂聲音大小

    private bool isPlayFxVolume = true;      //是否播放音效聲音
    private bool isPlayMusicVolume = true;   //是否播放音樂聲音

    public AudioClip[] fxClip;
    public AudioClip[] musicClip;

    private SpawnPool audioSpwan;               //音樂游戲物體池
    private List<AudioSource> fxAudioList;      //為了控制已經播放的音樂,需要記錄他們的引用
    private List<AudioSource> musicAudioList;   
    public static SoundController instance;     
    private int audioCount;                     //音樂下標值計時器

    public void Awake() 
    {
        audioSpwan = PoolManager.Pools["Audio"];
        fxAudioList = new List<AudioSource>();
        musicAudioList = new List<AudioSource>();
        instance = this;
    }

    /// <summary>
    /// 播放音效不可重疊播放
    /// </summary>
    /// <param name="name"></param>
    public void PlayFxSound(string name) 
    {
        if (isPlayFxVolume) 
        {
            for (int i = 0; i < fxClip.Length; i++)
            {
                if (name == fxClip[i].name)
                {
                    audio.PlayOneShot(fxClip[i], fxVolume);
                    return;
                }
            }
        }
    }

    /// <summary>
    /// 播放音效可重疊播放(NGUI播放方式,只能一次播放完整才能銷毀,最好不要使用)
    /// </summary>
    /// <param name="name"></param>
    public void PlayFxSoundOverlap(string name)
    {
        if (fxClip == null) return;

        if (isPlayFxVolume) 
        {
            for (int i = 0; i < fxClip.Length; i++)
            {
                if (name == fxClip[i].name)
                {
                    //NGUITools.PlaySound(fxClipStatic[i], fxVolume);
                    var gameObject = audioSpwan.Spawn("AudioShotGame");
                    gameObject.audio.clip = fxClip[i];
                    gameObject.audio.volume = fxVolume;
                    gameObject.audio.Play();

                    AudioShot model = gameObject.GetComponent<AudioShot>();

                    if (string.IsNullOrEmpty(model.audioName))
                    {
                        model.name = audioCount + "";
                        audioCount++;
                        fxAudioList.Add(gameObject.audio);      //添加到集合中
                    }

                    return;
                }
            }
        }
    }
    
    /// <summary>
    /// 播放音樂
    /// </summary>
    /// <param name="name"></param>
    public void PlayMusicSound(string name)
    {
        if(isPlayMusicVolume)
        {
            for (int i = 0; i < musicClip.Length; i++)
            {
                if (name == musicClip[i].name)
                {
                    audio.PlayOneShot(musicClip[i], musicVolume);
                    return;
                }
            }
        }
    }

    public void PlayMusicSoundOverlap(string name)
    {
        if (musicClip == null) return;

        if(isPlayMusicVolume)
        {
            for (int i = 0; i < musicClip.Length; i++)
            {
                if (name == musicClip[i].name)
                {
                    var gameObject = audioSpwan.Spawn("AudioShotGame");
                    gameObject.audio.clip = musicClip[i];
                    gameObject.audio.volume = musicVolume;
                    gameObject.audio.Play();

                    AudioShot model = gameObject.GetComponent<AudioShot>();
                    if (string.IsNullOrEmpty(model.audioName))
                    {
                        model.audioName = audioCount + "";
                        audioCount++;
                        //添加到集合中
                        musicAudioList.Add(gameObject.audio);
                    }

                    return;
                }
            }
        }
    }
    public void UpdateFxVolume(float volume) 
    {
        this.fxVolume = volume;

        foreach (var i in fxAudioList)
        {
            i.volume = volume;
        }
    }
    public void UpdateMusicVolume(float volume) 
    {
        this.musicVolume = volume;

        foreach (var i in musicAudioList)
        {
            i.volume = volume;
        }
    }
    public void IsPlayFxVolume(bool isPlay) 
    {
        isPlayFxVolume = isPlay;

        if (isPlay == false)
        {
            foreach (var i in fxAudioList)
            {
                i.volume = 0;
            }
        }
        else 
        {
            foreach (var i in fxAudioList)
            {
                i.volume = fxVolume;
            }
        }
    }
    public void IsPlayMusicVolume(bool isPlay) 
    {
        isPlayMusicVolume = isPlay;

        if (isPlay == false)
        {
            foreach (var i in musicAudioList)
            {
                i.volume = 0;
            }
        }
        else 
        {
            foreach (var i in musicAudioList)
            {
                i.volume = musicVolume;
            }
        }
    }
    public void ClearAudioSource() 
    {
        for (int i = 0; i < musicAudioList.Count; i++)
        {
            if (musicAudioList[i].isPlaying == false) 
            {
                musicAudioList.Remove(musicAudioList[i]);
            }
        }

        for (int i = 0; i < fxAudioList.Count; i++)
        {
            if (fxAudioList[i].isPlaying == false)
            {
                fxAudioList.Remove(fxAudioList[i]);
            }
        }
    }
    
}

音樂控制面板類:

using UnityEngine;
using System.Collections;

public class SoundPanel : MonoBehaviour {


    public void UpdateFxVolume(float i) 
    {
        SoundController.instance.UpdateFxVolume(i);
    }

    public void UpdateMusicVolume(float i) 
    {
        SoundController.instance.UpdateMusicVolume(i);
    }

    public void isPlayFxSound(bool isOpen) 
    {
        SoundController.instance.IsPlayFxVolume(isOpen);
    }

    public void isPlayMusicSound(bool isOpen)
    {
        SoundController.instance.IsPlayMusicVolume(isOpen);
    }

    public void PlayMusic() 
    {
        SoundController.instance.PlayMusicSoundOverlap("3550");
    }

    public void PlayFx() 
    {
        SoundController.instance.PlayFxSoundOverlap("1843");
    }

}

 

源代碼地址: http://yunpan.cn/cKSQeasSgVXbD  提取碼 dedb


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM