Unity

Json이란? - Unity JsonUtility

MuscleDeveloper5683 2025. 3. 12. 16:45
728x90
SMALL

 

지난 시간에 Json의 기본정의와 NewTonSoft Json을 통해 데이터를 저장하고 불러오는 과정을 했다.

 

그런데 NewTonSoft Json은 모노비헤이비어를 상속받는 클래스의 오브젝트를 Json 데이터로 직렬화(시리얼라이즈) 할 수 없다.

  • MonoBehaviour는 Unity 엔진 내부에서 관리하는 특별한 클래스라서 직렬화가 지원되지 않음.
  • Unity의 GameObject, Transform, Component 등도 직렬화 대상이 될 수 없음.

 

스크립트가 가지고 있는 프로퍼티 중에서 필요한 프로퍼티를 클래스로 묶어서 해당 클래스만 시리얼 라이즈 하거나 Unity JsonUtility를 사용해야 한다.

 

 

✅ Unity JsonUtility

  • 유니티 엔진에서 제공하는 가벼운 JSON 변환 기능.
  • MonoBehaviour나 ScriptableObject 같은 Unity 관련 객체 직렬화 가능.
  • 매우 빠름 (C++ 레벨에서 동작하기 때문).
  • 구조체(Struct), 클래스를 JSON으로 변환할 때 속도가 빠름.
  • Dictionary나 List<> 같은 복잡한 구조는 지원하지 않음.
  • JSON 필드명이 public 변수와 정확히 일치해야 직렬화됨 (유연성이 낮음).

 

 

[Unity JsonUtility] Vs [Newtonsoft.Json]

 

  Unity JsonUtility Newtonsoft.Json
성능 ✅ 빠름 (C++ 네이티브 ❌ 상대적으로 느림
유연성 ❌ 제한적 (public 변수만 가능) ✅ 유연함 (Dictionary, List, private 변수 지원)
JSON 복잡성 ❌ 단순한 구조만 가능 ✅ 복잡한 JSON 처리 가능
Unity 연동 ✅ Unity 객체 (MonoBehaviour, ScriptableObject)와 자연스럽게 연동 ❌ Unity 전용은 아님
필요한 경우 빠르고 단순한 데이터 변환 복잡한 JSON, API 응답 처리, Dictionary 사용

 

 

 

JsonUtilty를 사용

 

1. 스크립트 생성 및 호출

 

JsonUtilityExample.cs

 

 

 

⚠️ 단점 - 기본적인 데이터 타입과 배열, 리스트만 지원 

로그를 보면 딕셔너리와 직접 생성한 클래스는 보이지 않는다!

 

아래와 같이 [System.Serializable] 어트리뷰트를 붙여줘야 Json 데이터로 변환된다.

 

 

 

결과

 

 

 

 

Vector3의 좌표값 Json화 하기

 

예시 - 플레이어의 마지막 위치, 보스몬스터의 위치 저장등..

 

 

NewtonSoftJson을 사용했을 때 아래와 같은 에러가 나온다.

 

⚠️ 문제 발생 이유 ⚠️

  • Vector3 구조체에는 normalized라는 프로퍼티가 있음.
  • normalized는 새로운 Vector3을 반환하는 프로퍼티인데, 이를 JSON으로 직렬화하려고 하면 내부적으로 또 normalized를 참조하는 무한 참조(loop)가 발생함.
  • JsonConvert는 기본적으로 순환 참조(self-referencing loop)를 방지하기 위해 예외를 던짐.

 

 

JsonUtility를 사용했을 때

 

 

 

모노비헤이비어를 상속받는 클래스의 경우

 

 

 

 

 

직렬화 - JsonData로 변환되지만 

역직렬화 - 오브젝트로 변환이 되지 않는다. 

 

이유 

  • JsonUtility는 MonoBehaviour를 가진 객체를 역직렬화할 때, 새로운 GameObject에 컴포넌트를 자동으로 추가하지 않음
  • 따라서 NewtonsoftTestMono를 FromJson으로 변환하려고 해도, MonoBehaviour는 new로 생성할 수 없으므로 실패함

 

해결방법

 

새 객체를 만들지 않고, 기존 객체의 필드 값을 JSON 데이터로 덮어쓰는 - FromJsonOverWrite를 사용하자.

 

 

 

 

JsonData 파일로 저장하기

 

 

1. 경로를 저장하고 불러올 스크립트 생성 (JsonFileManager.cs)

 

 

 

  • Application.dataPath: Unity의 Assets 폴더 위치 프로젝트 내에서 파일을 참조하거나 저장하는 데 사용된다.
  • Application.persistentDataPath: 게임의 데이터를 저장하는 경로.이는 실제 게임에서 사용되는 데이터를 저장하는 경로로, 유저의 기기에서 Documents나 AppData 폴더 안에 위치한다.

 

 

  • SaveJson(PlayerDataJson data) : PlayerDataJson 객체를 JSON 문자열로 변환한 후, 이를 지정된 경로에 파일로 저장한다.
  • LoadJson() : 지정된 경로에서 JSON 파일을 읽어온다. 파일이 존재하면 파일 내용을 읽어 PlayerDataJson 객체로 역직렬화하여 반환한다. 파일이 없으면 기본값을 가진 새로운 PlayerDataJson 객체를 반환한다.

 

JSON 파일 처리:

  • 저장: SaveJson() 메서드는 JsonUtility.ToJson()을 사용하여 데이터를 JSON 문자열로 변환한 뒤, File.WriteAllText()를 사용해 파일에 저장한다.
  • 불러오기: LoadJson() 메서드는 File.ReadAllText()로 JSON 파일을 읽고, JsonUtility.FromJson<T>()를 사용하여 읽은 JSON 데이터를 PlayerDataJson 객체로 변환한다.

 

 

 

 

결과

 

 

 

 

번외

 

쉽게 Json 데이터를 C# 클래스로 만들기

 

Google -> JSon 2 C Sharp 검색 

 

아래와 같이 Json 데이터를 Convert 해주면 클래스가 만들어진다.

 

 

 

728x90

'Unity' 카테고리의 다른 글

[Unity] - Text Mesh Pro (다국어화)  (0) 2025.03.25
Json이란? - NewTonSoft Json  (1) 2025.03.10
[Unity] - PlayerPrefs란?  (0) 2025.03.04
[UI] - Cnavas Render Mode  (0) 2025.02.04
[Unity] - Text Mesh Pro  (0) 2024.07.20