반응형
Dontdestroyonload를 GameManager엠나 붙여도 안없어지길래 다른 매니저들도 있지만 GameManager에만 중복 방지 코드를 적었다. 그랬더니 계속 DialogueManager가 MissingReferenceException이라는 에러가 계속 떴다.
GameObject: Manager
├── GameManager (MonoBehaviour)
├── DialogueManager (MonoBehaviour)
├── UIManager (MonoBehaviour)
위와 같은 구조로 매니저를 관리했었다.
private void Awake()
{
if (Instance != this && Instance != null)
{
Destroy(gameObject);
return;
}
else
{
Instance = this;
DontDestroyOnLoad(gameObject);
}
}
왜 이런 문제가 발생했을까?
Unity는 GameObject 하나에 여러 컴포넌트를 붙여도 각 컴포넌트(MonoBehaviour)는 개별 인스턴스로 생성되고 관리된다.
즉 같은 GameObject여도 GameManager,DialogueManager,UIManager는 Unity 내부적으로 각각 다른 컴포넌트 인스턴스이다.
그러므로 위의 문제 상황
GameManager는 DontDestroyOnLoad 덕분에 유지되지만 DialogueManager는 자체적으로 싱글톤 중복 방지 로직이 없기 때문에 씬 전환시 Main씬에 또 다시 하나가 생성된 것이었다. 그러므로 Instance=this로 새로 바뀌고 이전에 있었던 것은 Destroy()된것이었다. 결과적으로 MissingReferenceException 에러가 떴다.
결론
Unity는 GameObject가 아니라 MonoBehaviour(스크립트) 단위로 컴포넌트를 관리한다. 그러므로 각각의 스크립트를 독립적으로 관리하자
반응형
'유니티 공부 > Unity' 카테고리의 다른 글
Unity - FSM(Finite State Machine)을 사용해서 몬스터 AI를 만들어보자 (0) | 2025.05.09 |
---|---|
Unity - Strategy Pattern(전략 패턴)을 사용해 씬에 따라 플레이어의 조작 방식을 달라지게 만들어보자 (0) | 2025.05.07 |
Unity - 상속 구조에서 호출 누락 조심! (0) | 2025.05.01 |
Unity - 코루틴 중복 사용 막는법 (0) | 2025.05.01 |
Unity - 디버그 프로필에 지정된 디버그 실행 파일 .exe가 없습니다 에러 (0) | 2025.04.21 |
댓글