-
json 응용유니티/유니티 메인 2024. 2. 14. 15:47
변하는 데이터 : Info.cs
사용자에 의해 값이 변하는 데이터
ex) 무기의 공격력, 유저의 캐릭터 레벨
변하지 않는 데이터 : Data - 엑셀에서 데이터를 관리
ex)밸런스 데이터, 게임에서 설정되어 있는 데이터
------------------------------------------------------------------이 변하지 않는 Data를 json으로 가공하려한다. json에 대한 설명은 아래 링크에 상세히 적혀있다
변하지 않는 데이터 값을 엑셀에 적어주어 복사한뒤
Mr.Data Converter라는 사이트에 붙여넣어 json 형식으로 변형된 결과물을 복사한다
그리고 그 복사한 결과물을 Online JSON Viewer and Formatter 사이트에 들어가 다시 붙여준다
붙여넣은뒤 Format 버튼을 누르면 좀 더 보기 쉽게 칸을 벌려주고, 그 중 맨위에 있는 불필요한 자료형들은 지워준다
그리고 Viewer에 들어가면 성공적으로 작성된것을 확인할 수 있다
그렇게 완성된 json파일을 메모장에 붙여넣은뒤 다른 이름으로 저장한다
여기서 주의할 점은 저장시 무조건 파일 형식은 모든파일, 파일이름 뒤에 확장자로 .json, 인코딩으로는 UTF-8을 선택하고 저장을 눌러준다
그리고 만들어진 json 형식 파일을 Asset에 "Resources" 폴더를 만들어준뒤 넣어준다
여기서 중요한건 폴더 이름이 무조건 Resources 여야한다. 무조건이다
using Newtonsoft.Json; using System.Collections; using System.Collections.Generic; using UnityEngine; public class Test8Main2 : MonoBehaviour { void Start() { //TextAsset로드 var asset = Resources.Load<TextAsset>("Weapon_Data"); //JSON문자열 가져오기 string json = asset.text; //출력 하기 Debug.Log(json); } }
그리고 스크립트를 짜주자.
var asset = Resources.Load<TextAsset>("Weapon_Data");
var 형식 asset은 Resources 폴더에서 TextAsset 형식으로 있는 Weapon_Data라는 파일을 값으로 넣는다
string json = asset.text;
string식 json이라는 변수에 TextAsset의 문자열 내용을 값으로 넣는다 (json 문자열)
여기서 중요한건 json 형식으로 파일을 만들었는데 왜 여기서는 TextAsset 형식으로 인식하는걸까?
json이건 텍스트건, 이미지건 어떤 파일이든 유니티에 들어가면 자동으로 유니티에 맞춰 변환이 된다
Inspector 창에 보면 파일의 이름 옆에 파일형식이 Text Asset으로 만들어진것을 볼 수 있다
또 다른 예를 들어 status_icon_star을 보자. 분명 원본은 png 형식이지만 유니티에서는 Sprite로 변환되있다
public class Test8Main2 : MonoBehaviour { void Start() { //TextAsset로드 var asset = Resources.Load<TextAsset>("Weapon_Data"); //JSON문자열 가져오기 string json = asset.text; //출력 하기 Debug.Log(json); //역직렬화 WeaponData data = JsonConvert.DeserializeObject<WeaponData>(json); Debug.LogFormat("=> {0}, {1}", data.id, data.name); } }
좀 더 코드를 추가하여 역직렬화까지 짜보자. 당연히 json파일을 일반 클래스로 변환해야 하기 때문에 역직렬화가 필요
WeaponData 형식의 data는 WeaponData를 json 형식으로 역직렬화한 값을 가진다
하지만 data.id, data.name 부분에 빨간줄이 그이는것을 볼 수 있다
원본파일인 Weapon_Data 형식에 맞춰 데이터들을 지정하지 않았기 때문이다
public class WeaponData { public int id; public string name; public string damage; }
클래스를 하나 더 만들어 데이터를 지정해주면 정상적으로 실행이 되는것을 알 수 있다
public class Test8Main2 : MonoBehaviour { void Start() { //TextAsset로드 var asset = Resources.Load<TextAsset>("Weapon_Data"); //JSON문자열 가져오기 string json = asset.text; //출력 하기 Debug.Log(json); //역직렬화 WeaponData data = JsonConvert.DeserializeObject<WeaponData>(json); Debug.LogFormat("=> {0}, {1}", data.id, data.name); WeaponData[] datas = JsonConvert.DeserializeObject<WeaponData[]>(json); for (int i = 0; i < datas.Length; i++) { data = datas[i]; Debug.LogFormat("=> {0}", data.id); } } }
이런 식으로 배열을 이용하여 응용해 볼수도 있다
'유니티 > 유니티 메인' 카테고리의 다른 글
가까운 적 찾기 (2) 2024.02.28 직렬화를 이용하여 저장 객체 저장 (1) 2024.02.15 레벨 디자인, Debug.DrawRay, RayCast, RayCastHit (0) 2024.02.07 3D(Terrian, 파티클, Ray 클래스) (1) 2024.02.05 물리엔진, 애니메이션, 씬변환 (2) 2024.02.05