Unity/Unity 개발

싱글톤 중복 생성 문제 해결

leedh1211 2025. 6. 4. 20:31

학습 동기

DontDestroyOnLoad를 적용한 GameManager, ResourcePool 등이 씬 전환 이후 중복 생성되어 실행 중인 게임 오브젝트가 2개가 되는 문제가 발생했다. 싱글톤 패턴을 통해 중복 생성을 방지하려 했지만, Unity 특유의 씬 초기화 타이밍 이슈로 인해 중복 생성이 발생한 것으로 판단되었고, 이를 해결하는 안정적인 구조를 고민하게 되었다.

학습 내용

Awake() 단계에서 instance == null을 조건으로 현재 인스턴스를 할당하고, 이미 인스턴스가 존재한다면 중복 오브젝트는 즉시 Destroy(gameObject) 처리하는 구조로 정리하였다. 또한 FindObjectsOfType<T>().Length > 1를 이용해 더 명확히 중복 여부를 판단하도록 보완하였다.

기존 구조에서는 DontDestroyOnLoad가 붙은 오브젝트가 씬 전환 시 자동으로 생성되면서 중복되는 상황이 발생했는데, 이를 방지하기 위해 씬 진입 전에 필요한 매니저 오브젝트가 존재하는지 체크하고, 없을 경우에만 생성하도록 구성하는 방식으로 개선을 진행했다.

To-do

 

  • Singleton을 통합 관리하는 BootstrapScene 구성 여부 검토
  • DontDestroyOnLoad와 Addressable 간 충돌 방지 구조 정립
  • 각 Singleton의 초기화 순서를 명확히 하기 위한 InitManager 구현 고려
  • GameManager가 모든 초기화를 담당하는 구조 → 역할 분산 고려

 

주의점

싱글톤 패턴은 매우 직관적이고 편리하지만, Unity 환경에서는 DontDestroyOnLoad와 결합될 때 예기치 않은 중복 생성이나 순서 문제로 이어질 수 있다.