[Unity] Destory의 비밀과 DestroyImmediate
카테고리: C# + Unity
Destory 함수
유니티에서는 하이어라키(Hierarchy)에 살아있는 GameObject를 스크립트로 삭제하는 방법으로 Destory 함수를 사용한다. 일반적으로 Destory 함수를 사용하면 즉시 제거된다고 생각하기 쉽지만, 사실 지연된 소멸을 통해 해당 함수의 호출이 발생한 시점에서부터 다음 Update 함수가 호출되기 전 사이에 파괴된다.
그래서 흔히 다음과 같은 실수를 하기 쉽다.
foreach (Transform child in GameObject.Find("EMPTYOBJECT").transform) {
GameObject.Destroy(child.gameObject);
}
foreach (Transform child in GameObject.Find("EMPTYOBJECT").transform) {
Debug.Log(child.name);
}
분명 Destory 함수를 통해 자식을 삭제했으므로 아래 foreach 문에서 자식의 이름이 출력되지 않아야하지만, 지연된 소멸을 통해 자식 오브젝트를 파괴하므로 자식의 이름이 출력된다.
따라서, GameObject를 스크립트로 즉시 삭제하려면 DestroyImmediate 함수를 사용하면 된다.
중요한 내용
다만, 공식 문서에서는 아래와 같이 경고하고 있는데 이는 메모리 관리의 관점에서 즉시 해제가 도움이 되지 않기 때문이다. Asset을 DestroyImmediate 함수로 파괴하는 경우가 아니라면 큰 문제는 일어나지 않는다.
You are strongly recommended to use Destroy instead. This function should only be used when writing editor code since the delayed destruction will never be invoked in edit mode. In game code you should use Object.Destroy instead.
Destory를 사용할 것을 강력히 권장합니다. 이 함수는 편집 모드에서는 지연된 소멸이 호출되지 않으므로 편집기 코드를 작성할 때만 사용해야 합니다. 게임 코드에서는 대신 Object.Destroy를 사용해야 합니다.
참고
https://discussions.unity.com/t/destroy-children-seem-not-working/65951
https://blog.fetchinist.com/?p=308
https://docs.unity3d.com/ScriptReference/Object.DestroyImmediate.html