Unity - 비교 연산자

https://blogs.unity3d.com/2014/05/16/custom-operator-should-we-keep-it/


읽어두면 좋은 내용.

C++ 백엔드 시스템에서 C# 을 동시에 사용하는 유니티 특징상, GameObject 처럼 c# wrapper 객체가 c++ 객체를 참조하고 있는 경우가 존재한다.

 따라서

1
if (myGameObject == null) {}

 위 코드의 == 연산자는 생각보다 복잡한 의미를 가진다.

 c#의 wrapper 객체는 c#의 생명주기를 따르며 gc가 관리하게 되지만, wrapper 객체가 참조하는 c++객체는 c++의 생명주기를 따른다. -> c++ 객체가 파괴되어도 gc가 미처 수거하지 못한 c# 객체는 null값을 참조하며 존재할 수 있다.

 이 경우, == 연산자로 널값과 비교를 하면 true를 반환한다고 한다. c# 객체는 사실 진짜 null이 아닌데 말이다.

== 연산자로 null 비교를 하면 요런 특징이 있는데
- 비직관적
- UnityEngine.Objects 를 서로 비교하거나 null과 비교하는 것은 생각보다 비용이 비쌈
- thread safe 보장하지 않음
- ?? 연산자와는 모순된게 작동한다. 다만 ?? 쪽은 순수하게 C# null 값을 체크

 결론적으로는 
if(myObject.destroyed) {} // myObject가 파괴된 object를 가리키는지 확인
와 같은 == 연산자를 대체할 방법도 있으니 충분히 고려해 볼것.

댓글

이 블로그의 인기 게시물

Unity - Dialogue 시스템을 구현할 때 유용한 무료 에셋

Unity - 메타 파일

Unity - 라이브러리 폴더