Unity 공부 - Property와 SerializeField

mingu Lee·2025년 3월 17일

Unity 공부

목록 보기
2/5

오늘 게임 개발을 하다가 새로 알게 된 것이 있어서 이렇게 글로 남겨보려한다.

먼저 상황을 설명하자면, Player가 여러 종류의 Coin Object를 먹으면 점수가 올라가려는 기능을 만들려고 했다.

이를 위해 Coin Object에 Script를 추가했고, Coin 종류마다 얻을 수 있는 점수를 Inspector 창에서 직접 설정하기 위해 'SerializeField'가 적용된 Score 변수를 하나 선언했다.

단순 값이기 때문에 함수를 만들어서 return 하는 것보다는 읽기 전용 속성으로 만드는 것이 더 효율적이라 판단하여 아래와 같은 코드를 작성했다.

[SerializeField]
public int Score { get; private set; }

근데 이렇게 작성하고 Inspector 창을 확인해보니 Score 값이 안 보이는 것이 아닌가?

나는 아직 Unity를 개발한지 얼마 되지 않아서 속성에 대해 잘 모르는 상태인지라 내가 사용한 방식이 잘못 되었다고 생각하여 해당 문제에 대해 검색을 해보았다.

이것저것 찾아보다가 한 가지 사실을 알게 되었다.

자동 구현 속성(Auto-Property)을 사용하면 C# 컴파일러가 내부적으로 백킹 필드를 자동으로 생성한다고 한다.

예를 들어, 내가 코드를 public int MyValue { get; set; }처럼 작성하면 컴파일 시 내부적으로 아래와 비슷한 형태로 동작한다고 한다.

private int _myValue;

public int MyValue
{
    get { return _myValue; }
    set { _myValue = value; }
}

여기서 _myValue가 자동으로 생성된 백킹 필드이다.

즉, 아까 위에서 내가 작성한

[SerializeField]
public int Score { get; private set; }

이 코드는 백킹 필드에 SerializeField를 한게 아닌 속성 Score에 SerializeField를 한 것이고, 속성은 Unity의 직렬화 대상이 아니기 때문에 Inspector에 표시되지 않았던 것이다.

그렇다면 이를 어떻게 해결하냐?

그것은 바로 [field: SerializeField]를 사용하는 것이다.

이것은 Auto-Property의 백킹 필드를 대상으로 SerializeField를 적용한다는 뜻이다.

예를 들자면

[field: SerializeField]
public int Score { get; set; }

위 코드는 아래와 같다.

[SerializeField]
private int score; // 백킹 필드라고 가정

public int Score
{
    get { return score; }
    set { score = value; }
}

위와 같이 동작한다고 보면 된다.

따라서, 속성으로 사용하면서 Inspector 창에서 값을 조절해야하는 일이 있다면 [field: SerializeField]를 사용하면 된다.

profile
Github: https://github.com/dlalsrn

0개의 댓글