본문 바로가기
Unity/C# Script

유니티 C# Script에서 Null Conditional Operator

by Pretty Garbage 2020. 8. 4.

C# 6.0 에서 Null 체크 연산자가 추가되었습니다.

 

최신 언어들에서 자주 볼 수 있는 이 연산자는

//예를 들자면
if(current == null)
	current = gameObject;
current.Start();

//를 아래와 같이 연산 가능하도록 해줍니다.
current?.Start();

IDE에서 삼항연산자나 널처리 문을 쓰면 가끔 저렇게 변환시켜주는데 유니티에서는 아직 제대로 지원이되지 않고 있습니다.

 

클래스나 변수의 값들을 상대로 사용할 때는 사용이 가능하지만

using UnityEngine.Object 즉, 게임오브젝트 상대로 사용하게 되면 Unssigned Reference Exception이 뜨게 됩니다.

이는 유니티에서 ?. 이나 ?? 연산자에 대한 오버로딩 처리를 안해서 그런 것인데 아래의 블로그를 읽어보면 유니티의 == 연산자는 커스텀이 된 연산자인 것 같습니다. 그래서 널처리 비용이 꽤 비싸다는 내용이 주를 이루네요.

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

 

Custom == operator, should we keep it? - Unity Technologies Blog

When you do this in Unity: [crayon-5f28fc5f50baa503702532/] Unity does something special with the == operator. Instead of what most people would expect, ...

blogs.unity3d.com

오래된 내용이지만 이 부분은 아직까지도 수정되지 않는 것 같습니다. 

UnityEngine.Object에 관련된 내용이 아니면 사용이 가능하니 필요에 따라 사용하시면 될 것 같습니다.

 

추가로 유니티에서 == null을 쓰지말라는 사람들의 이야기인데 제가 직접설명하는 것보단 참고하시는 것이 더 좋은 것 같아 아래의 블로그 내용도 링크겁니다. (위 블로그도 쓰지말란 이야기네요.)

https://jacx.net/2015/11/20/dont-use-equals-null-on-unity-objects.html

 

Don’t Use == null On Unity Objects

Don’t use if (obj != null) on a GameObject, Texture2D, Sprite, or any other UnityEngine.Object without understanding when obj == null doesn’t mean obj is acctually null.

jacx.net

 

간단히 요약하자면 게임오브젝트는 Cpp를 C#으로 래핑한 녀석이기 때문에 실제로 없어졌다고 퉁치는(Fake Null)이기 때문에 gameObject == null 로 조건부 코드를 짜게 되면 유니티 엔진에서는 'null'로서 살아 있는 현상을 발견할 수 있다고 합니다.

 

** 잘못된 정보가 있으면 댓글로 부탁드립니다.

'Unity > C# Script' 카테고리의 다른 글

GameObject의 각속도 구하기  (6) 2020.08.05
UnityEvent  (0) 2020.01.17
C#의 Static  (0) 2018.05.16