AudioManager.cs 3.52 KB
using System;
using UnityEngine;
using System.Collections;
using Unity.VisualScripting;
using UnityEngine.Events;

public class AudioManager : Singleton<AudioManager>
{
    /// <summary>
    /// BGM音效组件
    /// </summary>
    private AudioSource _bgmAudioSource;

    /// <summary>
    /// 音效播放组件
    /// </summary>
    private AudioSource _effectAudioSource;

    /// <summary>
    ///  完成回调
    /// </summary>
    private Action _onComplete;

    /// <summary>
    ///  音频的时长
    /// </summary>
    private float _clipLength = 0f;

    /// <summary>
    ///  当前播放音频的时长
    /// </summary>
    private float _curClipLength = 0f;

    /// <summary>
    /// 是否正在播放
    /// </summary>
    /// <returns></returns>
    public bool IsPlaying()
    {
        return _effectAudioSource.isPlaying;
    }

    private bool _isPlayComplete = true;

    public bool IsPlayComplete()
    {
        return _isPlayComplete;
    }

    protected override void Awake()
    {
        //初始化时 挂载AudioSource组件
        if (_bgmAudioSource == null)
        {
            _bgmAudioSource = gameObject.AddComponent<AudioSource>();
        }


        if (_effectAudioSource == null)
        {
            _effectAudioSource = gameObject.AddComponent<AudioSource>();
        }
    }

    protected void Update()
    {
        if (_effectAudioSource != null && _effectAudioSource.isPlaying)
        {
            //  手动计时
            _curClipLength += Time.deltaTime;
            if (_curClipLength >= _clipLength)
            {
                _curClipLength = 0;
                StopEffect();
                _isPlayComplete = true;
                _onComplete?.Invoke();
            }
        }
    }

    /// <summary>
    /// 播放Bgm
    /// </summary>
    /// <param name="clip"></param>
    public void PlayBGM(AudioClip clip)
    {
        _bgmAudioSource.clip = clip;
        _bgmAudioSource.loop = true;
        _bgmAudioSource.Play();
    }

    /// <summary>
    /// 暂停Bgm
    /// </summary>
    public void PauseBgm()
    {
        _bgmAudioSource.Pause();
    }

    /// <summary>
    /// 恢复Bgm
    /// </summary>
    public void ResumeBgm()
    {
        _bgmAudioSource.UnPause();
    }

    /// <summary>
    /// 播放声音 
    /// </summary>
    /// <param name="clip">音频文件</param>
    /// <param name="callBack">回调参数</param>
    /// <param name="isLoop">是否循环播放</param>
    public void PlayEffect(AudioClip clip, Action callBack = null, bool isLoop = false)
    {
        if (clip == null)
        {
            Debug.LogError("音频报错: ");
            return;
        }

        _curClipLength = 0;
        _effectAudioSource.Stop();
        _isPlayComplete = false;
        _onComplete = callBack;

        _effectAudioSource.clip = clip;
        _effectAudioSource.loop = isLoop;
        _clipLength = clip.length;
        _effectAudioSource.Play();
    }

    /// <summary>
    /// 停止播放
    /// </summary>
    public void StopEffect()
    {
        _effectAudioSource.Stop();
    }

    /// <summary>
    /// 暂停播放
    /// </summary>
    public void PauseEffect()
    {
        _effectAudioSource.Pause();
    }

    /// <summary>
    /// 恢复播放
    /// </summary>
    public void ResumeEffect()
    {
        _effectAudioSource.UnPause();
    }

    /// <summary>
    /// 静音
    /// </summary>
    public void Mute()
    {
        _effectAudioSource.mute = !_effectAudioSource.mute;
        _bgmAudioSource.mute = !_bgmAudioSource.mute;
    }
}