封装Audio模块

第一个脚本

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

public class AudioManager : MonoBehaviour
{

    public static AudioManager Instance;

    private void Awake()
    {
        Instance = this;
    }

    SourceManager sourceManager;
    ClipManager clipManager;
 
    void Start()
    {
        sourceManager = new SourceManager(gameObject);
        clipManager = new ClipManager();
    }
    /// <summary>
    /// 播放音效
    /// </summary>
    /// <param name="clipName"></param>
    public void PlayClip(string clipName)
    {
        AudioSource tempAudioSource = sourceManager.GetFreeAudio();     
        SingleClip tempSingleClip = clipManager.FindClipByName(clipName);
        if (tempSingleClip!=null)
        {           
            tempSingleClip.Play(tempAudioSource);
        }     
    }
    /// <summary>
    /// 停止播放音效
    /// </summary>
    /// <param name="audioName"></param>
    public void StopClip(string audioName)
    {
        sourceManager.Stop(audioName);
    }
}
/// <summary>
    /// 控制静音
    /// </summary>
    /// <param name="value"></param>
    public void MuteControl(bool value)
    {
        sourceManager.MuteControl(value);
    }

第二个脚本

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

public class SourceManager
{

    GameObject owner;
    List<AudioSource> allSources;

    public SourceManager(GameObject tempOwner)
    {
        this.owner = tempOwner;
        Init();
    }

    /// <summary>
    /// 初始化
    /// </summary>
    public void Init()
    {
        allSources = new List<AudioSource>();
        for (int i = 0; i < 3; i++)
        {
            AudioSource tempAS = owner.AddComponent<AudioSource>();
            allSources.Add(tempAS);
        }
    }

 /// <summary>
   /// 静音
   /// </summary>
   /// <returns></returns>
    public void MuteControl(bool value)
    {
        for (int i = 0; i < allSources.Count; i++)
        {
            allSources[i].mute = value;
        }
    }
    /// <summary>
    /// 停止播放
    /// </summary>
    /// <param name="audioName"></param>
    public void Stop(string audioName)
    {
        for (int i = 0; i < allSources.Count; i++)
        {
            if ( allSources[i].isPlaying&&allSources[i].clip.name.Equals(audioName))
            {
                allSources[i].Stop();
            }
        }

ReleaseFreeAudio();
    }
    /// <summary>
    /// 获取空的audiosource
    /// </summary>
    /// <returns></returns>
    public AudioSource GetFreeAudio()
    {
        for (int i = 0; i < allSources.Count; i++)
        {
            if (!allSources[i].isPlaying)
            {
                return allSources[i];
            }
        }
        AudioSource tempAS = owner.AddComponent<AudioSource>();
       
        allSources.Add(tempAS);
        return tempAS;
    }
    /// <summary>
    /// 释放多余的Audiosource
    /// </summary>
    public void ReleaseFreeAudio()
    {
        int temCount=0;
        List<AudioSource> tempSources = new List<AudioSource>();
        for (int i = 0; i < allSources.Count; i++)
        {
            if (!allSources[i].isPlaying)
            {
                temCount++;
                if (temCount > 3)
                {
                    tempSources.Add(allSources[i]);
                }
            }
        }
        for (int i = 0; i < tempSources.Count; i++)
        {
            allSources.Remove(tempSources[i]);
            GameObject.Destroy(tempSources[i]);
        }
        tempSources.Clear();
        tempSources = null;
    }
}

第三个脚本

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

public class ClipManager
{

    public ClipManager()
    {
        ReadConfig();       
        LoadClip();
    }
    /// <summary>
    /// 音效名字数组
    /// </summary>
    string[] clipNameArr;
    /// <summary>
    ///音效数组
    /// </summary>
    SingleClip[] allSingleClipsArr;
    /// <summary>
    /// 读取配置文件
    /// </summary>
    public void ReadConfig()
    {
        var fileAddress = System.IO.Path.Combine(Application.streamingAssetsPath, "AudioConfig.txt");

        FileInfo fInfo0 = new FileInfo(fileAddress);
        if (fInfo0.Exists)
        {
            StreamReader r = new StreamReader(fileAddress);
            string tempLine = r.ReadLine();
            int IntCount = 0;
            if (int.TryParse(tempLine, out IntCount))
            {
                clipNameArr = new string[IntCount];
                for (int i = 0; i < IntCount; i++)
                {
                    tempLine = r.ReadLine();
                    clipNameArr[i] = tempLine;                  
                }
            }
            r.Close();
        }
    }
    /// <summary>
    /// 加载音效
    /// </summary>
    public void LoadClip()
    {
        allSingleClipsArr = new SingleClip[clipNameArr.Length];
        for (int i = 0; i < clipNameArr.Length; i++)
        {
            AudioClip tempAudioClip = Resources.Load<AudioClip>(clipNameArr[i]);
            SingleClip singleClip = new SingleClip(tempAudioClip);
            allSingleClipsArr[i] = singleClip;
        }
    }
    /// <summary>
    /// 根据名字找clip
    /// </summary>
    /// <returns></returns>
    public  SingleClip FindClipByName(string clipName)
    {      
        int tempIndex = -1;
        for (int i = 0; i <clipNameArr. Length; i++)
        {    
            if (clipNameArr[i].Equals(clipName))
            {               
                tempIndex = i;             
            }
        }
        if (tempIndex!=-1)
        {
            return allSingleClipsArr[tempIndex];
        }
        else
        {
            return null;
        }
    }
}
 

第四个脚本

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

public class SingleClip  {

    AudioClip myAudioClip;
    public SingleClip(AudioClip audioClip)
    {
        myAudioClip = audioClip;
    }
    public void Play(AudioSource audioSource)
    {    
       
        audioSource.clip = myAudioClip;
        audioSource.Play();
    }
}
 

使用封装

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

public class UseAudio : MonoBehaviour {


    void Update () {
        if (Input.GetKeyDown(KeyCode.A))
        {
            AudioManager.Instance.PlayClip("game_music");
        }
        if (Input.GetKeyDown(KeyCode.B))
        {
            AudioManager.Instance.StopClip("game_music");
        }
    }
}
注意:TXT读取clip的name,第一行为clip数量,clip资源放resources文件夹,TXT放streamingAssets文件夹

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值