栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > 其他

Unity-音频播放

其他 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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;
    /// 
    /// 暂停音频
    /// 
    AudioSource[] pauseAudios;

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

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

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

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

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

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

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

    /// 
    /// 停止所有音频播放
    /// 
    public void StopAllAudio()
    {
        AudioSource[] audioSource = FindObjectsOfType();
        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("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("bgm1");
        BGM2Clip = Resources.Load("bgm2");
        SEClip = Resources.Load("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("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();
        });
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/902210.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号