136 lines
3.9 KiB
C#
136 lines
3.9 KiB
C#
|
|
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();
|
|||
|
|
}
|
|||
|
|
}
|