본문 바로가기

Unity 생성 주기 - 인스펙터 값 반영 문제

@코야딩구2025. 7. 2. 22:11

1. 문제 상황 및 해결 과정

- 이번 프로젝트에서는 GameManager를 싱글턴(Singleton)으로 구현해, 각 씬(Scene)마다 다양한 설정 값을 관리하도록 구성했다. 원래 의도는 씬 전환 시 기존 GameManager를 삭제하고, 새 씬의 오브젝트를 새로운 인스턴스로 교체하는 방식이었다.

- 그러나 이번에는 특수한 상황 때문에 기존 오브젝트를 유지한 채, 새 씬에 포함된 GameManager 오브젝트의 값을 기존 오브젝트에 복사한 뒤, 새 오브젝트를 삭제하는 방식으로 설계하게 되었다.

- 이렇게 설계한 이유는 씬 전환 시에도 BGM이 끊기지 않도록 유지하기 위함이다. 사운드(BGM) 기능이 GameManager 내부에 구현되어 있었기 때문에, 기존 오브젝트를 제거하면 음악도 중단되는 문제가 있었다.

- 하지만 복사 과정에서 문제가 발생했다. 값 복사 로직을 Awake()에서 수행했는데, 인스펙터에서 설정한 값들이 반영되지 않은 상태였다. 이후 OnDestroy() 시점에는 값이 제대로 반영되는 걸 확인했지만, 해당 방식은 한 프레임을 소모해야 하는 비효율적인 접근이었고, 설계적으로도 적절하지 않았다.

- 결국 Unity의 오브젝트 생성 주기를 다시 조사한 후, 인스펙터 값이 Awake() 이전에 반영된다는 점을 확인하고, 복사 로직을 적절히 재구성했다. 현재는 Awake()에서 값이 정상적으로 반영되며 동작한다.

2. 인스펙터 값은 언제 반영될까?

- Unity 공식 문서에서는 아래 사진과 함께 생성 주기 함수에 대한 설명은 있지만, 인스펙터 값이 반영되는 정확한 시점에 대한 직접적인 언급은 없다.

- 우선 Unity에서는 오브젝트가 생성될 때 다음과 같은 순서로 주요 생명 주기 함수가 호출된다.

  현재까지 사용한 이벤트 함수 기준: Awake()  → Start() → Update() →  OnDestroy()

- 여러 실험결과, 이 중에서 Awake()가 호출되기 전에 인스펙터의 값이 반영된다는 사실을 확인했다.

- 이후, 기존에 반영이 안된 값들은 Start()에서 인스펙터 값을 기반한 변수를 초기화한 것을 발견하여, 이를 Awake()에서 초기화했더니 문제가 해결됐다.

3. 느낀 점

- 팀 프로젝트에 초보자도 많아, 알아서 원하는 기능을 구현하고 합치는 과정을 가졌는데, 확실히 구현 전 설계부터 확실히 해야 한다는 점을 다시 한 번 느꼈다.

- 또한, Unity와 같은 게임 엔진의 기본적인 생명 주기와 데이터 흐름에 대한 이해는 예상치 못한 버그를 줄이고, 안정적인 시스템을 구성하는 데 매우 중요하다고 생각한다. 단순히 기능 구현에만 집중하는 것이 아니라, 언제 값이 세팅되고, 언제 로직이 실행되는지를 명확히 파악하는 습관을 들이는 것이 중요하다고 생각한다.

목차