"깊이"가 다른 게임개발자 허민영

유저에서 게임까지, 철학에서 코딩까지, 본질을 보는 게임개발

소프트웨어 공학/코딩

Unity] 라이프사이클 (Awake, OnEnable, Start)에 대한 실험결과

허민영 2025. 7. 25. 07:46

비활성 프리팹을 Instantiate 했을 경우
ㄴ 프리팹 내부에 스크립트는 Awake도 실행되지 않는다.(액티브를 대기)

활성프리팹을 Instantiate  하고 다음 줄에서 SetActive(false); 실행했을 경우
ㄴ Awake와 OnEnable이 실행되고 Start는 실행되지 않는다.

*라이프사이클 메서드에 프레임로그를 확인*

테스터의 Awake,OnEnable타임에 프리팹을 Instantiate한 경우
ㄴ Awake, OnEnable는 0프레임, Start는 1프레임에 호출되었다.

테스터의 Start타임에 프리팹을 Instantiate한 경우
ㄴAwake, OnEnable, Start가 동일하게 1프레임에서 호출되었다.

 테스터의 Update타임에 프리팹을 Instantiate한 경우
ㄴ첫번째 프레임에 생성된 객체의 Update가 두번째 프레임에 생성된 객체의 Start보다 빠르게 작동했다.(?!!!)
ㄴ5번째 프레임 동작을 보면 신규Awake -> 신규 OnEable -> 기존 객체 4개 업데이트문 호출 -> 신규 Start 순으로 호출 

테스터의 Awake타임에 활성프리팹과 비활성프리팹을 Instantiate한 뒤 경우 Start타임에 셋엑티브를 켠 경우
ㄴ0프레임 활성프리팹 Awake OnEable 호출 -> 1프레임 비활성프리펩 Awake OnEable호출-> Start함수 호출(정상작동)

테스터의 Awake타임에 활성프리팹과 비활성프리팹을 Instantiate한 뒤 경우 Update타임에 셋엑티브를 켠 경우
ㄴ 0프레임 활성프리팹 Awake OnEable 호출 -> 1프레임 활성프리팹 Start 호출, ->1프레임 비활성프레임 Awake OnEable 호출 -> 1프레임 활성프리팹 Update호출 -> 1프레임 비활성프리팹 Start호출

*FixedUpdate LateUpdata도 로그작업 추가*
테스터의 Awake타임에 활성프리팹(a객체)과 비활성프리팹(b객체)을 Instantiate한 뒤 경우 OnEnable타임에 셋엑티브를 켠 경우
ㄴ메뉴얼 순서대로 작동함

(why)테스터의 Awake타임에 활성프리팹(a객체)과 비활성프리팹(b객체)을 Instantiate한 뒤 경우 Start타임에 셋엑티브를 켠 경우
ㄴ0프레임 a.Awake a.OnEable 호출 -> 1프레임 b.Awake b.OnEable호출->a.Start호출-> a.FixedUpdate호출?????! ->b.Start함수 호출-> a.Update호출, b.Update호출
ㄴ b의 start함수는 a의 fixedUpdate다음 호출되었으며 b는 fixedUpdate가 한번 생략되고 Update부터 시작하였다.

테스터의 Awake타임에 활성프리팹(a객체)과 비활성프리팹(b객체)을 Instantiate한 뒤 경우  fixedUpdate 타임에 셋엑티브를 켠 경우
ㄴ ㄴ0프레임 a.Awake a.OnEable 호출 -> a.Start호출-> 1프레임 b.Awake b.OnEable호출-> a.FixedUpdate호출 ->b.Start함수 호출-> a.Update호출, b.Update호출
ㄴ b의 start함수는 a의 fixedUpdate다음 호출되었으며 b는 fixedUpdate가 한번 생략되고 Update부터 시작하였다.

테스터의 Awake타임에 활성프리팹(a객체)과 비활성프리팹(b객체)을 Instantiate한 뒤 경우  Update 타임에 셋엑티브를 켠 경우
ㄴ 0프레임 a.Awake a.OnEable 호출 ->  a.Start호출-> a.FixedUpdate호출 -> 1프레임 b.Awake b.OnEable호출-> a.Update호출 ->  b.Start함수 호출->a.lateUpdate호출 b.lateUpdate호출
 b의 start함수는 a의 Update다음 호출되었으며 b는 fixedUpdate,Update가 한번 생략되고 lateUpdate부터 시작하였다.

결론
1. Instantiate 메서드에 프리팹의 셋엑티브 상태에 따라 Awake와 OnEnable을 수동으로 호출하는 동작이 포함되어있다.
2. 비활성화 프리팹이 활성화되는 순간 Awake와 OnEnable은 호출된다.
-> Awake와 OnEnable은 즉시 함수이지 라이프 사이클 주기함수가 아니다. 다른 객체와의 순서가 보장되지 않는다.
3. Start는 라이프사이클에 끼어들어가며 시작되지만 언제 호출되는 지 알수 없다. 어떤 규칙으로 시간이 지난다음 들어가는지도 알 수 없다.
실험을 진행한 유니티 버전 : 2022.3.17f1