티스토리 뷰

IT지식

Unity C# – Coroutine

민자르 2018. 4. 16. 23:10
반응형

유니티에서 사용되는 코루틴(Coroutine)

코루틴은 MonoBehavior가 비활성화(disabled) 되었을 때에는 작동이 멈추지 않으며, 확실하게 제거되었을 때에만 멈추게 됩니다. 또한 MonoBehavior.StopCoroutiner과 MonoBehaviour.StopAllCoroutines을 사용해서도 가능합니다. 코루틴은 MonoBehaviour가 제거되면 작동이 멈춥니다.

유니티에서 화면의 변화를 일으키기 위해서는 Update() 함수 내에서 작업을 하게 됩니다. 이 Update() 함수는 매 프레임을 그릴때마다 호출되며 60fps의경우라면 초당 60번의 Update() 함수 호출이 발생하게 됩니다. 하나의 프레임 안에서 어떤 작업을 한다면 이 Update() 함수에 코드를 작성하면 될 것입니다.

하지만 다수의 프레임을 오가며 어떤 작업을 수행해야 한다면 어떻게 해야 할까요? 혹은 특정 시간, 가령 3초 동안 특정 작업을 수행해야 한다면 어떻게 해야 할까요? 3초니깐 3 x 60 = 180 프레임동안 작업을 수행하도록 하면 될까요?

안타깝게도 기기의 성능이나 상황에 따라 프레임 드랍(Frame drop)이라는 상황이 발생하게 됩니다. 60fps의 게임일지라 하더라도 디바이스의 성능에 따라 그 이하로 떨어질 수 있다는 의미가 됩니다. 이렇게 되면 더더욱 3초 동안 작업을 수행한다는게 쉽지 않은 일이 됩니다.


public class FadeOut : MonoBehaviour {

 
private SpriteRenderer spriteRenderer;
 
void Start () {
spriteRenderer = GetComponent<SpriteRenderer> ();
StartCoroutine ("RunFadeOut");
}
 
void Update () {
}
 
IEnumerator RunFadeOut() {
Color color = spriteRenderer.color;
while (color.a > 0.0f) {
color.a -= 0.1f;
spriteRenderer.color = color;
yield return new WaitForSeconds(0.1f);
}
}
}

여기서 주목해야 하는 부분은 yield return new WaitForSeconds(0.1f); 부분입니다.

이 복잡해 보이는 코드는 0.1초 동안 잠시 멈추라는 의미를 가진 코드입니다. 이제 위의 코드를 통해서 페이드 아웃 효과는 0.1초씩 10번을 수행하며 1초동안 사라지는 모습을 보여주게 됩니다. 이 코루틴은 Update() 함수에 종속적이지 않으며 마치 별도의 쓰레드와 같이 동작을 하게 됩니다. 이와 같은 코드로 프레임율에 영향을 받지 않는 시간 기반의 서브루틴을 구동할 수 있게 되었습니다.



728x90
반응형
댓글