인프런 커뮤니티 질문&답변

DSK님의 프로필 이미지
DSK

작성한 질문수

[라이브 멘토링] 유니티 뱀파이어 서바이벌 장르 모작

완강후, UI_Base의 Start() 함수 호출순서에 관한 질문

해결된 질문

작성

·

303

1

UI_Base Start() 함수 호출순서에 관한 질문

 

안녕하세요, 유니티강의파트3과 본 강의를 모두 수강하고, 올려주신 프로젝트코드로 공부하고 있는 도중 혼자 해결하기 어려운 부분이 생겨 질문 남깁니다.

 

UI_Base.cs 클래스의 Start()함수 호출순서에 관한 질문인데요,

 

먼저 UI_TitleScene 클래스의 실행흐름부터 제가 이해한대로 말씀드리면

Awake() -> Init() -> Start() 순으로 실행되는것으로 파악했습니다.

이때 아시다시피 UI_TitleScene은 UI_Scene을 상속받고, UI_Scene은 UI_Base를 상속받습니다.

Init()함수는 Abtract class인 UI_Base의 virtual 함수이고요.

여기까지는 쉽게 잘 이해되었습니다.

[UI_TitleScene.cs]

 

--

 

다음 스타트버튼을 누르면 로비씬으로 넘어가는데,

UI_LobbyScene에서는 아래와 같이 오버라이드된 Init()함수를 호출하는 부분이 없습니다.

참조를 찾아보아도 UI_LobbyScene의 Init()을 부르는 부분은 없고, 디버깅 중 호출스택을 살펴보면 UI_Base의 Start()에서 호출되었다고 나옵니다.

이 부분이 이해가 안갑니다!!

 

[UI_LobbyScene.cs]

 

--

 

여기서 제가 이해 안되는부분을 좀 더 자세히 말씀드리자면,

UI_TitleScene, UI_LobbyScene 모두 UI_Scene을 상속받고 UI_Scene은 UI_Base를 상속받는 구조인데, 왜 UI_LobbyScene의 Init()함수 실행시 UI_Base의 Start()함수에서 넘어오는지가 궁금합니다.

[UI_Base.cs]

UI_TitleScene에 정의된 Init()은 동일클래스내의 Awake()부분에서 Init()을 호출하고 있으니 이해가 되는데, UI_LobbyScene은 Init()함수를 명시적으로 호출하는 부분이 없고, UI_Base의 Start()함수내에서 Init() 실행시 UI_LobbyScene의 override된 Init()을 실행하는점이 이해가 안됩니다.

 

아마 UI_Base의 Start()함수 실행시점을 파악하지 못해 생긴 궁금증인 것 같기도 합니다..

 

 

왜 UI_TitleScene의 코드가 Awake(), Start()될 때

UI_Base의 Awake()나 Start()가 실행되지 않고,

게임시작버튼을 누르고 로비로 넘어갈 때 왜 실행되는지가 궁금합니다.

 

 

제가 이해하지 못한 부분을 설명하기가 굉장히 어렵네요ㅠ

감사합니다.

답변 1

1

Rookiss님의 프로필 이미지
Rookiss
지식공유자

뭐 사실 저 부분은 그냥 제가 좋아하는 작업방식이지만
정석적인 방법까진 아니긴 합니다.

일단 Awake는 가장 먼저 UI를 만들 때 (Instantiate) 바로 실행되고
Start는 생명주기상 Awake가 다 끝나고 게임이 실행되는 시점에 호출됩니다.
요 둘은 유니티에서 특별하게 취급하며 일종의 virtual void Start(); 와 같은 가상함수라고 생각하시면 됩니다.
따라서 부모클래스에서 Start() 내용을 적고 자식클래스에서 Start()를 사용하지 않을 경우,
그대로 부모클래스의 Start()로 실행되는 특징이 있는데
그것을 이용해 거기 안에다가 Init()을 끼어 넣어서 간접적으로 실행하는 것이죠.

이렇게 하지 않고 진짜 Awake, Start를 virtual 처리해서 override해서
자식 클래스에서 Init 코드를 그쪽에도 옮겨도 사실 무방합니다.

DSK님의 프로필 이미지
DSK
질문자

정말 궁금했는데 이제 이해되었습니다.. 감사합니다ㅠ

DSK님의 프로필 이미지
DSK

작성한 질문수

질문하기