游戏中对声音audio的管理

本文介绍了一个用于Unity游戏开发的音频管理系统实现方案。该系统通过单例模式管理不同类型的音频资源,包括背景音乐、环境音效等,并支持暂停、恢复等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这从我司主程周峰那复制来的audiomanager.cs



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


[System.Serializable]
public class AudioManager : MonoBehaviour
{
    #region Singleton Prep
    static AudioManager _instance = null;
    public static AudioManager Instance
    {
        get
        {
            if (_instance == null)
            {
                GameObject go = new GameObject("__AudioManager");
                _instance = go.AddComponent<AudioManager>();
                _instance.LoadAudioSource();
               // DontDestroyOnLoad(go);
            }
            return _instance;
        }
    }


    static bool SetInstance(AudioManager inst)
    {
        if (_instance != null && _instance != inst)
        {
            return false;
        }
        _instance = inst;
        return true;
    }


    void OnEnable()
    {
        if (!SetInstance(this))
        {
            Debug.LogWarning("Same Instance :" + name);
            DestroyImmediate(this);
            return;
        }
        //DontDestroyOnLoad(gameObject);
    }
    #endregion
//
public enum AudioType
    {
sfx,//普通音效
        vfx,//人声音效
        envm,//环境音效
bg//背景音乐
}

public const int SourceNumber = 8;
    public const int ImportantSourceNumber = 4;
private  AudioSource[] SfxSources;
    private AudioSource[] SfxSourcesImportant;
    private AudioSource VfxSource;
private AudioSource MusicSource;
    private AudioSource EnvmSource;


    private bool[] isPause ; // to judge if a audioclip is paused..


    private float MusicVolume;


    private float SfxVolume;




    private float EnvmVolume;


private Dictionary<string, AudioClip> Clips = new Dictionary<string, AudioClip>();

void LoadAudioSource() 
    {
// Debug.Log("LoadAudioSource");

GameObject o = new GameObject("audioSource");
AudioSource audioSource = o.AddComponent<AudioSource>();
audioSource.playOnAwake = false;

SfxSources = new AudioSource[SourceNumber];
        isPause = new bool[SourceNumber];
for(int i = 0; i < SfxSources.Length; ++i) 
        {
GameObject sourceObj = GameObject.Instantiate(o) as GameObject;
            isPause[i] = false;
sourceObj.name += "_sfx";
SfxSources[i] = sourceObj.GetComponent<AudioSource>();
}
   SfxSourcesImportant = new AudioSource[ImportantSourceNumber];
        for (int i = 0; i < SfxSourcesImportant.Length; ++i)
        {
            GameObject sourceObj = GameObject.Instantiate(o) as GameObject;
            sourceObj.name += "_sfx";
            SfxSourcesImportant[i] = sourceObj.GetComponent<AudioSource>();
        }


        GameObject vfxSourceObj = GameObject.Instantiate(o) as GameObject;
        vfxSourceObj.name += "_vfx";
        VfxSource = vfxSourceObj.GetComponent<AudioSource>();


GameObject musicSourceObj = GameObject.Instantiate(o) as GameObject;
musicSourceObj.name += "_bg";
MusicSource = musicSourceObj.GetComponent<AudioSource>()??musicSourceObj.AddComponent<AudioSource>();


        GameObject envmSourceObj = GameObject.Instantiate(o) as GameObject;
        envmSourceObj.name += "_envm";
        EnvmSource = envmSourceObj.GetComponent<AudioSource>();

//
   sfxVolume = musicVolume = envmVolume
#if UNITY_EDITOR
       //= 0;
       = 1;
#else
        =1;
#endif


    }


    public void OnPause() // lyladd
    {
        for (int i = 0; i < SfxSources.Length; ++i)
        {
            if (SfxSources[i] != null && SfxSources[i].isPlaying)
            {
                isPause[i] = true;
                SfxSources[i].Pause();
            }
        }
    }


    public void OnResume() //lyladd
    {
        for (int i = 0; i < SfxSources.Length; ++i)
        {
           // if (SfxSources[i] != null && !SfxSources[i].isPlaying)
            if(isPause[i])
            {
                isPause[i] = false;
                SfxSources[i].Play();
            }
        }
    }


