2024. 1. 1. 01:25, Unity
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을 사용한다면 이와 같이 작성해보도록 하자.
'Unity' 카테고리의 다른 글
PlayerPrefs 에 있는 숫자를 나타내는 String 을 정수 값으로 변환하는 방법 (0) | 2024.01.08 |
---|---|
c# 전처리 지시문에 대하여. (0) | 2024.01.06 |
getter 와 setter의 사용에 대하여. (0) | 2023.12.30 |
유니티 개발 환경에서 UNITY_EDITOR 와 DEBUG 환경에서만 동작하는 형태의 코드를 작성하는 방법. (0) | 2023.12.29 |
UnityEvent 를 이용해서 subscribe 하고 Invoke를 통해서 모든 구독한 메서드들을 실행시키는 형태의 코드 . (0) | 2023.12.28 |
Comments, Trackbacks