json 응용
변하는 데이터 : Info.cs
사용자에 의해 값이 변하는 데이터
ex) 무기의 공격력, 유저의 캐릭터 레벨
변하지 않는 데이터 : Data - 엑셀에서 데이터를 관리
ex)밸런스 데이터, 게임에서 설정되어 있는 데이터
------------------------------------------------------------------
이 변하지 않는 Data를 json으로 가공하려한다. json에 대한 설명은 아래 링크에 상세히 적혀있다
json
생각보다 의미 자체나 활용은 어렵지 않지만 중요한 내용이기에 꼭 확실하게 짚고 넘어가야하는 json이다 json : 웹이나 네트워크에서 서버와 클라이언트 사이에서 데이터를 주고 받을 때 사용하
sangeun00.tistory.com
변하지 않는 데이터 값을 엑셀에 적어주어 복사한뒤
Mr.Data Converter라는 사이트에 붙여넣어 json 형식으로 변형된 결과물을 복사한다
Mr. Data Converter
shancarter.github.io
그리고 그 복사한 결과물을 Online JSON Viewer and Formatter 사이트에 들어가 다시 붙여준다
Online JSON Viewer and Formatter
jsonviewer.stack.hu
붙여넣은뒤 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);
}
}
}
이런 식으로 배열을 이용하여 응용해 볼수도 있다