Unity에서 JsonUtility 사용

이준영·2025년 11월 13일

JsonUtility

  • JSON 형식의 데이터를 오브젝트로 변환하거나 오브젝트를 JSON 문자열로 변환하는 데 사용할 수 있는 유니티 내장 기능.

  • 자체 기능이라 설치가 필요 없음.

사용 예시

Test Data
  • 테스트 데이터용 클래스이다.

직렬화

DataSerializer
  • Object -> Json으로 바꾸는 클래스이다.
Test
  • 데이터를 확인해보면, dictionary와 내가 정의한 IntVector2 클래스가 직렬화 되지 않았다.
  • dictionary는 외부 라이브러리를 찾아보면 직렬화 가능한 dictionary 클래스를 찾거나 직접 정의해야 한다.
  • 직접 정의한 클래스의 경우에는 Serializable 어트리뷰트를 이용하면 직렬화 가능하다.
Serializable 어트리뷰트 Test
  • v2가 포함된 모습이다.

역직렬화

DataDeserializer
  • Json -> Object으로 바꾸는 클래스이다.
Test
  • 여기서 확인해보면 직렬화 하면서 사라진 dictionary가 다시 생성된 모습을 확인할 수 있었다.
  • 원인을 찾아보니 생성자에서 데이터를 초기화 해주고 있기 때문에 없는 데이터를 다시 넣는 걸로 확인이 되었다.
새로운 Test
  • 직렬화 불가능한 Dictionary는 데이터가 초기화된 모습이다.
  • 직렬화 가능하게 바꾼 IntVector2는 바꾼 데이터 그대로 유지되는 모습이다.

Vector3 직렬화

ErrorTest
  • 테스트를 위한 데이터
Test
  • Newtonsoft Json에서 normalized 순환구조로 인해 오류뜨던 모습과 달리, 직렬화에 성공.

MonoBehaviour 상속 받은 클래스 직렬화

ErrorTest
  • 테스트를 위한 데이터
Test
  • Newtonsoft Json에서 gameObject 순환구조로 인해 오류뜨던 모습과 달리, 직렬화에 성공.

MonoBehaviour 상속 받은 클래스 역직렬화

Test
  • MonoBehaviour 상속 받은 클래스를 역직렬화 할 때에는 FromJsonOverwrite를 사용.

장점

  1. 성능 : Unity의 내부 직렬화 시스템을 기반으로 작동하기 때문에 매우 빠름. 특히 모바일 환경이나 대량의 데이터를 빈번하게 처리해야 하는 경우 성능 이점이 두드러짐.

  2. 통합 : Unity에 내장되어 있어 별도의 패키지 설치나 임포트가 필요 없음. UnityEngine 네임스페이스에 속해 있어 접근성이 좋음.

  3. 경량 : 외부 종속성 없이 코드 베이스가 가볍고 컴파일 시간이 빠름.

  4. Unity 타입 지원: Vector3, Quaternion, Color, Rect 등 Unity의 핵심 구조체를 완벽하게 지원하며 추가적인 설정이 필요 없음.

단점

  1. 타입 지원 제한:

    • 딕셔너리 (Dictionary<TKey, TValue>) 타입을 직접 직렬화/역직렬화할 수 없음.

    • 최상위 배열/리스트 (List 또는 T[])를 직접 처리할 수 없으며, 컨테이너 클래스로 감싸야 함,

    • 사용자 정의 인터페이스(interface)나 추상 클래스(abstract class)를 지원하지 않음.

  2. 필드 제한: 속성(Property)을 직렬화하지 못하고, 오직 public 필드나 [SerializeField]가 붙은 private 필드만 처리할 수 있음.

  3. 유연성 부족:

    • JSON 포맷을 커스터마이징할 수 있는 옵션이 거의 없음. (예: 필드 이름 변경, 특정 필드 무시 등).

    • JSON 문자열에 필드가 누락되었을 때 기본값을 설정하는 기능이 제한적임.

    • 컨트롤 불가: 역직렬화 시 new T()와 같이 생성자가 강제로 호출되어 초기화 로직이 원치 않게 실행될 수 있음. (외부 라이브러리는 일반적으로 생성자를 우회.)

profile
게임 개발자가 되기 위해서 공부하는 중입니다.

0개의 댓글