🔥 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문제를 해결하게 되면 싱글톤 관련해서 글을 작성하겠다.....
그리고 확실하지 않은 게 있으면 꼭 테스트프로젝트에서 테스트해 보고 적용하자...!!!!
'Unity' 카테고리의 다른 글
[Unity] ScriptableObject (스크립터블 오브젝트) 이해하기 (0) | 2025.02.18 |
---|---|
[Unity] 맵 범위를 넘어가지 않는 카메라 구현 / Mathf.Clamp (0) | 2025.02.17 |
[Unity] 스크립트 실행 순서 (0) | 2025.01.21 |
[Unity] Event System 이벤트 시스템 ( IPointerClickHandler 등 ) (1) | 2025.01.20 |
[Unity] 빌딩 시스템 만들기 #2. Snap & Build (0) | 2024.06.22 |