원래는 C#에서의 문제이지만 유니티에서 주로 C#을 사용하니 이쪽에 적어둡니다.
예전에 유니티로 처음 작업했을 때도 겪었던 문제인데 C#의 프로퍼티 기능을 처음 써보면서 생겼던 문제입니다.
프로퍼티는 set, get 함수를 자동으로 만들어주는 C#의 편리한 기능인데 보통 아래와 같은 형태입니다.
public int Index
{
get;
set;
}
일반적으론 이렇지만 set, get, 함수는 확장할 수 있습니다.
private int _Index;
public int Index
{
get
{
return _Index;
}
set
{
_Index = value;
}
}
그런데 여기서 중요한 게..
private int _Index;
public int Index
{
get
{
return Index; // 이 부분
}
set
{
_Index = value;
}
}
주석한 부분에서 엄청난 문제가 발생할 수 있습니다. 차이점은 private 변수로 선언한 _Index
을 리턴하는 것이 아닌 프로퍼티 Index 자신을 리턴 시키는 것입니다.
만약 위와 같이 한다면 실제로 동작하는 것은 Inddex를 리턴하려고 Index의 get을 호출하고 그 get안에서 다시 Index을 리턴하려 하고 하니 get 호출되는 무한 루프가 되어버립니다.
컴파일에서는 해당사항은 잡히지가 않습니다. 그래서 유니티상에서 실행할 때는 멀쩡하게 잘되는 상황이 되고 저 코드를 호출했을 경우 크래시 리포트가 남지 않는 형태로 앱 또는 에디터가 다운되어버립니다. 로그 한 줄도 남지 않죠..
저는 해당 에러로 이틀을 소모했습니다. 이틀이나 걸린 이유는 이전에 작업한 코드를 다른 프로젝트에 다시 작업하게 되면서 해당 부분을 리팩터링 하다가 실수를 저지른 것이었죠. 아마 저 부분만 작업했다면 원인은 금방 파악했을거예요
이런 에러 사항이 있었다고 기억하고자 기록차 남깁니다.
반응형
'Engine > Unity3D' 카테고리의 다른 글
[Mac] MacOS Catalina Unitypackage Zip 파일 해제가 이상할 때 (0) | 2019.10.19 |
---|---|
무한루프시 for문과 while문의 차이 (0) | 2019.07.19 |
Inspector의 값을 유지한 상태로 변수명 변경하는 방법 (0) | 2019.07.04 |
[Webinar] DOTS(데이터 지향 기술 스택) 설명 영상 (0) | 2019.06.26 |
Unity Editor 스크립트 변경시 컴파일 방식 설정하기 (0) | 2019.06.23 |