본문 바로가기

유니티 스파르타 캠프 7주차

250519 Awake, Start, Enable, Disable 등 구동 정리

코드를 짜다보면 가끔 코드의 구동 순서 때문에 꼬이는 경우가 발생합니다. 

이전에 튜터님께서 강의로 한 번 설명을 해주셨던 거 같지만 스스로 이해가 덜 되었는지

같은 실수를 반복하기에 내용을 한번 참고자료와 함께 적립해보겠습니다.

이벤트 함수 실행 순서(Execution Order of Event Functions) - Unity 매뉴얼

🏸 Awake의 사용 시기?

Awake는 보시는 바와 같이 맨 처음에 시작하게 됩니다. 그럼 처음에 시작하면 안되는 것이 뭐가 있을까요? 

그건 바로 자신이 아닌 타 오브젝트의 스크립트 또는 변수의 값을 가져오는 것입니다. 많은 Awake 중에서 누가 먼저인지도 모르는데 Awake로 다른 스크립트를 불러올 시, 그 오브젝트는 Awake되지 않은 Null 값일 수 있습니다. Component는 게임오브젝트에 붙이게 되는데 이 때문에 다른 게임오브젝트를 건드는 것도 Start에서 하는 것이 안전해보입니다.

하면 안되는 것 ❌ : 다른 Awake 스크립트 건들기

🏸 OnEnable의 사용 시기?

OnEnable은 오브젝트가 활성화될 때를 의미합니다. SetActvie(true) 또는 생성, 맨 처음 시작했을 때 인스펙터에서 활성화되어있다면 실행합니다. Awake와 Start와는 다르게 활성화될 때마다 생성되기에 한 번만 사용하는 것은 Awake 또는 Start를 활용해야합니다. OnEnable은 주로 활성화될 때 한 번만 초기 세팅을 해줘야할 경우에 사용하게 됩니다. 

하면 안되는 것 ❌ : 한 번만 실행해야하는 함수 넣기

🏸 Start의 사용 시기?

Start의 사용 시기는 간단합니다. Awake에서 필요하지만, 다른 스크립트의 준비시간을 주기위해 못 썼던 타 스크립트에서 받아올 정보들 및 스크립트의 초기 세팅을 해주면 됩니다. 주의할 점은 Awake와는 반대로 스스로 받아올 수 있는 컴포넌트는 Awake에서 해주셔야 다른 스크립트에서 이 스크립트를 접근할 때 코드가 꼬이지 않습니다. 

하면 안되는 것 ❌ : 본인이 받아올 수 있는 스크립트를 Start에 적기(Awake에서 해주셔야함)

🏸 OnDisable의 사용 시기?

OnDisable은 OnEnable과 반대이니 그대로 비활성화될 때 실행합니다. 단순히 SetActive(false) 때는 실행이 되지만, Destroy 같은 경우에도 OnDisable이 실행됩니다. 저는 주로 OnEnable과 연계해서 쓰는 편이며, Enable에서 설정한 것을 Disable에서 해제하는 방법을 사용합니다. 예시로는 Coroutine이나 애니메이션 값 정지 또는 초기화 등이 있습니다. 

하면 안되는 것 ❌ : 특별히 문제 생긴적은 없는 거 같습니다.