    public bool PlayClip(string clipName, AudioType sourceType, bool bLoop, bool force = false)
    {
if(!Clips.ContainsKey(clipName)) 
        {
            AudioClip clip = Resources.Load("Audios/" + clipName) as AudioClip;
            Clips.Add(clipName, clip);
}
        if (Clips[clipName] == null)
        {
//            Debug.LogError("Not found audio clip " + clipName);
            return false;
        }

return PlayClip(Clips[clipName], sourceType, bLoop, force);
}

public bool IsPlaying(string clipName, AudioType sourceType) 
    {
if(!Clips.ContainsKey(clipName)) 
        {
return false;
}

return IsPlaying(Clips[clipName], sourceType);
}

public bool StopClip(string clipName)
    {
if(!Clips.ContainsKey(clipName)) 
        {
return false;
}
        if (Clips[clipName] == null)
        {
            Debug.LogWarning("cant find clip, the object may be destroyed.");
            return false;
        }

return StopClip(Clips[clipName]);
}

public bool PlayClip(AudioClip clip, AudioType sourceType, bool bLoop, bool force = false) 
    {
if(sourceType == AudioType.sfx) 
        {//sfx.
   bool played = false;
for(int i = 0; i < SfxSources.Length; ++i) 
            {
                if (SfxSources[i]==null)
                    continue;
if(SfxSources[i].clip != null && SfxSources[i].isPlaying)
                {
continue;
}
SfxSources[i].loop = bLoop;
SfxSources[i].clip = clip;
SfxSources[i].Play();
   played = true;
return true;
}
            if(!played&&force)
            {
                for (int i = 0; i < SfxSourcesImportant.Length; ++i)
                {
                    if(SfxSourcesImportant[i]==null)
                        continue;
                    if (SfxSourcesImportant[i].clip != null && SfxSourcesImportant[i].isPlaying)
                    {
                        continue;
                    }
                    SfxSourcesImportant[i].loop = bLoop;
                    SfxSourcesImportant[i].clip = clip;
                    SfxSourcesImportant[i].Play();
                    played = true;
                    return true;
                }
            }
}
        else if (sourceType == AudioType.vfx)
        {//vfx
            if (VfxSource!=null&&!VfxSource.isPlaying)
            {
                VfxSource.loop = bLoop;
                VfxSource.clip = clip;
                VfxSource.Play();
            }
            return true;
        }
else if(sourceType == AudioType.bg)
        {//bg music.
if((MusicSource!=null&&!MusicSource.isPlaying) || MusicSource.clip != clip)
            {
MusicSource.loop = bLoop;
MusicSource.clip = clip;
MusicSource.Play();
}
return true;
}
        else if (sourceType == AudioType.envm)
        {//bg effect.
            if ((EnvmSource!=null&&!EnvmSource.isPlaying) || EnvmSource.clip != clip)
            {
                EnvmSource.loop = bLoop;
                EnvmSource.clip = clip;
                EnvmSource.Play();
            }
            return true;
        }

return false;
}

public bool IsPlaying(AudioClip clip, AudioType sourceType) 
    {
        if (sourceType == AudioType.sfx)
        {//sfx.
            for (int i = 0; i < SfxSources.Length; ++i)
            {
                if (SfxSources[i]!=null&&SfxSources[i].clip == clip && SfxSources[i].isPlaying)
                {
                    return true;
                }
            }
            for (int i = 0; i < SfxSourcesImportant.Length; ++i)
            {
                if (SfxSourcesImportant[i]!=null&&SfxSourcesImportant[i].clip == clip && SfxSourcesImportant[i].isPlaying)
                {
                    return true;
                }
            }
        }
        else if (sourceType == AudioType.vfx && VfxSource.clip == clip)
        {
            return VfxSource.isPlaying;
        }
        else if (sourceType == AudioType.envm && EnvmSource.clip == clip)
        {
            return EnvmSource.isPlaying;
        }     
        else if (sourceType == AudioType.bg && MusicSource.clip == clip)
        {//bg music.
            return MusicSource.isPlaying;
        }

return false;
}

public bool StopClip(AudioClip clip) {
        if (MusicSource!=null&&MusicSource.clip != null && MusicSource.clip.Equals(clip) && MusicSource.isPlaying)
        {
MusicSource.Stop();
return true;
}
        if (EnvmSource!=null&&EnvmSource.clip != null && EnvmSource.clip.Equals(clip) && EnvmSource.isPlaying)
        {
            EnvmSource.Stop();
            return true;
        }
        if (VfxSource!=null&&VfxSource.clip != null && VfxSource.clip.Equals(clip) && VfxSource.isPlaying)
        {
            VfxSource.Stop();
            return true;
        }
for(int i = 0; i < SfxSources.Length; ++i) 
        {
if(SfxSources[i]!=null&&SfxSources[i].clip != null && SfxSources[i].clip.Equals(clip) && SfxSources[i].isPlaying) 
            {
SfxSources[i].Stop();
return true;
}
}
        for (int i = 0; i < SfxSourcesImportant.Length; ++i)
        {
            if (SfxSourcesImportant[i]!=null&&SfxSourcesImportant[i].clip != null && SfxSourcesImportant[i].clip.Equals(clip) && SfxSourcesImportant[i].isPlaying)
            {
                SfxSourcesImportant[i].Stop();
                return true;
            }
        }

return false;
}

public void ClearClip() 
    {
if(MusicSource != null) 
        {
if(MusicSource.clip != null)
            {
MusicSource.Stop();
}
MusicSource.transform.parent = null;
GameObject.Destroy(MusicSource);
}
        if (EnvmSource != null)
        {
            if (EnvmSource.clip != null)
            {
                EnvmSource.Stop();
            }
            EnvmSource.transform.parent = null;
            GameObject.Destroy(EnvmSource);
        }
        if (VfxSource != null)
        {
            if (VfxSource.clip != null)
            {
                VfxSource.Stop();
            }
            VfxSource.transform.parent = null;
            GameObject.Destroy(VfxSource);
        }
//
if(SfxSources != null) {
for(int i = 0; i < SfxSources.Length; ++i) {
if(SfxSources[i] == null)
continue;
if(SfxSources[i].clip != null) {
SfxSources[i].Stop();
}
SfxSources[i].transform.parent = null;
GameObject.Destroy(SfxSources[i]);
}
}
        if (SfxSourcesImportant != null)
        {
            for (int i = 0; i < SfxSourcesImportant.Length; ++i)
            {
                if (SfxSourcesImportant[i] == null)
                    continue;
                if (SfxSourcesImportant[i].clip != null)
                {
                    SfxSourcesImportant[i].Stop();
                }
                SfxSourcesImportant[i].transform.parent = null;
                GameObject.Destroy(SfxSourcesImportant[i]);
            }
        }
//
Clips.Clear();
LoadAudioSource();
}


