빠른 흐름
private void Awake()
{
DontDestroyOnLoad(gameObject);
}기본 흐름
씬 전환에서 오브젝트를 유지하는 이유
Unity는 기본적으로 씬을 로드할 때 이전 씬의 모든 오브젝트를 파괴합니다. DontDestroyOnLoad를 호출하면 해당 오브젝트는 씬 전환 후에도 살아남아 계속 동작합니다. 배경음악 플레이어, 전역 설정 매니저, 로딩 오버레이처럼 여러 씬에 걸쳐 지속되어야 하는 대상에 쓰이는 이유입니다.
중복 생성 방지 패턴
씬마다 같은 프리팹이 배치되어 있으면 씬이 로드될 때마다 인스턴스가 새로 생겨 중복됩니다. 아래처럼 Awake에서 이미 인스턴스가 있는지 확인하고, 있으면 새로 생성된 자신을 파괴하는 방식이 일반적입니다.
private static AudioManager instance;
private void Awake()
{
if (instance != null && instance != this)
{
Destroy(gameObject);
return;
}
instance = this;
DontDestroyOnLoad(gameObject);
}첫 번째 인스턴스만 살리고 나머지는 제거함으로써, 씬이 몇 번 로드되어도 매니저가 하나만 유지됩니다.
전역 상태 최소화
DontDestroyOnLoad 대상이 늘어날수록 전역 상태가 많아지고 씬 간 의존성이 복잡해집니다. 정말 여러 씬에 걸쳐 지속되어야 하는 오브젝트만 유지하는 편이 관리하기 좋습니다. 씬별로 독립적인 데이터나 매니저는 씬 안에 두고, 전역 매니저는 최소한으로 유지하는 전략이 장기적으로 더 깔끔합니다.
체크포인트
| 상황 | 적합한 선택 |
|---|---|
| 배경음악, 전역 매니저를 씬 전환 후에도 유지 | DontDestroyOnLoad(gameObject) |
| 씬마다 프리팹이 배치된 경우 중복 방지 | Awake에서 인스턴스 확인 후 신규 파괴 |
| 씬별 독립 데이터나 매니저 | 씬 안에 두고 전역으로 만들지 않기 |
| 전역 매니저 최소화 | 꼭 필요한 오브젝트만 유지 권장 |
주의할 점
씬마다 같은 프리팹이 배치되어 있으면 씬 로드마다 중복 인스턴스가 생깁니다. 반드시 중복 방지 코드와 함께 사용하세요.
// ❌ 중복 방지 없이 DontDestroyOnLoad만 호출
private void Awake()
{
DontDestroyOnLoad(gameObject);
// 씬 재로드 시 두 번째 인스턴스도 파괴되지 않아 중복됨
}
// ✅ 이미 인스턴스가 있으면 새로 생긴 자신을 파괴
private static AudioManager instance;
private void Awake()
{
if (instance != null && instance != this)
{
Destroy(gameObject); // 중복 제거
return;
}
instance = this;
DontDestroyOnLoad(gameObject);
}참고 링크
1 sources