Ssssong += Dev

[유니티] Destroy / DestroyImmediate 본문

카테고리 없음

[유니티] Destroy / DestroyImmediate

ssong_dev 2022. 11. 16. 12:45

https://blog.fetchinist.com/?p=308 

 

fetchinist blog

2013/05/31 Destroy와 DestroyImmediate 유니티 2버전부터 지금까지 쓰면서 설명 대충 보고 쓰다가 잘못 알고 있는 걸 이번에 제대로 알게 돼서 적어둡니다. 먼저 함수 설명을 봅시다. +2022.7.24 – 최신 내용

blog.fetchinist.com

 

유니티 Editor에서는 Destroy()를 사용할 수 없다.

이유는 Destroy()가 지연 파괴이기 때문이다. public static void Destroy(Object obj, float t = 0.0f); 에서

t에 시간을 넣을 시 해당 시간만큼 파괴가 지연되고

시간값을 설정하지 않더라도 Destroy()로 파괴 명령을 한 객체는 해당  Update 루프가 끝날 때 까지 살아있게 된다.

따라서 Update가 돌지 않는 편집기에서는 Destroy() 대신 DestroyImmediate를 사용해야 한다.

 

반대로 Editor가 아닌 게임 코드에서는 Destory()를 사용해야 한다.

이 함수는 Asset를 영구적으로 파괴할 수 있으므로 주의해야 한다.

또한 절대로 배열을 돌면서 돌고 있는 배열 요소를 파괴해서는 안된다.

배열이 있다고 해서 배열을 도는 도중 배열 요소를 지워버리면 반복문은 남은 횟수를 마저 돌아도

매열은 요소가 줄어 아예 다른 주소를 참조하거나 잘못된 주소를 참조하게 되어 예외가 발생간다.

 

*DestroyImmediate 사용 시 주의해야 할 점은 asset이 영구 파괴될 수 있다는 점이다.

 

Asset 파괴 가능 유무 또한 다르다. 

DestroyImmediate(Object, true) 로 파괴하면 파일이 삭제되지만 물리디스크에서 삭제되는 것은 아니다. << ?

 

사용하지 않는 Asset을 메모리에서 내리기(해제하기) 위한 것이라면

Resource.UnloadAsset을 사용해 직접 내리거나 Resources.UnloadUnusedAssets을 사용해서 사용하지 않는 Asset 모두를 내리면 된다.