Unity 声音播放管理模块

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

public class SoundManager : MonoBehaviour
{

    private static SoundManager main;

    public static SoundManager Instance
    {
        get
        {
            if (main == null)
            {
                GameObject obj = new GameObject("SoundManager");
                main = obj.AddComponent<SoundManager>();
            }
            return main;
        }
    }

    private List<Sound> soundList = new List<Sound>();

    private float _deltaTime;

    void Update()
    {

        soundList.ToList().ForEach(x =>
        {
            if(x.isScaleTime == false){
                _deltaTime = Time.unscaledDeltaTime;
            }
            else {
                _deltaTime = Time.deltaTime;
            }

            x.playTime += _deltaTime;

            if (!x.audioSource.isPlaying && x.isFinish)
            {
                if(!(x.loop))
                x.Finish();
            }

        });
    }

    public Sound PlayFromAssetbundle(string name,bool isScaleTime = false)
    {
        AudioClip clip = Resources.Load<AudioClip>(name);
        if (clip == null)
            clip = Resources.Load<AudioClip>("通用点击");
        return PlaySound(clip, name);
    }

    public Sound PlayFromResource(string path,string name)
    {
        AudioClip clip = Resources.Load<AudioClip>(path + name);
        if (clip == null)
            clip = Resources.Load<AudioClip>("00通用点击");
        return PlaySound(clip,name);

    }
    /// <summary>
    /// 人声
    /// </summary>
    public Sound PlayVoice(string name)
    {
        AudioClip clip = Resources.Load<AudioClip>("Sound/Voice/zh/" + name);
        if (clip == null)
        {
            Debug.LogError("错误的语音:" + name);
            clip = Resources.Load<AudioClip>("00通用点击");
        }

        return PlaySound(clip, name);
    }
    /// <summary>
    /// 场景音效
    /// </summary>
    public Sound PlaySceneSound(string name)
    {
        AudioClip clip = Resources.Load<AudioClip>("Sound/SceneSound/" + name);
        if (clip == null)
        {
            Debug.LogError("错误的语音:" + name);
            clip = Resources.Load<AudioClip>("00通用点击");
        }
        return PlaySound(clip, name);
    }
    /// <summary>
    /// 动作音效
    /// </summary>
    public Sound PlayAnimaSound(string name)
    {
        //AudioClip clip = Resources.Load<AudioClip>("Sound/AnimaSound/" + name);
        //if (clip == null)
        //{
        //    Debug.LogError("错误的语音:" + name);
        //    clip = Resources.Load<AudioClip>("00通用点击");
        //}
        //return PlaySound(clip, name);

        return PlaySceneSound(name);
    }
    public Sound PlaySound(AudioClip clip,string soundName,bool isScaleTime = false)
    {
        Sound sound = new Sound(this);
        sound.clip = clip;
        sound.isScaleTime = isScaleTime;
        sound.name = soundName;
        sound.audioSource = this.gameObject.AddComponent<AudioSource>();
        sound.audioSource.clip = clip;
        sound.audioSource.Play();

        soundList.Add(sound);
        return sound;
    }
    public bool isPlay(string soundName)
    {
        List<Sound> sound = new List<Sound>(this.soundList.Where(s => s.name.Contains(soundName)));
        if(sound.Count>=1)
        {
            if (sound[0].audioSource.isPlaying)
                return true;
        }
        return false;
    }
    public void DestorySound(string name)
    {
        List<Sound> destoryList = SearchSound(name);

        destoryList.ToList().ForEach(x => x.Finish());
    }

    public void DestorySoundByID(string ID)
    {
        List<Sound> destoryList = SearchSoundByID(ID);
        destoryList.ToList().ForEach(x => x.Finish());
    }
    public void DestorySoundNoAction(string name)
    {
        List<Sound> destoryList = SearchSound(name);
        destoryList.ToList().ForEach(x => x.FinishNoComplete());
    }

    public List<Sound> SearchSound(string soundName)
    {
        List<Sound> sound = new List<Sound>(this.soundList.Where(s => s.name.Contains(soundName)));
        return sound;
    }
    public List<Sound> SearchSoundByID(string ID)
    {
        List<Sound> sound = new List<Sound>(this.soundList.Where(s => s.ID.Equals(ID)));
        return sound;
    }
    public float GetClipLength(string name)
    {
        AudioClip clip = Resources.Load<AudioClip>("Sound/Voice/zh/" + name);
        if (clip == null)
        {
            Debug.LogError("错误的语音:" + name);
            clip = Resources.Load<AudioClip>("00通用点击");
        }

        return clip.length;
    }
    public void RemoveSound(Sound sound)
    {
        Destroy(sound.audioSource);

        soundList.Remove(sound);
        sound = null;

    }

    public void PauseAllSound(){
        for(int i = 0;i<soundList.Count;i++){
            soundList [i].audioSource.Pause ();
        }
    }

    public void ResumeAllSound(){
        for(int i = 0;i<soundList.Count;i++){
            soundList [i].audioSource.UnPause ();
        }
    }

    public void ClearSound()
    {
        soundList.ToList().ForEach(x => x.FinishNoComplete());
    }

}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值