Game Development, 게임개발/개발

Invoke로 인한 문제점 [Unity]

게임이 더 좋아 2021. 4. 8. 20:01
반응형
728x170

 

오브젝트 풀링을 사용할 경우

미리 만들어놓고 끌어다 쓰는 경우다.

물론 비활성화되어있기에 스크립트가 단독으로 실행되는 경우는 없으나

 

나는.. 이것 때문에 2시간 날린듯...

영어로 구글링을 치고 한글로 검색한 끝에 원인을 찾았다.

 

 

 

바로 비활성화되었음에도

메서드가 실행되어서 Null이 뜨는 것...

 

Debug.log(this)로 찾아냈지만 그 오브젝트가 실행되는 이유를 알 수 없었다.

 

아니.. Awake나 OnEnable로 잠깐 활성화된 시간이 있다해도

비활성화되면 꺼져야하는 것 아니냐???

라고 생각했다.

 

하지만 아니었다.

 

활성화 또는 비활성화에 따라서

- OnEnable/OnDisable 이벤트 함수가 호출된다. 

- 게임 오브젝트가 비활성화되면 GameObject.Find 및 GameObject.FindObjectWithTag 등의 함수로는 찾을 수 없다.

- 게임 오브젝트가 비활성화되면 컴포넌트에서 동작하던 코루틴 함수들은 모두 자동으로 종료.

- 물체가 비활성화되면, 컴포넌트들의 실행은 중지되지만 데이터는 언제든지 수정 가능

- Invoke와 Destroy의 시간 지연 명령은 게임 오브젝트가 비활성화되어도 중지되지 않는다.

때문에 내가 OnEnable에서 실행한 메서드가 오브젝트가 비활성화가 되어있음에도 실행이 되었다.

즉.. Invoke 가 내 OnEnable에 있었는데 당연히 꺼질 것이라고 생각하고 있었기에 찾기에 정말 오래걸렸다.

 

 

나는 Prefab을 Instantiate 하는 과정에서 잠깐의 활성화로 인해 일어난 상황이라고 보고

해당 Prefab을 Instantiate할 때부터 Inactive로 했다. 

오류는 해결되었다.

 

오브젝트가 꺼졌다고 모든 스크립트가 중지하는 것은 아니라는 교훈을 얻었다. 2시간짜리

 

 

728x90
반응형
그리드형