Unity coroutine, Event

램해·2025년 4월 18일
0

Coroutine

유니티에서는 특정 코드가 반복적으로 행하기 위해서는 Update에서 프레임마다 갱신되기 마련인데 이 작업을 Update에서가 아닌 다른 곳에서도 반복적으로 행할 필요가 있을 때 Coroutine를 쓴다. Coroutine는 Update와 비교하면 Update는 매 프레임마다 반복적으로 행하지만 Coroutine는 필요한 순간에만 반복하고 사용하지 않을 때는 반복을 사용하지 않기에 효과적으로 관리 할 수 있다.

IEnumerator과 yield

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의 차이

CoroutineInvoke
반복 실행가능불가능
중간멈춤가능불가능

Event

유니티에서 Event란 사건이 발생시킨 물체와 반응한 물체가 있고 이 과정을 Event라고 한다. 예를 들어서 우리가 구독한 사람이 새로운 영상이 올라왔을 때(사건) 알람(반응)이 올 것이다. 즉, 특정 상황이 일어났을 때 다른 객체나 코드에게 사건이 일어났음을 전하는 방식이다. Event는 Delegate 기반으로 만들어지므로 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");
    }
}

0개의 댓글