✅ 오늘 해결한 문제
- 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 타입 기반으로 설계해 재사용성 강화
'[내일배움캠프 Unity 9기]' 카테고리의 다른 글
| 05/30 TIL SpawnManager 역할 고민, 낮/밤 사이클 전환, NavMesh SamplePosition (0) | 2025.05.30 |
|---|---|
| 05/29 인벤토리 시스템 구조 개선 및 버그 수정 (0) | 2025.05.29 |
| 05/27 TIL 오브젝트 풀에 관한 고찰 (0) | 2025.05.27 |
| 05/26 TIL Unity Fusion2 / 오브젝트 풀 (0) | 2025.05.26 |
| 05/23 TIL 개인 과제 제출 및 팀프로젝트 시작 전 퓨전2 입문하기 (0) | 2025.05.23 |