Unity-音频播放

一直播放背景音乐。
播放音效。
关闭所有音频。
关闭所有音频除了背景音乐。
音频暂停与播放。
音频静音的开启与关闭。

AudioManager.cs

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


// AudioManager类只挂在SceneStart场景的一个GameObject-AudioManager上,然后通过DontDestroyOnLoad(this);不销毁自己,这样跳转场景时也可以继续播BGM。
// SceneStart场景在运行的生命周期里只执行一次,用来保证GameObject-AudioManager只有一个。

public class AudioManager : MonoBehaviour
{
    //BGM播放器(AudioSource可以理解为播放器)
    public AudioSource BMGSource;

    public static AudioManager instance;
    /// <summary>
    /// 暂停音频
    /// </summary>
    AudioSource[] pauseAudios;

    private void Awake()
    {
        instance = this;
        //通过DontDestroyOnLoad(this);不销毁自己,这样跳转场景时也可以继续播BGM
        DontDestroyOnLoad(this);
    }

    public void PlayBGM(AudioClip ac)
    {
        //如果BMGSource目前的场景中存在,直接获取到。
        BMGSource = gameObject.GetComponent<AudioSource>();
        //如果BMGSource目前的场景中不存在,创建一个。
        if (BMGSource == null)
        {
            BMGSource = gameObject.AddComponent<AudioSource>();
        }
        if (BMGSource != null)
        {
            BMGSource.loop = true;
            BMGSource.clip = ac;
            BMGSource.Play();
            
        }
    }

    public void PlaySE(AudioClip ac)
    {
        //创建一个SE播放器(AudioSource可以理解为播放器)
        AudioSource SESource = gameObject.AddComponent<AudioSource>();
        if (SESource != null)
        {
            if (!SESource.isPlaying)
            {
                SESource.loop = false;
                SESource.clip = ac;
                SESource.Play();
            }
            //音频播放完后销毁
            StartCoroutine(AudioPlayFinished(ac.length, () =>
            {
                Destroy(SESource);
                GC.Collect();
            }));
        }
    }

    /// <summary>
    ///  音频播放完之后销毁
    /// </summary>
    /// <param name="time">音频时长</param>
    /// <param name="callback"></param>
    /// <returns></returns>
    IEnumerator AudioPlayFinished(float time, UnityAction callback)
    {
        yield return new WaitForSeconds(time+1);
        //调用这句,后面在AudioPlayFinished的lamda表达式里写具体逻辑
        callback.Invoke();
    }

    /// <summary>
    /// 弹窗出现时暂停所有音频
    /// </summary>
    public void PauseAllAudio()
    {
        // 获取场景所有音频组件
        pauseAudios = FindObjectsOfType<AudioSource>();
        for (int i = 0; i < pauseAudios.Length; i++)
        {
            pauseAudios[i].Pause();
        }
    }
    /// <summary>
    /// 继续播放音频
    /// </summary>
    public void UnPauseAllAudio()
    {
        // 获取场景所有音频组件
        pauseAudios = FindObjectsOfType<AudioSource>();
        for (int i = 0; i < pauseAudios.Length; i++)
        {
            pauseAudios[i].UnPause();
        }
    }

    /// <summary>
    /// 所有音频静音
    /// </summary>
    public void MuteAllAudio()
    {
        // 获取场景所有音频组件
        pauseAudios = FindObjectsOfType<AudioSource>();
        for (int i = 0; i < pauseAudios.Length; i++)
        {
            pauseAudios[i].volume = 0;
        }
    }
    /// <summary>
    /// 所有音频取消静音
    /// </summary>
    public void UnMuteAllAudio()
    {
        // 获取场景所有音频组件
        pauseAudios = FindObjectsOfType<AudioSource>();
        for (int i = 0; i < pauseAudios.Length; i++)
        {
            pauseAudios[i].volume = 1.0f;
        }
    }

    /// <summary>
    /// 除了BGM外的音效都停止播放
    /// </summary>
    public void StopAllAudioWithoutBGM()
    {
        AudioSource[] audioSource = FindObjectsOfType<AudioSource>();
        for (int i = 0; i < audioSource.Length; i++)
        {
            //bgm是循环播放。这里关掉非循环的AudioSource
            if (audioSource[i].loop == false)
                Destroy(audioSource[i]);
        }
        GC.Collect();
    }

    /// <summary>
    /// 停止所有音频播放
    /// </summary>
    public void StopAllAudio()
    {
        AudioSource[] audioSource = FindObjectsOfType<AudioSource>();
        for (int i = 0; i < audioSource.Length; i++)
        {
            Destroy(audioSource[i]);
        }
        GC.Collect();
    }

}

SceneStartController.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

//一开始播放BGM1,两个场景切换BGM一直播放。
//点击第一个场景的按钮1,可以播放播放音效,点击按钮2可以切换BGM
//点击第二个场景的按钮,可以切换BGM播放。
public class SceneStartController : MonoBehaviour
{
    public AudioClip BGM1Clip;

    void Start()
    {
        //刚开始启动播放BGM,然后跳转场景Scene1
        BGM1Clip = Resources.Load<AudioClip>("bgm1");
        AudioManager.instance.PlayBGM(BGM1Clip);
        SceneManager.LoadScene("Scene1");
    }
}

Scene1Controller.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class Scene1Controller : MonoBehaviour
{
    public Button buttonPlaySoundEffect;
    public Button buttonChangeScene;
    public Button buttonChangeBGM;
    public Button buttonPauseAudio;
    public Button buttonResumeAudio;
    public AudioClip BGM1Clip;
    public AudioClip BGM2Clip;
    public AudioClip SEClip;
    void Start()
    {
        //加载音频资源
        BGM1Clip = Resources.Load<AudioClip>("bgm1");
        BGM2Clip = Resources.Load<AudioClip>("bgm2");
        SEClip = Resources.Load<AudioClip>("audio");

        buttonChangeScene.onClick.AddListener(() =>
        {
            SceneManager.LoadScene("Scene2");
        });
        buttonPlaySoundEffect.onClick.AddListener(() =>
        {
            AudioManager.instance.PlaySE(SEClip);
        });
        buttonChangeBGM.onClick.AddListener(() =>
        {
            AudioManager.instance.PlayBGM(BGM2Clip);
        }
        );
        buttonPauseAudio.onClick.AddListener(()=>
        {
            AudioManager.instance.PauseAllAudio();
        });

        buttonResumeAudio.onClick.AddListener(()=>
        {
            AudioManager.instance.UnPauseAllAudio();
        });
    }
}

Scene2Controller.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;


public class Scene2Controller : MonoBehaviour
{
    public Button buttonChangeScene;
    public Button buttonChangeBGM;
    public Button buttonCloseAllAudio;
    public Button buttonCloseAllAudioWithoutBGM;

    public AudioClip BGM1Clip;
    void Start()
    {
        //加载音频资源
        BGM1Clip = Resources.Load<AudioClip>("bgm1");
        buttonChangeScene.onClick.AddListener(() =>
        {
            SceneManager.LoadScene("Scene1");
        });

        buttonChangeBGM.onClick.AddListener(() =>
        {
            AudioManager.instance.PlayBGM(BGM1Clip);
        }
        );

        buttonCloseAllAudio.onClick.AddListener(()=>
        {
            AudioManager.instance.StopAllAudio();
        });

        buttonCloseAllAudioWithoutBGM.onClick.AddListener(()=>
        {
            AudioManager.instance.StopAllAudioWithoutBGM();
        });
    }
}
  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值