"누구나 잃을 게 있습니다. 잃기 전까지 모를 뿐이지." – 송곳

2016/07/18

DontDestroyOnLoad 사용시 주의 점

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

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

2016-07-18 19:20:13.190 -----[7263:2394437] -> registered mono modules 0xb2a430
2016-07-18 19:20:16.571 -----[7263:2394437] You've implemented -[<UIApplicationDelegate> application:didReceiveRemoteNotification:fetchCompletionHandler:], but you still need to add "remote-notification" to the list of your supported UIBackgroundModes in your Info.plist.
-> applicationDidFinishLaunching()
-> applicationDidBecomeActive()
Renderer: PowerVR SGX 543
Vendor:   Imagination Technologies
Version:  OpenGL ES 2.0 IMGSGX543-124.1
GLES:     2
GL_OES_depth_texture GL_OES_depth24 GL_OES_element_index_uint GL_OES_fbo_render_mipmap GL_OES_mapbuffer GL_OES_packed_depth_stencil GL_OES_rgb8_rgba8 GL_OES_standard_derivatives GL_OES_texture_float GL_OES_texture_half_float GL_OES_texture_half_float_linear GL_OES_vertex_array_object GL_EXT_blend_minmax GL_EXT_color_buffer_half_float GL_EXT_debug_label GL_EXT_debug_marker GL_EXT_discard_framebuffer GL_EXT_draw_instanced GL_EXT_instanced_arrays GL_EXT_map_buffer_range GL_EXT_occlusion_query_boolean GL_EXT_pvrtc_sRGB GL_EXT_read_format_bgra GL_EXT_separate_shader_objects GL_EXT_shader_framebuffer_fetch GL_EXT_shader_texture_lod GL_EXT_shadow_samplers GL_EXT_sRGB GL_EXT_texture_filter_anisotropic GL_EXT_texture_rg GL_EXT_texture_storage GL_APPLE_clip_distance GL_APPLE_color_buffer_packed_float GL_APPLE_copy_texture_levels GL_APPLE_framebuffer_multisample GL_APPLE_rgb_422 GL_APPLE_sync GL_APPLE_texture_format_BGRA8888 GL_APPLE_texture_max_level GL_APPLE_texture_packed_float GL_IMG_read_format GL_IMG_texture_comp

ression_pvrtc 
OPENGL LOG: Creating OpenGL ES 2.0 graphics device
Initialize engine version: 5.3.5p1 (04596651afa0)
UnloadTime: 11.838958 ms
----- was compiled with optimization - stepping may behave oddly; variables may not be available.

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

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

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


참조

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

댓글 남기기 | cat > 타닥타닥 | tag > ,

댓글 남기기

* 표시된 곳은 반드시 입력해주세요