Unity & C#

[유니티] Destroy() vs. DestoryImmediate() 차이점은?

왼손잡이개발자 2022. 7. 7. 13:00

유니티 개발하면서 오브젝트를 제거할 때 보통 Destroy() 함수를 사용하는데요. 그런데 DestroyImmediate()라는 녀석도 있습니다. 영어 해석을 해보면 "지금 당장 삭제해!" 가 될텐데요. Destroy() 와 DestroyImmediate()의 차이점을 알고 계신가요?

 

구글링을 해보니 이렇게 나오네요 

  • Destroy() will set the object to null at the end of the frame and whereas DestroyImmediate() function immediately set object reference to null
    (참고)

 Destroy() 는 프레임 제일 끝에서 null을 만들지만 DestroyImmedaite()는 바로 null을 만들어버린다. 보다 잘 이해하기 위해서 유니티에서 스크립트를 작성해서 확인해보겠습니다.

 

씬 배치는 다음과 같이 했습니다

Destroyer와 ObjToBeDestroyed 라는 두 오브젝트가 있고, Destroyer 오브젝트엔 Destroyer.cs 컴포넌트가 붙어있습니다.

스크립트를 통해서 Destoryer가 ObjToBeDestroyed 오브젝트를 두가지 방법 (Destroy() vs. DestroyImmediate())으로 제거하는 코드를 작성했습니다. 

두 가지 방법으로 Destroy를 한 후에 Debug.log로 Destroy한 오브젝트의 이름을 출력하게 해봤는데요. 두가지 Destroy 방법을 각각 테스트 해본 결과, 일반적으로 사용하는 Destroy() 로는 정상적으로 objToBeDestroyed.name이 잘 출력이 되었고, DestroyImmedate() 로는 MissingReference 에러가 떴습니다. (아래 스크린샷 참고)

DestroyImmedate()을 한 후 곧 바로 name을 출력하려고 했을 때

 

구글링 했던 내용대로, Destroy() 를 했을 때엔 Frame의 제일 마지막에 해당 오브젝트를 제거하기 때문에 Destroy() 함수 호출 이후에 바로 name을 출력해도 잘 출력되었고, DestroyImmediate()은 호출되는 순간 바로 제거해버리기 때문에 다음 라인에 작성된 objToBeDestroyed 가 null 로 표시되는 것을 확인 할 수 있었습니다.