AudioSource의 재생과 ObjectPooling에서 Invoke 를 사용하는 방법과 coroutine을 사용하는 방법에 관하여.
public void Play(AudioClip clip, bool loop = false)
{
    if (clip == null)
    {
        return;
    }
    audioSource.clip = clip;
    audioSource.loop = loop;
    audioSource.Play();
    Invoke("DisableSoundFx", clip.length + 0.1f);
}

private void DisableSoundFx()
{
    GetComponent<PooledObject>().pool.ReturnObject(gameObject);
}

 

이런 형태로 만들어서 효과음을 재생한뒤 재생 시간이 지난뒤에 pool 로 되돌리는 방법도 있겠으나, 이 외의 방법으로 coroutine 을 사용하여서 구현할 수 있다. 위의 방법은 invoke를 사용하는데, 해당 invoke 사용과 관련된 성능 이슈 ( 물론 이 경우는 단발적으로, 그리고 적은 수의 개체에 대해서 이루어질 것이기 때문에 큰 성능 문제가 발생할 가능성은 높지 않다) 가 있을 수 있는데, 그런 문제를 해결하기 위해서 coroutine 을 사용하는 방법으로 구현할 수 있다. 

이와 같은 구현은 이와 같을 것이다. 

 

	public void Play(AudioClip clip, bool loop = false)
        {
            if (clip == null)
            {
                return;
            }
            audioSource.clip = clip;
            audioSource.loop = loop;
            audioSource.Play();
            StartCoroutine(DisableSoundFxAfterDelay(clip.length + 0.1f));
        }

        private System.Collections.IEnumerator DisableSoundFxAfterDelay(float delay)
        {
            yield return new WaitForSeconds(delay);
            GetComponent<PooledObject>().pool.ReturnObject(gameObject);
        }

 

많은 수의 개체에 대해서 짧은 시간안에 이루어지는 형태의 soundfx pooling이 아니라면 첫번째에 작성한 코드와 같이 실행해도 큰 문제가 될 것이라고 생각되진 않으나, 내부적으로 invoke 를 사용하기 위해서 주어진 시간만큼에 대해서 지속적으로 체크가 들어가는 부분을 고려해서 coroutine을 사용한다면 이와 같이 작성해보도록 하자. 

 

 

  Comments,     Trackbacks