유니티에서는 특정 코드가 반복적으로 행하기 위해서는 Update에서 프레임마다 갱신되기 마련인데 이 작업을 Update에서가 아닌 다른 곳에서도 반복적으로 행할 필요가 있을 때 Coroutine를 쓴다. Coroutine는 Update와 비교하면 Update는 매 프레임마다 반복적으로 행하지만 Coroutine는 필요한 순간에만 반복하고 사용하지 않을 때는 반복을 사용하지 않기에 효과적으로 관리 할 수 있다.
Coroutine은 IEnumerator의 형태의 데이터를 반환하는 함수이다. IEnumerator는 yield와 같이 사용되는데 yield는 도중에 멈췄다가 다시 움직이게 해주는 키워드이다.
Ex)
IEnumerator PrintAfterSeconds()
{
Debug.Log("5초 대기 중");
yield return new WaitForSeconds(5f); // 5초 대기
Debug.Log("5초 후 메시지 출력!");
}
yield return의 종류에 대해서 알아보자
yield return null; 다음 프레임까지 대기
yield return new WaitForSeconds(초); 특정 시간 동안 대기
yield return new WaitUntil(() => 조건); 조건이 true가 될 때까지 대기
yield return new WaitForEndOfFrame(); 현재 프레임이 끝날 때까지 대기
Coroutine | Invoke | |
---|---|---|
반복 실행 | 가능 | 불가능 |
중간멈춤 | 가능 | 불가능 |
유니티에서 Event란 사건이 발생시킨 물체와 반응한 물체가 있고 이 과정을 Event라고 한다. 예를 들어서 우리가 구독한 사람이 새로운 영상이 올라왔을 때(사건) 알람(반응)이 올 것이다. 즉, 특정 상황이 일어났을 때 다른 객체나 코드에게 사건이 일어났음을 전하는 방식이다. Event는 Delegate 기반으로 만들어지므로 Delegate에 대해서도 알아보겠다.
함수를 변수처럼 저장할 수 있는 타입을 Delegate라고 칭한다. 함수를 변수처럼 저장하고, 넘기고, 나중에 실행할 수 있게 해준다. 메서드의 주소를 저장한다고 생각하면 편하다. 하나의 Delegate로 여러개의 함수를 실행할 수 있기에 다양한 이벤트를 발생시키는 것도 가능하다.
예시
public delegate void MyDelegate();
public class Test : MonoBehaviour
{
MyDelegate myDel;
void Start()
{
myDel = Hello;
myDel(); // 출력: "Test, Delegate"
}
void Hello()
{
Debug.Log("Test, Delegate");
}
}