Files
plugin-library/Assets/04.AudioCore/RunTime/AudioSourcePool.cs

136 lines
3.9 KiB
C#
Raw Normal View History

2025-03-06 17:24:31 +08:00
using UnityEngine;
using System.Collections.Generic;
using UnityEngine.SceneManagement;
public class AudioSourcePool
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ䣬<D6B5><EFBFBD><E6B4A2><EFBFBD>ͺͶ<CDBA>Ӧ<EFBFBD><D3A6> GameObject <20><><EFBFBD><EFBFBD>
private Dictionary<string, Queue<GameObject>> poolDict = new Dictionary<string, Queue<GameObject>>();
private GameObject poolObject;
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD>س<EFBFBD>ʼ<EFBFBD><CABC>
/// </summary>
private void PoolAwake()
{
// <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>Ϊ"AudioSourcePool"<22>Ķ<EFBFBD><C4B6><EFBFBD>
SceneManager.sceneUnloaded += OnSceneUnloaded;
poolObject = GameObject.Find("AudioSourcePool");
if (poolObject == null)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><C2B6><EFBFBD>
poolObject = new GameObject("AudioSourcePool");
}
CoroutineHelper.SetRunner();
// <20><>ʼ<EFBFBD><CABC> Voice <20>أ<EFBFBD><D8A3><EFBFBD><EFBFBD><EFBFBD> 1 <20><><EFBFBD><EFBFBD>
poolDict["Voice"] = new Queue<GameObject>();
CreateAudioSource("Voice");
// <20><>ʼ<EFBFBD><CABC> Music <20>أ<EFBFBD><D8A3><EFBFBD><EFBFBD><EFBFBD> 2 <20><><EFBFBD><EFBFBD>
poolDict["Music"] = new Queue<GameObject>();
for (int i = 0; i < 2; i++)
{
CreateAudioSource("Music");
}
// <20><>ʼ<EFBFBD><CABC> SFX <20>أ<EFBFBD><D8A3><EFBFBD>ʼ 4 <20><><EFBFBD><EFBFBD><EFBFBD>ɶ<EFBFBD>̬<EFBFBD><CCAC>չ<EFBFBD><D5B9>
poolDict["SFX"] = new Queue<GameObject>();
for (int i = 0; i < 4; i++)
{
CreateAudioSource("SFX");
}
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="type"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
private void CreateAudioSource(string type)
{
GameObject newObject = new GameObject($"AudioSource_{type}");
newObject.transform.SetParent(poolObject.transform); // <20><><EFBFBD><EFBFBD><C2B6><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӷ<EFBFBD><D3B6><EFBFBD>
newObject.AddComponent<AudioSource>().playOnAwake = false; // <20><><EFBFBD><EFBFBD> AudioSource <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>
poolDict[type].Enqueue(newObject);
}
/// <summary>
/// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
public AudioSource GetAudioSource(string type)
{
if(poolObject == null)
{
PoolAwake();
}
if (!poolDict.ContainsKey(type))
{
Debug.LogError($"<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: {type}");
return null;
}
if (poolDict[type].Count == 0)
{
/*// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>գ<EFBFBD><D5A3><EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD> GameObject<63><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SFX<46><58>
if (type == "SFX")
{
CreateAudioSource(type);
}
else
{
Debug.LogWarning($"<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> {type} <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD> AudioSource");
return null;
}*/
CreateAudioSource(type);
}
GameObject audioObject = poolDict[type].Dequeue();
AudioSource audioSource = audioObject.GetComponent<AudioSource>();
return audioSource;
}
/// <summary>
/// <20><><EFBFBD>ն<EFBFBD><D5B6><EFBFBD>
/// </summary>
/// <param name="type"></param>
/// <param name="audioObject"></param>
public void ReturnAudioSource(string type, GameObject audioObject)
{
if (!poolDict.ContainsKey(type))
{
Debug.LogError($"<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: {type}");
return;
}
AudioSource audioSource = audioObject.GetComponent<AudioSource>();
audioSource.Stop(); // ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD>
audioSource.clip = null; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>
audioSource.volume = 1f; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD>ָ<EFBFBD>
poolDict[type].Enqueue(audioObject); // <20><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ն<EFBFBD><D5B6><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="scene"></param>
void OnSceneUnloaded(Scene scene)
{
foreach (var pair in poolDict)
{
Queue<GameObject> queue = pair.Value;
while (queue.Count > 0)
{
GameObject obj = queue.Dequeue();
if(obj != null)
{
UnityEngine.Object.Destroy(obj);
}
}
}
poolDict.Clear();
}
}