ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [유니티] JSON 데이터 불러오기
    유니티 노트 2023. 11. 13. 23:45

    * 유니티에 대한 어떠한 베이스 없이 프로젝트를 시작해보았습니다.

    * 잘못된 정보에 대한 피드백은 언제나 환영입니다.

     

    JSON 불러오기를 사용하려 했던 목적:

    게임 내의 오브젝트를 데이터화하여 게임 로드시 c# 스크립트에서 오브젝트 생성을 자동화 하고자 함.

     

    요약: 

    1. 파싱시, 불러올 데이터에 대한 타입 정의 클래스 미리 생성하기 - Javascript를 사용하던 나는 이 부분이 제일 불편/어색했음(그때가 좋았다...)
    2. System.IO 네임스페이스의 기능인 File.ReadAllText 로 파일 읽기

    3. 파싱한 Json의 결과를 담을 클래스 정의하기
    4. JsonUtility 를 활용하여 텍스트로 읽어온 JSON 파일 파싱하기

    어려움을 겪었던 지점:

    - 처음부터 너무 복잡한 형식의 JSON 파싱을 시도... - 간단한 형식의 JSON을 파싱하는 것부터 순서를 밟아나가는 것으로 해결.

    - JSON 내부에 대한 타입 정의 - List<>, Object[], Dictionary 등 이제까지 사용해보지 않았던 데이터 타입에 대한 학습이 필요


    예시 코드

    1. Json 데이터 준비 ( Assets/Json/data.json )

    샘플 Json 데이터

    2. Json 데이터 텍스트로 불러오기

    샘플 Json Text 불러오기
    콘솔 로그 - Json Text

    여기까지 왔다면 우선 텍스트로 읽어오는 것은 성공이다.

    하지만 나는 각각의 데이터에 접근하는 것을 원한다.

    key_1에 접근해서 value_1을 얻어보자.

     

    3. 얻고자 하는 데이터를 담는 클래스 생성 ( 타입 주의, 변수명 주의 - Json내의 프로퍼티 이름과 일치해야함 )

    클래스 정의
    key_1에 대한 데이터 get 성공

    나는 아직 만족하지 못한다.

    나는 여러개의 데이터를 한번에 읽어오고 싶다.

    그러기 위해서는 최상위의 프로퍼티명을 정하고 그 하위에 다른 데이터를 작성해야한다.

    Unity에서는 배열 Json 데이터를 읽지 못하고 객체 Json 데이터만 읽을 수 있는 듯 하다.( 이 문장 틀릴 수 있음 주의. )
    따라서 나는 최상위 프로퍼티명을 정하고 그에 대한 데이터로 여러 객체를 담은 배열 데이터를 샘플로 만들어보았다.

     

    다음에 나올 코드가 약간 헷갈릴 수 있으니 집중해서 보도록 하자.

     

    우선 추가적으로 필요한 것은 두가지이다.

    1. 여러 객체를 담고 있는 배열을 값으로 가지고 있는 최상위 프로퍼티에 대한 클래스 정의

    2. 배열에 담긴 객체에 대한 (직렬화 가능한) 클래스 정의

     

    data.json의 형식을 원하는 데이터 세트로 변경해보았다.

    변경된 Json 데이터 세트

    4. root 프로퍼티의 값을 담을 ObjectRootData 클래스, 직렬화 가능한 ObjectData 클래스 정의

    나도 이 부분이 가장 헷갈렸던 것 같다.

    하지만 하나씩 따라가다보면 이해가 될 것이다.

     

    ObjectRootData 클래스를 정의한다.

    변수 이름은 물론 불러오고자하는 Json 데이터의 최상위 프로퍼티 이름이고, 그 타입은 내가 작성한 최상위 프로퍼티에 대한 값의 타입이다.

    다음으로 Json을 파싱할 때, ObjectRootData 타입으로 데이터를 받아온다. - 이 안에는 { "root" : [ ... ] } 이런 형식으로 담겨있을 것이다.

    나는 root 프로퍼티의 값으로 "객체의 배열"을 담았기 떄문에 배열 안의 객체에 대한 클래스(ObjectData)를 정의해주어야 한다.

     

    위 코드대로 objectRootData에 담긴 데이터를 출력하기 위해 foreach문을 사용하여 ObjectData 객체를 직렬화(문자열화)하여 출력해보았다.

    결과는 아래와 같다.

    콘솔 로그 - 직렬화 된 ObjectData

    이제 ObjectData에 담긴 데이터를 활용하여 다음 스텝으로 넘어갈 수 있게 되었다.

Designed by Tistory.