-
Unity] JSON 사용해서 데이터 관리하기Unity 2025. 3. 5. 22:37반응형
JSON
정의
- 오브젝트(Object) 정보를 사람이 읽을 수 있는 key, value 형태로 저장해서 전달하는 포멧
- 웹이나 네트워크에서 서버와 클라이언트 사이에 데이터를 주고 받을 때 사용하는 개방형 표준 포맷
- 게임의 진행 상황 및 게임 설정을 저장하거나 네트워크 게임을 개발할 때 필요한 데이터를 주고 받을 때 사용
- 정수, 실수, 문자열, boolean, null 등의 데이터 타입 지원
- 종류
- JsonUtility : Unity에 내장된 JSON 처리 기능. 속도가 빠르지만 제한적인 기능.
- Newtonsoft.Json : JsonUtility에서 잘 지원하지 않는 Dictionary나 List 등 복잡한 데이터 변환 기능을 사용할 수 있음.
장점
- 텍스트 기반이라 크기가 작고 빠름
- 다른 포맷들(XML 등)보다 가독성이 좋으며 key-value 구조로 이해하기 쉬움.
- 다양한 프로그래밍 언어(Python, JavaScript, PHP, Java 등)에서 지원하여 언어 간 데이터 교환이 쉬움.
→ API, 네트워크 통신에 최적 - 파싱(Parsing) 속도가 빠름
단점
- JSON 파일을 작성할 때 문법 오류를 확인하기 어렵다.
→ JSON 검사기 활용 https://kr.piliapp.com/json/validator/ - 지원하는 데이터 타입에 제한이 있음. (Date, Decimal, Binary 등 지원하지 않음)
- 주석 지원하지 않음
- 보안에 취약함
→ 데이터를 암호화 하는 등 추가 조치를 취해야 함 - XML에 비해 확장성 부족 : XML은 네임스페이스, 메타데이터 등을 지원하지만 JSON은 없음.
→ XML은 문서(document) 중심, JSON은 데이터(data) 중심. 데이터 구조가 복잡할 땐 XML이 더 유용 - 바이너리 데이터 저장 어려움 : 텍스트 기반이라 이미지, 오디오, 영상 같은 바이너리 데이터를 직접 저장하기 어려움.
→ 바이너리 데이터를 Base64로 변환하여 저장할 수 있지만 파일 크기가 커짐.
JSON 검사기
JSON 형식의 검증 및 검사 JSON 형식은 널리 웹 개발에 적용된다. JSON 문자열은 항상 네트워크 대역폭 및 문서 크기,하지만 읽기는 너무 열심히하고 디버깅을 저장 빈 공간, 들여 쓰기와 줄 바꿈을
kr.piliapp.com
JSON 사용 하기
- JSON 파일 형식
struct Item { ItemType type; int count = 0; } -------이걸 아래와 같이 작성------- items [ { "ItemType" : type1, "count" : 0 }, { "ItemType" : type2, "count" : 1 } ]
[ ] 는 배열, { } 는 구조체 역할
1. JsonUtility
- JsonUtility는 유니티에 내장되어 있어 바로 사용 가능하다.
- 기본적인 Json 데이터 변환 저장 및 로드
- 참고 : 유튜브 레트로
using System.Collections; using System.Collections.Generic; using UnityEngine; using System.IO; public class PlayerController : MonoBehavior { public PlayerData playerData; //에디터 상에서 드롭 메뉴로 함수 사용 가능 [ContextMenu("To Json Data")] void SavePlayerDataToJson() { //Json 문자열 형태로 변환(직렬화)할 오브젝트를 넣어주면 됨 //true 는 pretty print 기능을 사용할 것인지 체크. 기본값은 false string jsonData = JsonUtility.ToJson(playerData,true); //저장 경로, 더 안전한 경로 설정을 위해 Path.Combine함수 사용. // -> Application.dataPath + "/playerData.json"; 이렇게 써도 괜찮음 //dataPath는 현재 실행중인 유니티 프로젝트 경로가 찍힘 string path = Path.Combine(Application.dataPath,"playerData.json"); //파일 저장 File.WriteAllText(path, jsonData); } //Json Data 가져와서 덮어씌우기 [ContextMenu("From Json Data")] void LoadPlayerDataToJson() { string path = Path.Combine(Application.dataPath, "playerData.json"); //파일 가져오기 string jsonData = File.ReadAllText(path); //역직렬화. 직렬화 데이터를 오브젝트로 복구 playerData = JsonUtility.FromJson<PlayerData>(jsonData); } } [System.Serializable] public class PlayerData { public string name; public int age; public bool isDead; public string[] items; }
- System.Serializable 을 선언해줘야 하는 이유따라서 직렬화 가능하게 해줌으로써 저장 가능한 형태로 바꿔준다. (MonoBehavior 등 이미 직렬화 가능하게 되어 있는 클래스를 상속한다면 안해줘도 된다.)
- 기록 불가능한 오브젝트는 유니티에서 편집이 불가능하다. 즉, 오브젝트가 파일로써 저장 가능한 형태가 아니라면 편집이 불가능 하다.
2. Newtonsoft.Json
- Newtonsoft.Json 플러그인 추가 -> com.unity.nuget.newtonsoft-json
- https://gofogo.tistory.com/64
- 참고 : 인프런 루키스 강의
[unity/json]Newtonsoft Json 라이브러리 손쉽게 추가하는법(package manager 이용)
[unity/json]Newtonsoft Json 라이브러리 손쉽게 추가하는법(package manager 이용) [핵심] com.unity.nuget.newtonsoft-json [windows]->[package manager]로 이동 후 [add pakaage by name...] 선택 com.unity.nuget.newtonsoft-json 를 입력 후
gofogo.tistory.com
using Newtonsoft.Json; using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public interface ILoader<Key, Value> { Dictionary<Key, Value> MakeDict(); } public class DataManager { //데이터 저장할 Dictionary 생성 public Dictionary<int, Data.LevelData> LevelDataDic { get; private set; } = new Dictionary<int, Data.LevelData>(); //JSON 데이터 Dictionary에 넣어주기 public void Init() { //Level Data LevelDataDic = LoadJson<Data.LevelDataLoader, int, Data.LevelData>("LevelData").MakeDict(); } //문자열로 된 JSON 데이터 오브젝트로 변환 (역직렬화) Loader LoadJson<Loader, Key, Value>(string path) where Loader : ILoader<Key, Value> { TextAsset textAsset = Managers.Resource.Load<TextAsset>($"{path}"); //Json Data는 List 형식으로 되어 있으며, Loader 클래스에서 선언한 List 형식으로 역직렬화 된다. return JsonConvert.DeserializeObject<Loader>(textAsset.text); } }
using System; using System.Collections; using System.Collections.Generic; using UnityEngine; namespace Data { [Serializable] public class LevelData { public int Level; public LevelType LevelType; public int NumMoves; public List<Items> Items; public List<Obstacles> Obstacles; } [Serializable] public class LevelDataLoader : ILoader<int, LevelData> { public List<LevelData> levels = new List<LevelData>(); //LevelData(클래스)가 총 List 갯수만큼 있고, LevelData 멤버 변수들을 Dictionary에 넣어 key값으로 찾기 쉽게 설정 public Dictionary<int, LevelData> MakeDict() { Dictionary<int, LevelData> dict = new Dictionary<int, LevelData>(); foreach (LevelData levelData in levels) dict.Add(levelData.Level, levelData); return dict; } } }
{ "levels": [ { "Level": 0, "LevelType": 0, "NumMoves": 0, "Items": [ { "ItemType": 0, "ItemCount": 0 } ], "Obstacles": [ { "ObstacleType": 0, "ObstacleColor": 0, "ObstacleImage": "Blue.sprite", "ObstacleCount": 0 } ] }, { "Level": 1, "LevelType": 0, "NumMoves": 5, "Items": [ { "ItemType": 1, "ItemCount": 0 }, { "ItemType": 2, "ItemCount": 0 } ], "Obstacles": [ { "ObstacleType": 0, "ObstacleColor": 0, "ObstacleImage": "Blue.sprite", "ObstacleCount": 0 } ] } ] }
더보기더보기더보기참고 자료
https://www.youtube.com/watch?v=abwOVy5qTO4&list=PLctzObGsrjfxmVK8KnId904m-6RV6amKr&index=3
https://www.youtube.com/watch?v=N9r2ju3xJGk
[라이브 멘토링] 유니티 뱀파이어 서바이벌 장르 모작 강의 | Rookiss - 인프런
Rookiss | , 게임 개발 과정 중 생긴 질문을 맘껏 물어보면서어려운 부분을 하나씩 배워나가요! (feat. 뱀파이어 서바이벌 게임) [사진] [사진] 당장 만들어보고 싶은 게임이 딱히 없어요. [사진] 방
www.inflearn.com
반응형'Unity' 카테고리의 다른 글
Unity] Addressables 사용하기 (0) 2025.02.24 Unity] Unity Shader Graph 사용해보기 (1) 2024.12.16 Unity] 색을 숫자로 표현하기, 빛의 삼원색 (1) 2024.12.13 Unity] 모바일광고 넣기 - 1: Google AD 사용하기 (4) 2024.12.12 Unity] Rendering Pipeline : 렌더링 순서 (0) 2024.12.06