자작 게임도 잘 부탁드려요~

adsense



유니티 2D 슈팅게임 개발일지 - 11일차 (구글시트->Json 출력->유니티에서 읽기)

데이터를 JSON 파일로 관리하기

며칠 전에 구글 시트를 연동해서 바로 데이타값을 받아오는 작업을 했지만,
이건 어디까지나 개발 과정에서의 편의고,
실제 내보내려면 구글 클라우드 API를 그냥 열어둔채로 쓸 수는 없고, 역시 파일로 만들어서 패키지에 포함할 필요가 있겠네요.

플레이어 전투기 관련 정보를 구글 시트에서 작업을 했습니다.

그런데 생각해보니까 기존에 엑셀에서 csv 출력한 다음에 이걸 json으로 변환하는 작업을 c++에서 간단한 프로그램을 만들어 했었는데,
누군가 시트에서 바로 json 출력할 수 있도록 만들지 않았을까?

있네요.

Export Sheet Data 라는 확장이 있습니다.



확장프로그램->부가기능->부가기능 설치하기로 들어간 후 Export Sheet Data를 검색해 설치합니다.

설치 후에는 확장프로그램->Export Sheet Data->Open Side Bar를 선택해 익스포트 설정을 엽니다.

다른건 기본 상태로 놔두고 Advanced JSON에서 Export contents as array만 체크해 줍니다.<-이렇게 하면 행 단위로 배열로 출력합니다.
(※그때문에 필드를 가로 방향으로 정리해야 합니다)

이후 다운로드 받은 json 파일을 Assets 폴더로 옮겨줍니다.


JsonUtility를 사용해서 json 파일을 파싱할 것이지만, 
이녀석은 배열이므로 배열을 읽어들일 수 있도록 랩퍼를 하나 추가해 줍니다.
(인터넷에서 주웠습니다)
  1. public static class JsonHelper
  2. {
  3. public static T[] FromJson<T>(string json)
  4. {
  5. Wrapper<T> wrapper = JsonUtility.FromJson<Wrapper<T>>(json);
  6. return wrapper.Items;
  7. }
  8. public static string ToJson<T>(T[] array)
  9. {
  10. Wrapper<T> wrapper = new Wrapper<T>();
  11. wrapper.Items = array;
  12. return JsonUtility.ToJson(wrapper);
  13. }
  14.  
  15. [System.Serializable]
  16. private class Wrapper<T>
  17. {
  18. public T[] Items;
  19. }
  20. };

그리고 이걸 읽어들이기 위한 클래스도 하나 설정합니다.
  1. public class ShipData
  2. {
  3. public int idx;
  4. public string name;
  5. public int pics;
  6. public float hp;
  7. public float shield;
  8. public float rapid;
  9. public float power;
  10. public int shoot1;
  11. public int shoot2;
  12. public int shoot3;
  13. public int rsc;
  14. public int price;
  15. }

시트 상의 필드와 변수 이름(자료형도)을 동일하게 해 줘야 하고,
그렇게 하면 파싱 로직을 따로 만들 필요 없이 알아서 할당된다는게 신기하네요.

그리고 에셋상에 있는 파일을 읽어들이기 위한 함수입니다.
  1. static public T[] LoadJsonFile<T>(string loadPath, string fileName)
  2. {
  3. FileStream fileStream = new FileStream(
  4. string.Format("{0}/{1}.json", loadPath, fileName), FileMode.Open);
  5. byte[] data = new byte[fileStream.Length];
  6. fileStream.Read(data, 0, data.Length);
  7. fileStream.Close();
  8. string jsonData = Encoding.UTF8.GetString(data);
  9.  
  10. return JsonHelper.FromJson<T>(jsonData);
  11. }

이렇게 해서 실행해 보면...

ArgumentException: JSON must represent an object type. 이런 에러가 납니다.

래퍼 클래스에서 Items란 이름으로 받아들이게 했기 때문에 json 문자열에도 Items 필드명을 지정해줘야 합니다.
파일을 수정해도 되지만 시트 내용을 수정할 때마다 일일이 파일을 수작업으로 변경하는건 엘레강뜨하지 않네요.

파일을 읽어들인 문자열 앞뒤에 추가시켜주도록 합니다. (위 LoadJsonFile 함수의 10행)

  1. return JsonHelper.FromJson<T>("{\"Items\":" + jsonData + "}");

이제 잘 읽혀집니다.

이렇게 읽어온 내용을 화면에 반영하도록 해 봤습니다.

데이터를 읽어오게 하는 과정만으로도 꽤 고생했네요. 이제 나머지 상점 기능을 구현해야죠.




덧글

댓글 입력 영역


Books

Geek라이프

기초부터 시작하는 모형 전자공작
박성윤 저

사이토 나오키의 일러스트 첨삭 레슨 Before & After
사이토 나오키 저/박수현 역

MSX&재믹스 퍼펙트 카탈로그
마에다 히로유키 저/조기현 역

핵심강좌! Cocos2d-x
이재환 저
예스24 | 애드온2
일본서적 전문사이트 NEPIC