Unity

[Unity] Some objects were not cleaned up when closing the scene. (Did you spawn new GameObjects from OnDestroy?)The following scene GameObjects were found 해결법

Guk-blog 2022. 1. 3. 16:37
728x90
반응형

플레이를 종료할 때 갑자기

Some objects were not cleaned up when closing the scene. (Did you spawn new GameObjects from OnDestroy?)
The following scene GameObjects were found 

라는 에러를 뱉었는데 해결법을 찾아 이리 저리 검색해보았더니

 private static object _lock = new object();
     private static gameManager _instance;
     public static gameManager Instance
     {
         get
         {
             if (applicationIsQuitting)
             {
                 return null;
             }
 
             lock (_lock)
             {
                 if (_instance == null)
                 {
                     GameObject go = new GameObject("gameManager");
                     go.AddComponent<gameManager>();
                     DontDestroyOnLoad(go);
                 }
             }
 
             return _instance;
         }
     }
 private static bool applicationIsQuitting = false;
 public void OnDestroy()
     {
         Debug.Log("Gets destroyed");
         applicationIsQuitting = true;
     }

[출처 : https://answers.unity.com/questions/1274772/some-objects-were-not-cleaned-up-when-closing-the-4.html]

식으로 작성을 하면 해결된다는 글을 보았습니다.

해결이 되면 다행인데 이번엔 여전히 저 싱글톤을 호출해 에러를 무수히 찍거나 applicationIsQuitting이 여전히 true라 

instance를 생성하지 못하고 null만 return하였는데

 

어떻게 할까 이리저리 해본 결과 간단하게 해결하게 되어 그 정보를 공유 및 블로그에 저장하기 위해 글을 씁니다.

applicationIsQuitting은 사용하지 않고 Time.timeScale이 0이 아닐 때만 새로 생성하게 했습니다.

인스턴스를 Get하는 부분을 아래와 같이 수정해주면 됩니다

public static T Instance
    {
        get
        {
            if (_instance == null && Time.timeScale != 0)
            {
                lock (_lock)
                    CreateInstance();
            }
            return _instance;
        }
    }

그리고 ApplicationQuit할 때 아래와 같이 코드를 작성해주세요

    private void OnApplicationQuit()
    {
        Time.timeScale = 0;
    }

짜잔 끝입니다

참고를 위해 코드를 첨부합니다

private protected static T _instance;
    private static Object _lock = new Object();
    public static T Instance
    {
        get
        {
            if (_instance == null && Time.timeScale != 0)
            {
                lock (_lock)
                    CreateInstance();
            }
            return _instance;
        }
    }

    public static void CreateInstance()
    {
        _instance = FindObjectOfType<T>();
        if (_instance == null)
        {
            var go = new GameObject(typeof(T).Name);
            _instance = go.AddComponent<T>();
            DontDestroyOnLoad(go);
        }
        else
        {
            DontDestroyOnLoad(_instance.gameObject);
        }

        if (!_instance.initialized)
        {
            _instance.Initialize();
        }
    }

    private bool initialized;
    protected virtual void Initialize() { _instance.initialized = true; }
    private void OnApplicationQuit()
    {
        Time.timeScale = 0;
    }

위 코드는 코드 전체가 아님으로 본인의 싱글톤 선언부에 본인의 스타일대로 수정하여 사용하시면 됩니다.

즐거운 코딩되시길

728x90
반응형