[Unity] LitJson으로 엑셀 데이터 가져오기 (안드로이드, StreamingAssets)

장도

·

2020. 5. 16. 18:38

728x90
반응형

#LitJson

 

게임을 만드려면 관련 데이터가 많이 필요하겠죠.

캐릭터 스테이터스, 아이템리스트, 스킬리스트 등등...

데이터를 C#에 직접 넣으려면 어마무시한 하드코딩이 될 테고...

그렇게 쌓인 데이터를 C#에서 불러오려면 어떻게 해야할까요?

 

Xml을 이용한다, Csv를 이용한다, Json을 이용한다 등등

여러방법 중 제가 선택한 것은 Csv와 Json이었습니다.

먼저 Json부터 말씀드릴게요.

 

전 데이터를 구글시트로 관리하고 있습니다.

요렇게 생긴 것인데요, 이걸 싹다 복사해서 다음 사이트에 붙여 넣어줍니다.

http://shancarter.github.io/mr-data-converter/

 

Mr. Data Converter

 

shancarter.github.io

 

 

복사해서
Input쪽에 붙여넣습니다.

그럼 아래에 뭐가 나오죠?

바로 복사합니다.

 

그리고 여기로 들어갑니다.

https://jsonformatter.curiousconcept.com/

 

JSON Formatter & Validator

Format and validate JSON data so that it can easily be read by human beings.

jsonformatter.curiousconcept.com

여기서 붙여넣은 후 Process를 눌러주면...!

누르면

 

이렇게 나옵니다!

Process를 누르면 자동으로 스크롤이 내려가면서 이렇게 보기좋은 Json으로 보여줍니다.

이것을 오른쪽 위 버튼을 눌러 다운로드합니다.

그렇게 갖춰진 Json파일을 일단 준비물로 갖추고요.

구글링해서 Litson.dll을 다운로드받아, 유니티 에셋 내 plugin폴더에 넣어줍시다.

쉬워요!

그럼 준비가 다 끝났네요.

스크립트를 확인해볼까요?

 

먼저 using을 이용해 LitJson을 사용해봅시다.

 

 

public class Item //3. 아이템리스트
{
    public int index;
    public string name;
    public double ad;
    public double df;
    public double sp;
    public int act;
    public int grade;
    public int skillIndex;

    //이미지넣고싶다면 https://goodseonbi.github.io/duckfactory/study/Unity-LitJson/ 참조!

    public Item(int index, string name,  double ad, double df, double sp, int act, int grade, int skillIndex)
    {
        this.index = index;
        this.name = name;
        this.ad = ad;
        this.df = df;
        this.sp = sp;
        this.act = act;
        this.grade = grade;
        this.skillIndex = skillIndex;
    }
}

 

이런식으로 아이템리스트를 만들어주고요

하나씩 설명드릴게요.

 

 

public class JsonManager : MonoBehaviour{
    //3.Item
    
    public static List<Item> ItemList = new List<Item>();
    public static List<Item> MyItem = new List<Item>();
    
    JsonData itemData;//아이템데이터 파싱용
    
        void ParsingJsonItem(JsonData name, List<Item> listItem)
    {
        for (int i = 0; i < name.Count; i++)
        {
            string tempIndex = name[i][0].ToString();
            string tempName = name[i][1].ToString();
            string tempAd = name[i][2].ToString();
            string tempDf = name[i][3].ToString();
            string tempSp = name[i][4].ToString();
            string tempAct = name[i][5].ToString();
            string tempGrade = name[i][6].ToString();
            string tempSkillIndex = name[i][7].ToString();

            int tempIndex_ = int.Parse(tempIndex);
            double tempAd_ = double.Parse(tempAd);
            double tempDf_ = double.Parse(tempDf);
            double tempSp_ = double.Parse(tempSp);
            int tempAct_ = int.Parse(tempAct);
            int tempGrade_ = int.Parse(tempGrade);
            int tempSkillIndex_ = int.Parse(tempSkillIndex);

            Item tempItem = new Item(tempIndex_, tempName, tempAd_, tempDf_, tempSp_, tempAct_, tempGrade_, tempSkillIndex_);
            listItem.Add(tempItem);
            Debug.Log("아이템파싱완료");
        }
    }
}

 

 

요건 우리가 엑셀에서 뽑아낸 데이터를 최종적으로 저장할 리스트입니다.

제네릭을 Item으로 했죠? 바로 위에서 만든 Item클래스입니다.

 

요건 엑셀에서 뽑아낸 데이터를 중간에 잠깐 저장할 것입니다.

LisJson을 사용하고 있기 때문에 가능한 것이죠.

 

이게 핵심인데요.

 

먼저 다음 메소드는 JsonData name, List<Item> listItem을 요구합니다.

첫번째로 데이터를 가져올 jsondata와, 그리고 그 데이터를 분해한 후 집어 넣을 리스트를 요구하는 것이죠.

 

1. 먼저 jsondata에서 가져온 것들을 string으로 선언해줍니다. 다루기 쉽게요.

엑셀도 총 8열이었읜 0~7까지 7개인게 이해가 되시죠?

2. 그 중 원래 int형식이거나 double형식인 것을 parse함수를 통해 바꿔주빈다.

3. 그 하나하나를 Item 클래스에 담아준 후

4. 그것을 리스트에 다시 넣어주죠.

그럼 리스트에 최종적으로 담기게 됩니다.

 

그럼 이것을 호출하려면 어떻게 해야할까요?

일단 JsonData를 가지고 있어야하겠죠?

아까 준비물로 만든 데이터를 StreamingAssets에 넣어주고요,

 

전 LoadBase라고 함수이름을 붙여서 이용할껀데요, 그건 중요한 게 아니고

이렇게 JsonString과 filepath를 선언해줍니다.

그 후

1. filepath를 다음과 같이 지정해줍니다.

안드로이드든, PC든 상관없이요! (IOS는 안됩니다.)

 

2. 안드로이드라면 다음이 실행될거에요.

안 내용은 저도 잘 몰라요.

이곳 저곳 뒤져봤지만 WWW를 이용해 byte로 불러와야한다 불라불라하던데... 하튼 이렇게 합니다.

그럼 우리가 선언해놓은 JsonString에 텍스트들이 담겨질 것입니다.

 

3. 혹은 안드로이드가 아닌 PC라면 이렇게 실행되겠죠. 어쨋든 JsonString엔 같은 값이 들어갑니다.

 

4.그렇게 만들어진 JsonString을 JsonMapper을 이용해 JsonData로 만들어줍니다!!

마지막으로 아까 만든 ParsingJsonItem함수를 이용해 내 리스트 내에 넣어주는 것이죠.

 

처음에 유니티에서는 잘 되던 것이 안드로이드로 빌딩을 하니 안된 부분이 있었는데,

고생을 좀 해보니 2번을 추가함으로써 되더라구요. 의외로 간단하게요.

그 방법은 다음을 참고했습니다.

https://answers.unity.com/questions/1225077/using-streamingassets-in-android.html

 

Using StreamingAssets in Android - Unity Answers

 

answers.unity.com

고마워요 유니티 포럼! 왜 영어공부를 해야하는지 절감하게 되었습니다.

 

그럼 2000

 

 

 

 

#참고 블로그

더보기

 

반응형