[Unity3D] Start와 OnDestroy에서 event 등록 해제 할 때 주의하자

C#의 event를 사용할 때 delegate에 등록을 했으면 반대로 해제를 하는 과정이 필요합니다.

OnClick += OnClickButton;

OnClick -= OnClickButton;

 

그런데 Unity에서 이를 사용할 때 주의해야 할 점이 있습니다.
바로 Start(), OnDestroy() 함수에서 이벤트를 등록하는 것은 위험하다는 점입니다.

Start() 함수는 Object가 생성된 다음번 Update 함수가 호출되기 전에 호출됩니다.
OnDestroy() 함수는 Object가 소멸되기 직전에 호출됩니다.
그래서 Start() 함수에서 이벤트 등록을 하고 OnDestroy() 함수에서 이벤트 해제를 할 수도 있습니다.

여기서 문제는 OnDestroy 입니다.
Object가 생성되자마자 SetActive(false)를 호출 하면 Start 도 호출되지 않지만 그 상태로 Destroy 해버리면 OnDestroy도 호출되지 않습니다.

이렇게 되면 문제가 없지만 Start가 호출된 이후에 SetActive(false)를 호출한 뒤 Destroy를 해버리면 이벤트가 등록은 되지만 해제는 되지 않은 채 Object는 소멸되는 좋지 않은 상황이 발생해 버립니다. 그 상태에서 event가 발생하면 null 객체의 멤버 함수가 호출되는 최악의 상황이 발생합니다. C#인데도 메모리에 잘못접근하는 거 같아 보였어요. ㅠㅠ

이런 문제를 방지하기 위해서 C#의 이벤트를 사용할 때는 OnEnable과 OnDisable을 사용하기를 추천합니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다