유니티/프로그래밍
[Unity] AudioSource 사운드 재생 갯수 제한두기
송호정
2019. 7. 11. 19:01
반응형
한 애니메이션에 에니메이션 이벤트를 두웠는데
하나의 AudioSource 로 이벤트 발생시 사운드가 발생됩니다. 에니메이션 길이는 0.1초 이며 사운드 길이는 3초 입니다.
0.1초마다 애니메이션이 재생되면서 사운드가 재생이되면
3초 에 30개 사운드가 발생됩니다 .
재생되엇던 하나의 사운드가 끝나기도 전에 계속 같은 사운드가 재생됩니다.
100개 정도 사운드가 재생이되더니 유니티가 멈췃습니다.
유니티 과부하인거같아요 ....
그래서 같은 사운드로 재생 갯수를 제한두어겟다는 생각을 햇습니다 .
(재생갯수 30개 정도 두니 멈춤현상없어졋습니다)
아래 예제 소스입니다.
private Dictionary<AudioClip, List<float>> soundOneShot = new Dictionary<AudioClip, List<float>>();
private int MaxDuplicateOneShotAudioClips = 30; // oneshot이 최대 겹처서 재생될수 잇는 수
void PlayOneShotSound(AudioSource source, AudioClip clip, float volumeScale)
{
//해당 클립당 재생되고 잇는 사운드 수를 계산하기위해 아래와같이 처리한다
// 재생수가 max 만큼이면 재생안한다
if(!soundOneShot.ContainsKey(clip))
{
soundOneShot[clip] = new List<float>() { volumeScale };
}
else
{
int count = soundOneShot[clip].Count;
//한클립당 현재 재생수가 30개 넘으면 리턴한다
if (count == MaxDuplicateOneShotAudioClips) return;
soundOneShot[clip].Add(volumeScale);
}
int count1 = soundOneShot[clip].Count;
Debug.Log(clip.name + " 재생갯수 : " + count1);
source.PlayOneShot(clip, volumeScale);
StartCoroutine(RemoveVolumeFromClip(clip, volumeScale));
}
private IEnumerator RemoveVolumeFromClip(AudioClip clip, float volume)
{
// 재생 시간동안기다리고 그후에 저장된 값을 지운다
yield return new WaitForSeconds(clip.length);
List<float> volumes;
if (soundOneShot.TryGetValue(clip, out volumes))
{
volumes.Remove(volume);
}
}
반응형