DontDestroyOnLoad 사용시 주의 점 


전부터 저 함수를 자식 오브젝트에 사용하면 장면이 교체되어도 자식 포함해서 부모까지 전부 남는 건지 궁금했었는데 당장 사용하질 않아서 당시에는 그냥 넘기고 잊고 있다가 이번에 ios로 테스트하려니 켜자마자 그냥 죽길래 뭐가 문제인가 찾아보다가 이것 때문인 걸 알게 되어서 몇 자 적습니다.

 

5.3버전부터 경고를 했었나 보네요. DontDestroyOnLoad only work for root GameObjects or components on root GameObjects. 라고 뜨는데요. 말 그대로 최상위 게임오브젝트나 최상위 게임오브젝트에 붙어있는 컴포넌트에서만 작동한다는 경고 메시지입니다. 그런데 이 메시지를 저만 그런지는 모르겠으나 에디터에서는 안 띄워주고 빌드 했을 때만 띄워줘서 전혀 모르고 있다가 게임 내 콘솔 창을 만들어서 띄우고 윈도우즈에서 테스트할 때 알았습니다. 경고로만 뜨고 플레이에 전혀 문제가 없어 큰 문제 아니구나 하고 알고만 있고 넘어갔는데 ios에서는 빌드해서 보니 유니티 스플래시 뜨기도 전에 켜자마자 바로 죽네요.

 

xcode 로그가 딱 저렇게만 나오는데 놓치고 있는 부분이 있는지 모르겠지만 봐도 어디가 문제인지는 알 수가 없어서 뭐를 잘못했을까 생각하다가 문득 저 경고가 생각나서 메시지 말대로 최상위가 아닌 얘들한테 사용하는 곳을 찾아 수정하고 빌드를 해서 보니 문제없이 잘 됩니다. (그런데 며칠 전까지도 같은 코드를 사용하고 있었는데 그때는 왜 잘 됐었을까요 ?ㅁ?)

 

5.3버전 넘어가면서 내부적으로 어디가 바뀌어서 그런 건지 정확히 원인이 이것인지 이것으로 인해 사이드 이펙트가 생기는 건지는 모르겠지만, 관련이 된 것은 맞는 것 같네요. 혹시 ios 테스트하시다가 그냥 죽는 경우가 생기면 이쪽도 한 번 봐보시기 바랍니다. 조금 불만인 것은 변경 점이나 이런 문제가 생길 수 있으면 레퍼런스에 적어 놓았으면 좋을 텐데 저 경고에 해당하는 부분은 내용이 아직 없네요. 함수도 UnityEngine.Object 형을 인자로 받고 있어서 넣을 수 있으면 다 되는 줄 알고 머티리얼에 사용하고 있었는데 원래라면 사용하면 안 되는 거였군요. 저처럼 사용자가 실수할 수 있는 부분인데 UnityEngine.GameObject나 UnityEngine.Component 형만 넣을 수 있게 했으면 더 좋지 않았을까 합니다.

 

여담으로 파괴되지 않아야 하는 해당 오브젝트가 자식인 경우에는 해당 오브젝트의 transform.root.gameObject를 인자로 넣어서 함수를 실행시키면 자신을 포함하는 최상위 오브젝트가 효과를 받아 밑으로 있는 자식까지 파괴되지 않습니다.

 

참고 - http://answers.unity3d.com/questions/996282/wierd-console-errors.html


출처 : https://fetchinist.com/blogs/?p=2061





반응형

+ Recent posts