ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • json 응용
    유니티/유니티 메인 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);
            }
        }
    }

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

Designed by Tistory.