    public void SetEnvmOn(bool on)
    {
        Debug.Log("SetEnvmOn " + on);
        if (!on)
            EnvmSource.volume = 0;
        else
            EnvmSource.volume = envmVolume;
    }
public void SetMusicOn(bool on)
    {
Debug.Log("SetMusicOn "+ on);
if(!on)
MusicSource.volume = 0;
else
MusicSource.volume = musicVolume;
}
public void SetSfxOn(bool on)
    {
Debug.Log("SetSfxOn "+ on);
if(!on) {
for(int i = 0; i < SfxSources.Length; ++i)
            {
SfxSources[i].volume = 0;
}
            for (int i = 0; i < SfxSourcesImportant.Length; ++i)
            {
                SfxSourcesImportant[i].volume = 0;
            }
   NGUITools.soundVolume = 0;
   VfxSource.volume = 0;
}
else {
for(int i = 0; i < SfxSources.Length; ++i) {
SfxSources[i].volume = sfxVolume;
}
            for (int i = 0; i < SfxSourcesImportant.Length; ++i)
            {
                SfxSourcesImportant[i].volume = sfxVolume;
            }
            NGUITools.soundVolume = 1;
            VfxSource.volume = 1;
}
}
    public float envmVolume
    {
        get
        {
            return EnvmVolume;
        }
        set
        {
            EnvmVolume = value;
            EnvmSource.volume = EnvmVolume;
        }
    }
public float musicVolume {
get {
return MusicVolume;
}
set {
MusicVolume = value;
MusicSource.volume = MusicVolume;
}
}
public float sfxVolume 
    {
get 
        {
return SfxVolume;
}
set {
SfxVolume = value;
for(int i = 0; i < SfxSources.Length; ++i) {
SfxSources[i].volume = SfxVolume;
}
            for (int i = 0; i < SfxSourcesImportant.Length; ++i)
            {
                SfxSourcesImportant[i].volume = SfxVolume;
            }
   VfxSource.volume = SfxVolume;
}
}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值