Prosto

Awake, Start, OnEnable, OnDisable - 유니티 스크립트 본문

Programing/Unity 3D

Awake, Start, OnEnable, OnDisable - 유니티 스크립트

Prosto 2017. 5. 1. 23:21


유니티에서 스크립트를 작성하고, 컴포넌트로 등록하여 사용할 때,

가장 기본이 되는 자동으로 일정 시점에서 호출되는 함수들이 있죠.


Awake(), Start(), Update(), FixedUpdate(), OnEnable(), OnDisable() 등이 있습니다.



일단 간단하게 살펴보자면,


Awake()

 해당 스크립트가 등록된 오브젝트(&스크립트)가 최초로 활성화될 때 불리는 함수입니다. (한번만 호출됨)


Start()

 Awake()와 마찬가지로 최초로 활성화될 때 한번만 불리는 함수입니다. (Awake보다는 늦게 호출됨)


Update()

 활성화 상태일 때 한 프레임에 한번씩 호출되는 함수입니다.

 (게임 프레임 1초에 60프레임이 나온다면 1초에 60번, 80fps라면 80번 호출)


FixedUpdate()

 Update()와 마찬가지로 활성화 상태일 때 지속적으로 호출되지만, 1초에 고정된 횟수만큼 호출합니다.

 (따로 설정하지 않았다면 기본 물리시간인 0.02초에 한번씩 호출됩니다.)


OnEnable()

 활성화 될 때마다 호출되는 함수입니다.(Awake/Start와 달리 활성화 될 때마다)


OnDisable()

 비활성화 될 때마다 호출되는 함수입니다.(스크립트든 오브젝트든)


 그 외에도 충돌이 됐을 때 호출되는 함수 등이 있지만,

 가장 기본적인 함수들은 위에 있는 함수들이라고 생각됩니다.


 게임을 만드는 중 어떤 순서로 스크립트가 작동되는지, 어떠한 상황에 불려지는지 알아야 적재적소에 사용할 수 있겠죠.



 이번에는 예제로 소스를 적고, 게임을 실행시켜 Awake(), Start(), OnEnable(), OnDisable()이 각각 어느 상황에, 어떤 순서로 불리는지, 어떤 차이가 있는지 확인해보겠습니다.

 이미지와 함께 보시죠.


먼저 스크립트를 작성합니다.

TestScript라는 이름으로 생성했습니다.


그리고 아무 오브젝트나 활성화 되어있는 오브젝트에 컴포넌트로 추가해줍니다.

기본 생성되어있던 MainCamera에 넣었습니다.


그럼 이제 테스트를 위한 간단한 소스를 작성해볼까요?




호출되는 함수들을 쭉 만들어주고

Debug.Log로 어떤 함수가 호출됐는지 콘솔창에 찍어줍니다.


이제 실행해볼까요?


자, 확인해보니

가장 먼저 호출된 게 Awake,

그 다음이 OnEnable,

그 다음이 Start 순으로 호출되었네요.


OnEnable은 활성화 될 때마다 호출되니(조금 다른 용도니)

지금은 같은 역할을 하는 Awake, Start를 비교해보면 좋겠죠.


먼저 호출되는 게 Awake, 그 다음이 Start라는 점을 기억해두면 좋겠습니다.



다음으로 Awake, Start와 OnEnable은 사용처가 다르다는 점을 확인해보며,

OnDisable도 함께 보겠습니다.


지금 Hierarchy 탭에서 MainCamera를 선택하여 정보를 보면

우측 하단에 TestScript가 체크(활성화)되어 있는 것을 알 수 있습니다.


여기서 이 체크를 해제하면 어떻게 될까요?

비활성 상태로 들어갈 테고, 그렇다면 아까 짧은 설명에서 이야기했던

비활성화 시 호출되는 함수, OnDisable이 호출되겠죠?


체크를 해제하자

OnDisable 호출!

이라는 로그가 Console탭에 찍힌 것을 확인할 수 있습니다.


그러면 이번에는 다시 체크(활성화)해볼까요?


이번에는 활성화 시 호출되는 OnEnable 함수가 호출된 것을 확인할 수 있습니다.


이때, 보면 Awake나 Start는 호출되지 않았죠?

이게 Awake/Start 함수와 OnEnable 함수의 사용되는 위치의 차이입니다.


만약 활성화 할 때마다 초기화 해줄 필요가 있다든지,

새로운 정보를 얻어와야한다든지

매번 새롭게 갱신해야 하는 정보가 있다면 해당 소스가 들어가기 적합한 위치는 OnEnable()이고,


처음 오브젝트를 생성했을 때, 혹은 스크립트가 등록됐을 때,

딱 한번만 처리하고 싶은 일이 있다면

Awake 혹은 Start에 넣어줘야겠죠?



마지막으로, 여러 스크립트 간에 서로 값을 참조한다면 Awake, Start 처리 부분을 잘 생각하고 작성해야겠죠?


예를 들면 스크립트A, 스크립트B가 있을 때,

A는 초기화가 필요하고, B는 A의 초기화 된 값을 가지고오고 싶다면 어떻게 할까요?


스크립트A에서 초기화는 Awake에서 처리하도록 하고,

스크립트B에서 스크립트A의 값 참조는 Start에서 처리하면 되겠죠?



Comments