유니티는 기본적으로 싱글 스레드로 돌아가도록 설계되어 있다.
그 중 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함수로 초기화 하는경우 호출 순서를 숙지해야한다.
※ 참고 - 유니티 함수의 호출 순서와 실행 시점
'메모장 > Unity' 카테고리의 다른 글
[Unity/Network] 참고할만한 유니티 네트워크 API (Mirror/Mirage) (0) | 2022.11.24 |
---|---|
[Unity] GooglePlayGames 로그인 에러 해결 (2) | 2020.01.08 |
[Unity] 유니티 모바일 디버깅 방법 (adb logcat 사용법) (0) | 2019.12.27 |
에셋 스토어(Asset Store)에서 다운로드 받은 패키지의 저장 위치 (1) | 2019.11.26 |
NGUI & UGUI (0) | 2019.07.17 |