• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

MonsterController Init()함수 호출이 이해가 잘 안갑니다

24.02.23 07:07 작성 조회수 145

0

루키스님 강의보며 설계적인 측면에서 코드를 분석을 하고 있는데요.

제가 알고 있는 Init()함수 사용은 맨처음 오브젝트가 생성되었을 때 Awake() 등에서 최초로 호출되어 GetComponent() 등 한 번만 수행할 수 있는 함수라고 생각을 하고 있습니다.

근데 코드를 보니 Monster는 디스폰됬다 다시 스폰될 때 SetInfo() 함수를 호출하고 SetInfo()함수에서 Init()을 다시 호출하고 있더라구요.

스폰될 때 마다 초기화 해주어야 하는 인자들 ex) CreatureState(상태) 등 과 한번만 해줘도 되는 것들 ex) GetComponent()을 Init()에 같이 묶여있어 매우 혼란이 온 상태입니다.

Init()이 여러번 불린다면 bool 인자도 필요하지 않고 굳이 번거롭게 할 필요가 없다고 생각이 드는데요.

코드를 보다보면 부모의 Awake()에서 Init()을 호출하고 또 자식의 Awake()에서도 Init()을 호출하고 어떤데는 base.Init()만 하고 어떤데는 if(base.init() == false)해주고 같이 작성을 하셨는데 그 각각마다 다 어떤 이유를 가지고 하신건지 아니면 그냥하신건지 궁금합니다.

 

답변 1

답변을 작성해보세요.

0

우선 여담인데 코드를 볼 때 모든 것에 의미를 부여하지 마세요.
규모가 어느 정도 커진 프로젝트는 다수의 작업자가 붙고,
따라서 그들이 다 옳게 했다는 보장이 없습니다.
중간에 드랍하긴 했지만 이 프로젝트만 하더라도 보조 프로그래머가 여러명 붙었습니다.

그 다음 질문주신 부분인데요.
기본적으로 Awake는 생성 시 바로 호출되기 때문에,
이것을 생성자처럼 이용하면 되고 사실
virtual void Awake()로 가상함수로 만들어서 사용해도 됩니다.

하지만 습관적으로 유니티 예약된 Awake, Start, Update 등을 테스트 용도로 활용하는 분들도 있어
더 명확하게 Init 가상함수를 파서 작업하고,
Awake나 Start에 넣어서 초기화 부분만 빼놓은 것인데요.
Awake에 넣었다면 초기화 코드를 다 실행하니
SetInfo에서 굳이 Init() 호출을 안 해도 되지만
반대로 Start에 넣었다면, 만드는 순간이 아니라 다음 프레임이 Start가 호출될 수 있어
그럴 경우라면 SetInfo에선 Init()을 해줘야 합니다.
결과적으로 이 경우엔 SetInfo에서 Init을 안해줘도 되는게 맞습니다.