지난 시간에 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 해주면 클래스가 만들어진다.
'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 |