이번에는 데이터를 관리하는 파트를 해보고 싶었다.

그래서 기획과 개발을 이어 주는 툴을 제작해 보려한다.

Unity 프로젝트를 하다 보면 데이터를 외부에서 관리하고 불러오는 경우가 종종 생긴다.

그중에서도 구글 스프레드시트는 협업과 버전 관리에 유리해 자주 사용하게 된다.

이번에는 스프레드시트의 특정 범위를 지정해서 JSON으로 변환하고, Unity에서 사용할 수 있도록 저장하는 에디터 툴을 만들었다.

그 과정과 트러블슈팅을 정리해본다.


목표

  • 구글 스프레드시트의 특정 시트를 CSV로 다운로드
  • 범위를 지정해서 필요한 데이터만 JSON으로 파싱
  • 시트 이름을 파일명으로 저장
  • 여러 시트를 한 번에 처리할 수 있도록 관리 구조 설계

image-20250407211310287

접근 방식 고민

처음에는 다양한 방법을 검토했다.

Google Sheets API를 사용해 인증을 거쳐 데이터를 직접 요청하는 방법도 있었고, GAS(Google Apps Script)를 이용한 중계 서버를 만드는 것도 고려했었다.

하지만 이 방식들은 다음과 같은 이유로 제외했다:

  • Google API는 인증 토큰 관리와 로그인 문제가 복잡하고, Unity 내에서 처리하기에 진입 장벽이 높았다.
  • 사내 혹은 팀 프로젝트에선 구글 로그인 권한 문제로 접근 제약이 걸릴 수 있었다.
  • GAS 방식은 유지 관리와 트리거 설정이 까다로웠다.

결국 가장 간단하고 빠른 방식인 “공개 링크 기반 CSV 다운로드”로 결정하게 되었다.

스프레드시트를 공개 설정하고, 각 시트의 GID만 알면 CSV를 바로 가져올 수 있다.

기본 구조 설계

처음에는 간단하게 한 시트만 변환하는 방식으로 시작했다.

Unity의 EditorWindow를 사용해서 GUI를 만들고, UnityWebRequest를 통해 CSV 데이터를 받아왔다.

구글 스프레드시트를 CSV로 다운로드하기 위한 URL 형식은 다음과 같다.

https://docs.google.com/spreadsheets/d/[스프레드시트ID]/export?format=csv&id=[스프레드시트ID]&gid=[시트GID]
  • spreadsheetId는 공유 링크의 /d//edit 사이의 문자열이다.
  • gid는 시트마다 다르게 지정된 고유한 값이다.

CSV로 받아온 데이터는 라인별로 Split하고, 헤더와 데이터를 추출한 후 JSON으로 변환한다.

CsvRange 구조체로 범위 지정

처음에는 전체 시트를 다 읽었지만, 실제 필요한 데이터는 항상 일정 범위에만 있었다.

그래서 아래와 같은 구조체를 만들어 범위를 지정하도록 했다.

public class CsvRange
{
    public int startRow;
    public int endRow;
    public int startCol;
    public int endCol;
    ...
}

여러 시트 일괄 처리

한두 개가 아니라 여러 시트를 변환해야 할 필요가 생겼고, 이를 위해 SheetInfo 클래스를 만들었다.

public class SheetInfo
{
    public string sheetName;
    public string gid;
    public CsvRange range;
    ...
}

이걸 리스트로 관리하면 아래처럼 여러 시트를 순회하며 처리할 수 있다.

foreach (var sheet in sheetInfos)
{
    string url = ...;
    string path = saveDirectory + sheet.sheetName + ".json";
    StartCoroutine(DownloadAndSaveSheet(sheet, url, path));
}

List<SheetInfo> 형태로 여러 시트를 정의하고, 이를 순회하며 자동으로 다운로드하고 JSON 파일로 저장하는 구조를 만들었다.

파일명은 sheetName.json 형식으로 자동 생성되며, 지정한 폴더 경로 아래에 저장된다.

image-20250407211327627


마무리

결과적으로 이 툴을 통해 스프레드시트에서 데이터 파일을 자동으로 받아 JSON으로 저장하고, Unity에서 바로 활용할 수 있게 되었다.

수작업으로 복사/붙여넣기 하던 시간을 줄이고, 실수 가능성도 줄어들었다.

추후에는 ScriptableObject로 자동 변환하거나, 특정 키 기준으로 머지하는 기능도 추가해볼 계획이다.

또한, 에디터 상에서 SheetInfo 리스트를 직접 편집 가능한 커스텀 UI로 확장하면 활용도가 더욱 높아질 것으로 보인다.

댓글남기기