[SerializeField]
[SerializeField]는 유니티의 특수한 속성으로, private이나 protected 필드도 유니티의 인스펙터 창에서 표시되도록 해준다.
- 일반적으로 유니티 인스펙터는 public 필드만 보여주지만 [SerializeField]를 사용하면 private 필드도 인스펙터에서 수정할 수 있게 됨
[SerializeField] private float delay = 1f;
public float Delay { get => delay; set => delay = value; }
- 이런식으로 [SerializeField]를 쓰면 private으로 선언되어 있지만 유니티의 인스펙터 창에서 값을 볼 수 있고 수정도 가능하다.
[SerializeField]를 사용하는 이유
- 캡슐화 유지
- 변수는 private로 유지하면서 외부에서 값을 직접 수정하지 않도록 하고 싶을 때 유용함
- 값을 인스펙터에서만 수정할 수 있도록 하여 외부 코드에서 불필요하게 값을 변경하지 않게 할 수 있음
- 유니티의 인스펙터에서 값 수정
- 인스펙터에서 직접 값을 수정할 수 있기 때문에 코드에서 접근할 필요 없이 디자인 타임에 유용하게 사용할 수 있음
- 디버깅과 최적화
- 디버깅을 쉽게 하고, 최적화에 도움을 주는 데 유용함.
- 예를 들어 게임의 설정값이나 초기화 값 등을 인스펙터에서 쉽게 조정할 수 있음
[SerializeField]와 public의 차이점
| public | [SerializeField] |
|---|
| 필드는 외부 코드에서 접근할 수 있음 | 필드는 외부 코드에서 접근할 수 없음 (private) |
| 인스펙터에서 값을 수정할 수 있음 | 인스펙터에서 값을 수정할 수 있음 |
| 보안에 취약할 수 있음 | 캡슐화 유지, 외부 코드에서 값 수정 방지 |
[Header]는 유니티의 커스텀 속성 중 하나로, 인스펙터 창에서 해당 필드들을 그룹화하고 헤더를 추가해 시각적으로 구분할 수 있게 해줌.
- 주로 인스펙터의 필드들을 그룹화하려는 목적에 사용된다.
[Header ("Attack Info")]
[SerializeField] private float delay = 1f;
public float Delay { get => delay; set => delay = value; }
[SerializeField] private float weaponSize = 1f;
public float WeaponSize { get => weaponSize; set => weaponSize = value; }
- 이렇게 하면 "Attack Info"라는 제목이 유니티 인스펙터에 표시되고, 그 아래에 attackPower와 attackSpeed 같은 필드들이 그룹화되어 나온다.
-------------------------
| Attack Info | <-- Header 표시됨
-------------------------
| Attack Delay: 1f |
| Attack WeaponSize: 1f |
-------------------------
- 이런 식으로 헤더가 표시됨
- 이렇게 그룹을 나누면 필드들을 보다 쉽게 구분할 수 있다.
기타 비슷한 속성들
[Tooltip("Description")] : 해당 필드에 마우스를 올렸을 때 툴팁을 띄워서 설명을 추가할 수 있음
[Range(min, max)] : 범위를 지정하여 인스펙터에서 슬라이더로 값을 조정할 수 있게 함
[Space] : 두 필드 사이에 공간을 추가하여 시각적으로 구분함