잉ㅇ잉ㅇ 2024. 2. 14. 15:47

변하는 데이터 : 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);
        }
    }
}

이런 식으로 배열을 이용하여 응용해 볼수도 있다