🔥 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문제를 해결하게 되면 싱글톤 관련해서 글을 작성하겠다.....

그리고 확실하지 않은 게 있으면 꼭 테스트프로젝트에서 테스트해 보고 적용하자...!!!!

+ Recent posts