본문 바로가기

유니티 게임 개발하기/2D 게임 개발일지

유니티 - 스크립트 함수의 실행순서 (Awake와 OnEnable)

안녕하세요? 윈디입니다.


엑스트라 페이지를 만드느라 주말동안 코딩을 하면서 보냈네요.

 다이얼로그컨트롤을 좀더 손봐서 배경화면도 바꿀 수 있도록 했습니다. 
배경에 관련된 데이터를 채팅 스크립트에 추가하고 빈 png그림인  NULLIMAGE파일을 추가하여 앞으로 특별한 것이 없으면 널이미지를 적극적으로 사용하도록 조치를 했죠.
슬라이더와 유니티엔진에서 지원하는 Scroll Rect, 그리드 레이아웃을 사용하여 여러 버튼들을 엑스트라 페이지에 나열하고, 
버튼을 누를때마다 해당 이벤트에 대한 다이얼로그가 생성되도록 했구요.

특히, 오늘 배운 것은 제가 이벤트를 저장하기 위해서 사용했던 방법에 있던 오류에 대한 것이었는데, 

▲ 대화 이벤트를 구현하기 위해서 SetActive 함수를 많이 사용했습니다.

대화를 저장한 오브젝트를 Active 시키면, 그 오브젝트 안의 스크립트가 데이터를 넘겨주는 형식으로 디자인을 했었거든요. 한번 만들고 나면 복잡하게 다른부분을 체킹할 필요가 없이

새 오브젝트에 내용 디자인하고 번호만 붙여주면 되도록 만들었다는 점이 장점인거 같아요.



지금까지는 SetActive() 를 사용할 때 그냥 사용하면 Awake() 부터 실행되는 줄 알고

시작에 필요한 함수를 전부 Awake 에 넣어뒀었거든요.


그러다 보니까 두번째로 호출할 때부터는 제대로 실행이 안 되더라고요.


자세히 알아보니까, Awake는 모든 스크립트당 1번씩밖에 발동이 되지 않더군요.


그래서 어떤 오브젝트를 껏다, 켰다 할 때 스크립트의 기능이 처음부터 기능하도록 하기 위해서는 Awake가 아니라, OnEnable 함수를 사용해야 한다는 것을 배웠습니다.


한마디로, 스크립트의 실행순서는 

 Awake()  -   (해당  오브젝트가  두번째Active되었을때 시작하는 위치)  - OnEnable() -Start()  


의 순서로 실행이 되는 것이죠.

저같은 경우엔 이 실행 순서때문에 대화의 데이터를 제대로 주고받지 못하는 현상이 벌어져서, Awake 함수에 있던 것들 중 싱글톤 패턴에 사용되는 인스턴스를 제외하고 모두 OnEnable에 바꿔 넣는 넣었습니다.

GetChild 나, SetActive 를 즐겨 쓰다 보니, 

OnEnable이  제가 디자인하는 패턴과 가장 잘 맞는다는 생각이 들어서

이부분을 모두 수정하고 필요한 부분은 코루틴화 하여

 움짤의 내용을 완성하게 되었습니다.


오늘의 내용을 정리하자면 이렇게 되겠습니다.


SetActive 의 기능입니다.

1. 단일 오브젝트만 활성화/비활성화 할 수 있다.
2. 계층구조를 가졌다면 부모의 상태에 따라 자식들도 동일한 상태를 상속받는다.
3. 상태의 변화에 따라 OnEnable/OnDisable 함수가 호출 된다.
4. 비활성화시 해당 오브젝트를 Find 할 수 없다.
5. 비활성화시 해당 오브젝트가 실행하던 코루틴 함수들은 자동 종료된다.
6. 비활성화 되어도 Invoke 와 Destroy 의 시간 지연 명령은 중지되지 않는다.
7. Awake – OnEnable – Start 의 순서로 호출된다.
8. 오브젝트가 아닌 컴포넌트를 활성/비활성화 할 경우에도 OnEnable/OnDisable 함수가 호출 된다.
그러다 코루틴은 죽지않고 유지된다.(수동으로 종료해 주어야 함.)

춡처 : http://unitystudy.net/bbs/board.php?bo_table=dustin&wr_id=395



한가지 의문점은.. SetActive에서 False상태가 된 것들이 많아져도 퍼포먼스에 영향이 있을까 하는 것인데요.. 뭐 차차 알아보면 되겠죠.

다 만들고 나니 기분이 좋네요!