[내일배움캠프 Unity 9기]

05/28 TIL Unity 매니저 싱글톤 설계 및 Resources.Load 문제 디버깅

kyvv 2025. 5. 28. 21:12

✅ 오늘 해결한 문제

  • SpawnManager에서 NullReferenceException 발생
  • Instance 호출 시 new GameObject().AddComponent<T>() 구조가 문제인가 의심했지만, 실제 원인은 Resources.Load()가 null을 반환한 상태에서 .gameObject를 호출한 것이었다.

🧠 오늘 배운 것

1. Unity에서 AddComponent 시점에 Awake가 즉시 호출됨

  • AddComponent<SpawnManager>() → 즉시 Awake() 호출
  • 따라서 Awake() 안에서 Instance나 다른 매니저 참조 시 순환 참조 위험 존재
  • 해결: Awake()에서는 참조 지양, Init() 분리해서 명시적 초기화

2. Resources.Load()는 경로가 잘못되면 null을 반환한다

  • .gameObject처럼 바로 접근하면 NRE 발생
  • 항상 null 체크 필요:
  • 실제 마주한 문제점 --> 경로 문자열에 오타로 인해서 Prefab을 찾을 수 없었음
var rock = Resources.Load<GameObject>("경로"); if (rock == null) { Debug.LogError("Prefab을 찾을 수 없습니다."); }

3. Resources.Load<GameObject>()의 반환값은 GameObject다

  • .gameObject를 붙이면 오히려 불필요하거나 오류 발생 가능성
  • 즉, 아래처럼 사용하면 충분함:
var rock = Resources.Load<GameObject>("Items/Prefabs/Resource/stone");

4. 매니저 초기화는 생성(Create)과 초기화(Init)를 분리하자

  • Instance 생성과 초기화가 꼬이지 않도록 분리
  • 예시:
SpawnManager.CreateIfNeeded(); SpawnManager.Instance.Init();
 

🧰 리팩터링 고려사항

  • Resources.Load()를 대체할 수 있는 Addressable 시스템 도입 고려
  • 매니저 자동 등록 시스템: ManagerBootstrapper, IModule 인터페이스 설계 가능
  • 오브젝트 풀을 T 타입 기반으로 설계해 재사용성 강화