Unity
[Unity] 씬 전환 (DontDestroyOnLoad) 오브젝트 Missing 문제
youcheachae
2025. 1. 31. 20:23
🔥 DontDestroyOnLoad를 할 때 오브젝트가 missing이 되어서
🔥 어떤 경우에 missing 되는지 알아보는 글
- Manager스크립트
public class Manager : MonoBehaviour
{
// 싱글톤
private static Manager instance;
[Header("===Asset 폴더에서 드래그한 오브젝트===")]
[SerializeField]
private Sprite _assetSprite;
[SerializeField]
private GameObject _assetPrefab;
[Header("===Canvas상의 ui 컴포넌트===")]
[SerializeField]
private Button _button;
[SerializeField]
private TextMeshProUGUI _Text;
[Header("===씬 상의 오브젝트===")]
[SerializeField]
private GameObject _sceneObject;
private void Awake()
{
// 싱글톤
// 중복방지
if (instance != null && instance != this)
{
Destroy(gameObject); // 객체 전체를 파괴
return;
}
instance = this;
// 삭제 x
DontDestroyOnLoad(this.gameObject);
// 버튼에 이벤트 추가
_button.onClick.AddListener(test);
}
private void test()
{
SceneManager.LoadScene("TestScene2");
}
}
어떤 오브젝트가 missing 되는지 알기 위해서
1. Asset폴더에서 드래그한 오브젝트
2. Canvas상의 UI 컴포넌트
3. 씬 상의 오브젝트
3 분류로 나누어봤다.
- 초기 인스펙터창
: 각각에 맞게 오브젝트를 할당한 모습이다.
- 하이어러키 창에서 DontDestroyOnLoad가 잘 되는 것도 볼 수 있다.
- 씬 전환 시!!!!!
- 씬 상에 있던 모든 오브젝트가 missing이 되는 상황이다
1. Asset폴더에서 드래그한 오브젝트2. Canvas상의 UI 컴포넌트3. 씬 상의 오브젝트
- Asset폴더에서 드래그한 오브젝트만 할당되어 있는 것을 볼 수 있다.
그럼 씬의 스크립트에 할당된 오브젝트들은 어떻게 되지?
- 씬 전환 전
- 씬 전환 후
! 당연히 영향 안 받는다
이 글을 쓰게 된 계기
: 싱글톤을 검색하면 항상 연관되어 있는 것이 DontDestroyOnLoad이다.
나는 이때까지 UI 오브젝트나 맵 상에 있는 오브젝트를 관리하는 Manager 스크립트에 Singleton을 사용하였기 때문에
DontDestroyOnLoad 하면 missing오류가 날 수밖에 없었다.
: 스크립트의 역할에 맞춰서 DontDestroyOnLoad 해야 한다
예를 들어서)
DontDestroyOnLoad로 관리해야 할 데이터
1. 재화 데이터
2. 플레이어 해금 데이터
3. 사운드 관리
4. 선택한 플레이어 데이터
정도가 있을 것 같다.
+) 만약 오브젝트를 DontDestroyOnLoad 해야 할 때
Resource.Load로 동적로딩을 해도 된다.
개인프로젝트의 DontDestroyOnLoad문제를 해결하게 되면 싱글톤 관련해서 글을 작성하겠다.....
그리고 확실하지 않은 게 있으면 꼭 테스트프로젝트에서 테스트해 보고 적용하자...!!!!