[Unity] Destroy에 대한 짧은 글
댓글 0
댓글을 작성하려면 로그인이 필요합니다.
아직 댓글이 없습니다. 첫 번째 댓글을 작성해보세요!
Destroy(obj)는 익숙하나, 그 내부 동작에 대해서는 모르고 있었다. 예전에 Fake Null문제가 터지고 나서야 엔진 내부를 살펴볼 필요가 있다 느꼈고, 그렇게 이 시리즈가 시작되었다. 시리즈의 8장인 이 글에서는 UnityEngine.Object의 이중 구조에 대해 다루려고 했으나, 지금까지와 겹치는 내용이 많아서 바로 Destroy에 대해 다루게 되었다. 다음장은 FakeNull문제를 다루며, 아마도 시리즈의 끝이 될 것이다.
UnityEngine.Object는 GameObject, Component, Transform, MeshRenderer, ..., MonoBehaviour, SO 등 우리가 유니티로부터 제공받은 많은 타입들의 부모클래스로, 이 UnityEngine.Object는 다시 System.Object를 상속받는 구조로 되어있다.
UnityEngine.Object는 필드로 m_CachedPtr을 갖는데, 이는 IntPtr 타입으로 NativeObject가 저장된 위치를 가리키는 주소값이다. icall 등으로 interop할 때 이 값을 통해 Native에 접근한다.
Destroy Destroys시리즈를 꾸준히 읽었다면, 여기서 Destroy에 대해 언급하는 것에 대해 느껴지는 바가 있을 듯하다. 예상대로, 이녀석도 사실 icall이다. 그리고 그말인 즉, 이 함수가 파괴하는 것은 NativeObject이지 Managed Object가 아니라는 뜻이다(지금까지 다뤘듯이, 우리는 Managed Object를 직접 파괴할 수 없다. 이는 GC의 역할이기 때문이다.)
추가로, Destroy가 파괴한 GameObject에 부착된 컴포넌트들도 마찬가지로 Destroy된다.
Destroy는 이 함수가 실행된 프레임이 종료될 때 실제로 Native 객체를 파괴한다(DestroyImmediate는 이 시점을 앞당길 뿐이다). 그리고 그와 동시에, 이 객체를 가리키던 Wrapper의 m_CachedPtr은 IntPtr.Zero로 초기화한다.
obj == null을 통한 검사에서, 비교연산자의 출처는 UnityEngine.Object임을 확인할 수 있을 것이다. 이는 연산자를 오버로딩하였음을 의미한다. 새로운 == 연산자는 m_CachedPtr이 IntPtr.Zero인지의 여부도 검사한다.
생각보다 이전 글들에서 다룬 게 많아 슬슬 쓸게 없다. 근데 다음 글은 좀 길듯
![[Unity] 렌더 큐](https://data.develog.develrocket.com/upload/develog/user_1777093328305/1785158340538-3i4lkp/_____2026-07-27_215606.png)
유니티 렌더 큐
타워 디펜스에 타워 합성 시스템 구현
![[Unity] 피벗은 뭐고 앵커는 머요](https://data.develog.develrocket.com/upload/develog/user_1776858831954/1784966048688-1uin6m/image.png)
네모들의 위치를 피벗과 앵커로 설명하시오
![[Unity] 렌더 큐](https://data.develog.develrocket.com/upload/develog/user_1777093328305/1785158340538-3i4lkp/_____2026-07-27_215606.png)
![[Unity] 피벗은 뭐고 앵커는 머요](https://data.develog.develrocket.com/upload/develog/user_1776858831954/1784966048688-1uin6m/image.png)