본문 바로가기

메모장/Unity

[Unity] 유니티 Awake의 호출 시점에 관하여

 

유니티는 기본적으로 싱글 스레드로 돌아가도록 설계되어 있다.

그 중 Awake는 씬이 시작했을때 프리팹의 인스턴스화 직 후에 호출되는 유니티 콜백함수다.

이때 게임 오브젝트가 비활성화 상태라면 오브젝트가 활성화 되거나 연결된 다른 스크립트 함수에서 호출될 때 까지
Awake의 호출이 지연된다.

이런 조건부 호출 때문에 Awake 호출 시점을 혼동하는 경우가 있다. 예시를 들어보겠다.

public class A : MonoBehaviour{
    private void Awake(){
    	Debug.Log("Awake");
    }
    
    public void FunctionA(){
    	Debug.Log("FunctionA");
    }
}
public class B{
    
    public void InitA(){
    	var a = GameObject.Find("A_Object").AddComponent<A>();
        a.FunctionA();
        a.gameObject.SetActive(true);
    }
}

위의 코드에서 B의 InitA 함수가 호출됐다고 가정해보자.

로그는 어떤 순서로 찍힐까?

정답은 A_Object의 상태에 따라서 달라진다.

위에서 언급했듯이 Awake의 호출 시점은 인스턴스화 된 직후 이지만 게임 오브젝트가 비활성화 상태라면 실행이 지연된다.

A_Object가 활성화 되어있는 경우 Awake의 호출 시점은 AddComponet<A>() 직후 이다.
따라서 로그는 다음과 같이 찍힌다.

Awake
FunctionA

하지만 A_Object가 비활성화 되어있는 경우에는 Awake의 호출이 지연되었다가 SetActive(true) 로 게임 오브젝트가 활성화 된 직후에 호출된다.
이 경우 로그는 다음과 같이 찍힌다.

FunctionA
Awake

무조건 Awake 함수가 먼저 실행될 것이라고 가정하고 코딩을 하는 경우 예기치 못한 오류가 생길 수 있으므로
Awake함수로 초기화 하는경우 호출 순서를 숙지해야한다.

 

※ 참고 - 유니티 함수의 호출 순서와 실행 시점