Unity Audio Management Framework

AudioPlayManager

Use AudioPlayManager to manage AuidoSourceManager and AudioClipManager.

Provides one-time playback (ends when playback is complete).

Provides loop playback, returns a SingleAudioClip, uses the returned SingleAudioClip to stop playback.

using UnityEngine;

public class AudioPlayManager : MonoBehaviour
{
    public static AudioPlayManager instance;

    private AudioSourceManager audioSourceManager;
    private AudioClipManager audioClipManager;
    
    private void Start()
    {
        instance = this;
        audioSourceManager = new AudioSourceManager(gameObject);
        audioClipManager = new AudioClipManager();
    }

    private void Update()
    {
        audioSourceManager.ReleaseFreeAudioSource();
    }

    /// <summary>
    /// 播放音频(一次)
    /// </summary>
    /// <param name="audioClipName"></param>
    public void PlayOnceAudio(string audioClipName)
    {
        AudioSource tempAudioSource = audioSourceManager.FindFreeAudioSource();
        SingleAudioClip tempSingleAudioClip = audioClipManager.FindSingleAudioClip(audioClipName);
        
        tempSingleAudioClip.Initialize(tempAudioSource);
        
        tempSingleAudioClip.PlayAudio();
    }

    /// <summary>
    /// 播放音乐(需要调用StopPlay关闭)
    /// </summary>
    /// <param name="audioClipName"></param>
    public SingleAudioClip PlayAudio(string audioClipName)
    {
        AudioSource tempAudioSource = audioSourceManager.FindFreeAudioSource();
        SingleAudioClip tempSingleAudioClip = audioClipManager.FindSingleAudioClip(audioClipName);
        
        tempSingleAudioClip.Initialize(tempAudioSource);
        
        tempSingleAudioClip.PlayAudio();

        return tempSingleAudioClip;
    }
}

AudioSourceManager

Manage all AudioSource components and control the number of AudioSource components.

Allocate the AudioSource for playback, release the redundant AudioSource.

using System.Collections.Generic;
using UnityEngine;

public class AudioSourceManager
{
    private List<AudioSource> _audioSources;

    private GameObject playLocation;

    public AudioSourceManager(GameObject playLocation)
    {
        this.playLocation = playLocation;
        Initial();
    }
    
    /// <summary>
    /// 初始化
    /// </summary>
    private void Initial()
    {
        _audioSources = new List<AudioSource>();
        
        // 初始化三个AudioSource
        for (int i = 0; i < 3; i++)
        {
            _audioSources.Add(playLocation.AddComponent<AudioSource>());
        }
    }

    /// <summary>
    /// 找到空闲的AudioSource
    /// </summary>
    /// <returns></returns>
    public AudioSource FindFreeAudioSource()
    {
        for (int i = 0; i < _audioSources.Count; i++)
        {
            if (!_audioSources[i].isPlaying)
            {
                return _audioSources[i];
            }
        }
        
        // 没有空闲的AudioSource,创建新的AudioSource
        AudioSource tempSource = playLocation.AddComponent<AudioSource>();
        
        // 添加
        _audioSources.Add(tempSource);

        return tempSource;
    }

    /// <summary>
    /// 释放多余的AudioSource【大于3个】
    /// </summary>
    public void ReleaseFreeAudioSource()
    {
        int freeCount = 0;

        List<AudioSource> tempSources = new List<AudioSource>();
        
        // 记录有多少AudioSource没有播放
        for (int i = 0; i < _audioSources.Count; i++)
        {
            if (!_audioSources[i].isPlaying)
            {
                // 如果空闲AudioSource大于3个
                if (++freeCount>3)
                {
                    tempSources.Add(_audioSources[i]);
                }
            }
        }

        // 释放多余的AudioSource
        for (int i = 0; i < tempSources.Count; i++)
        {
            _audioSources.Remove(tempSources[i]);
            GameObject.Destroy(tempSources[i]);
        }
        
        // 释放临时List<>
        tempSources.Clear();
        tempSources = null;
    }
}

AudioClipManager

Manage all audio files.

Get all the audio assetbundle names from the txt file during initialization, and then get all the audio from the assetbundle.

Provides the SingleAudioClip packaged by obtaining the audio name

using System.IO;
using UnityEngine;

public class AudioClipManager
{
    private string[] audioClipNames;

    private SingleAudioClip[] singleAudioClips;

    public AudioClipManager()
    {
        Initial();
    }

    private void Initial()
    {
        ReadAudioClipName();
        LoadAudioClip();
    }

    /// <summary>
    /// 从txt文件中读取AudioClipName
    /// </summary>
    private void ReadAudioClipName()
    {
        FileStream fs = new FileStream(Application.streamingAssetsPath+"/AudioClips.txt", FileMode.Open, FileAccess.Read, FileShare.None);
        StreamReader sr = new StreamReader(fs, System.Text.Encoding.Default);
        if (sr == null) 
            return;
        
        // 读取第一行
        string clips = sr.ReadLine();

        int clipCount = -1;

        if (int.TryParse(clips, out clipCount))
        {
            // 初始化audioClipNames
            audioClipNames = new string[clipCount];
            
            for (int i = 0; i < clipCount; i++)
            {
                audioClipNames[i] = sr.ReadLine().Split('|')[0];
            }
        }
        
        sr.Close();
    }

    /// <summary>
    /// 加载AudioClip
    /// </summary>
    private void LoadAudioClip()
    {
        // 初始化
        singleAudioClips = new SingleAudioClip[audioClipNames.Length];
        
        for (int i = 0; i < audioClipNames.Length; i++)
        {
            // 加载
            // AudioClip tempClip = Resources.Load<AudioClip>(audioClipNames[i]);
            AudioClip tempClip = ResourceAndDataManager.Instance.ObtainAudioClip(audioClipNames[i]);
            
            // 存储
            singleAudioClips[i] = new SingleAudioClip(tempClip);
        }
    }

    /// <summary>
    /// 通过AudioClipName获取SingleAudioClip
    /// </summary>
    /// <param name="audioClipName"></param>
    /// <returns></returns>
    public SingleAudioClip FindSingleAudioClip(string audioClipName)
    {
        for (int i = 0; i < audioClipNames.Length; i++)
        {
            // 如果找到
            if (audioClipNames[i].Equals(audioClipName))
            {
                return singleAudioClips[i];
            }
        }
        
        // 没有找到
        return null;
    }
}

SingleAudioClip

Wraps AudioSource and AudioClip and provides play and stop methods.

using UnityEngine;

public class SingleAudioClip
{
    private AudioClip audioClip;
    private AudioSource audioSource;

    public SingleAudioClip(AudioClip audioClip)
    {
        this.audioClip = audioClip;
    }

    /// <summary>
    /// 初始化
    /// </summary>
    /// <param name="audioSource"></param>
    public void Initialize(AudioSource audioSource)
    {
        audioSource.clip = audioClip;
        this.audioSource = audioSource;
    }

    /// <summary>
    /// 播放AudioClip
    /// </summary>
    public void PlayAudio()
    {
        audioSource.Play();
    }

    /// <summary>
    /// 关闭AudioClip
    /// </summary>
    public void StopAudio()
    {
        audioSource.Stop();
    }
}

Guess you like

Origin blog.csdn.net/heaventianjianke/article/details/127160941