로직을 만들다보니 특정 조건일 때 Start() 함수에서 Destroy를 호출할 일이 생겼습니다. 그런데 문득 OnDestroy는 어느 타이밍에 호출되는 것인지 정확히 알고 싶어졌습니다.
그래서 아래와 같은 코드로 테스트를 해봤습니다.
using UnityEngine; using System.Collections; public class Test : MonoBehaviour { // Use this for initialization void Start () { Destroy(gameObject); Debug.Log("Test Start"); } void OnDestroy() { Debug.Log("Test Destroy"); } }
Destroy 함수를 호출하여 Object를 제거하면 즉시 제거되는 것이 아니라 해당 Frame의 마지막에 제거됩니다. 이런식으로 동작하는 것은 복잡한 로직 처리 중 오브젝트가 제거되어 null 참조가 일어나는 일을 줄여줍니다. Destroy 호출하고나서 해당 객체를 참조하는게 잘못된게 아니냐고 볼 수도 있으나 Coroutine이나 Animator등 복잡하게 연계된 로직에서는 null참조를 없애는게 더 힘듧니다.
그러면 OnDestroy는 Destroy 함수를 호출했을 때 호출될지 아니면 실제로 소멸이 일어나는 타이밍에 호출될지 테스트를 해보기 위해서 위와같은 코드를 실행해 보니 콘솔창에 아래와 같이 출력되었습니다.
Test Start
Test Destroy
OnDestroy는 실제로 소멸이 일어나는 타이밍에 객체를 소멸시키기 직전에 호출하는 모양입니다.