大量的重复音效调用
在应用中特别是游戏中,经常有大量的音效触发,音效挂在在对应的预制件上又不方便进行管理,我的办法是动态的创建所需的音效组件,然后用一个管理器来管理这些组件方便重复使用。
图表示意
音效对象
AudioEffect类
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
public class AudioEffect : MonoBehaviour
{
private AudioSource source;
private UnityAction<AudioEffect> callback;
//如果音效播放完毕,则通知开始回收
void Update()
{
if(source != null && source.time >0 && !source.isPlaying)
{
callback.Invoke(this);
}
}
public void Register(UnityAction<AudioEffect> fun)
{
callback = fun;
}
public void Play(AudioClip clip)
{
this.gameObject.SetActive(true);
if(source == null)
{
source = this.gameObject.AddComponent<AudioSource>();
source.playOnAwake = false;
source.loop = false;
}
source.clip = clip;
source.Play();
}
}
管理器
管理器作为一个单例的存在 切换场景的时候缓存对象会丢失 需要清空管理器中的缓存
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
//音效的管理器
public class AudioEffectManager
{
//空闲数组
private Stack<AudioEffect> sources = new Stack<AudioEffect>();
private static AudioEffectManager _Instance;
public static AudioEffectManager Instance
{
get {
if(_Instance == null)
{
_Instance = new AudioEffectManager();
}
return _Instance;
}
}
public void Clear()
{
sources.Clear();
}
public void PlayAudio(AudioClip clip)
{
if (sources.Count > 0)
{
AudioEffect effect = sources.Pop();
effect.Play(clip);
}
else
{
GameObject obj = new GameObject();
obj.name = "AudioEffect";
AudioEffect effect = obj.AddComponent<AudioEffect>();
//这里需要增加监听计入缓存
effect.Register((AudioEffect e) => {
sources.Push(e);
});
effect.Play(clip);
}
}
}