반응형

 

한 애니메이션에 에니메이션 이벤트를 두웠는데

 

하나의 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);
        }
    }

 

 

반응형

+ Recent posts