Unity 개발

[Unity] 에셋없이 Google Sheet 데이터테이블 만들기 (No Asset!)

아머르 2025. 7. 2. 00:49

[Google Sheet의 App Script를 이용한 데이터테이블 만들기]

오늘은 Google Sheet에 Data를 입력하고, Unity로 불러오는 작업을 해보았다.

에셋을 사용해서 세팅하면 더 편하겠지만, 에셋없이 적용하는 법을 공부하기위해 현재 할인하는 에셋도 없고,

공부도 할 겸 만들어보기로 했다.

 

[구글 시트 작성 / 배포]

우선 구글 시트에 필요한 데이터를 입력한다.

 

상단의 탭의 확장 프로그램 - App Script를 눌러 들어간다.

 

들어가게되면 GAS라는 Google Apps Script라는 JavaScript 기반의 언어를 입력할 수 있고,

Google Docs / Sheet / Gmail 등의 구글 서비스와 자동화로 연동할 수 있게 설계된 언어이다.

 

 

function doGet(e) {
  const sheetName = e.parameter.sheet || "Buff";
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);

  if (!sheet) {
    return ContentService.createTextOutput(JSON.stringify({ error: "Sheet not found: " + sheetName }))
      .setMimeType(ContentService.MimeType.JSON);
  }

  const rows = sheet.getDataRange().getValues();
  const headers = rows.shift();

  const data = rows.map(row => {
    const obj = {};
    row.forEach((value, index) => {
      obj[headers[index]] = value;
    });
    return obj;
  });

  return ContentService.createTextOutput(JSON.stringify(data))
    .setMimeType(ContentService.MimeType.JSON);
}

상단의 제목없는 프로젝트를 누르면 이름을 바꿀 수 있으며, 바꾸지 않아도 상관없다.

해당 코드를 복사해서 넣되,

const sheet Name = e.parameter.sheet || "Buff"; 에서 Buff말고 Google Sheet 하단의 시트 이름을 적어주자.

 

더보기

코드에 대한 설명

// Google Web App이 HTTP GET 요청을 받을 때 실행되는 함수
function doGet(e) {
  // URL에서 전달된 쿼리 파라미터 중 'sheet'를 가져오고, 없으면 기본값 'Buff' 사용
  const sheetName = e.parameter.sheet || "Buff";

  // 해당 이름의 시트를 현재 Google Sheet 문서에서 찾음
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);

  // 시트를 못 찾으면 에러 메시지를 JSON 형식으로 반환
  if (!sheet) {
    return ContentService.createTextOutput(JSON.stringify({ error: "Sheet not found: " + sheetName }))
      .setMimeType(ContentService.MimeType.JSON);
  }

  // 시트의 전체 데이터를 2차원 배열로 가져옴 (첫 행은 헤더, 나머지는 데이터)
  const rows = sheet.getDataRange().getValues();

  // 첫 번째 행(헤더)을 따로 꺼냄
  const headers = rows.shift();

  // 각 데이터 행을 헤더에 맞춰 JSON 객체로 변환
  const data = rows.map(row => {
    const obj = {};
    row.forEach((value, index) => {
      obj[headers[index]] = value;  // "헤더이름": 값 형태로 구성
    });
    return obj;
  });

  // JSON 문자열로 변환 후 반환 (Content-Type: application/json)
  return ContentService.createTextOutput(JSON.stringify(data))
    .setMimeType(ContentService.MimeType.JSON);
}

 

작성이 완료되면 새 배포 또는 상단의 배포 - 배포 관리를 눌러준다. (배포관리를 눌러서 새 배포를 할 예정)

 

1. 배포 유형 - 웹 앱

2. 액세스 권한이 있는 사용자 - 모든 사용자

설명 란을 입력 후 배포를 누른다.

 

액세스 승인을 눌러준 후 계정을 선택해준다.

 

Advanced를 눌러준 후

 

Go to 프로젝트 명 (unsafe) 을 눌러주고 Allow를 해주면 배포가 끝난다.

 

 

[유니티 코드 작성]

배포 ID 와 웹 앱 URL이 발행되었다면 구글시트 작업은 끝났다.

 

이제 Unity에서 JSON 파싱 → 객체화 → 게임시스템 반영 의 작업을 해주면 된다.

 

1. 시트의 내용을 기반으로 BuffData 스크립트를 작성

 

2. 시트의 특정 데이터를 JSON으로 받아서, Unity의 C# 객체로 파싱해주는 DataTableLoader 작성

 

3. 게임에 필요한 모든 외부 데이터 테이블을 로드하고, 캐싱하며, 조회 기능을 제공하는 DataTableManager작성

본인 프로젝트의 Manager 구조에 맞게 작성해주면 됩니다.

 

더보기

 메서드에 대한 설명

private IEnumerator LoadSheet<T>(string sheetName, Action<T> onLoaded) where T : class
{
    bool isDone = false;

    yield return loader.LoadTable<T>(sheetName, data =>
    {
        onLoaded?.Invoke(data);
        isDone = true;
    });

    yield return new WaitUntil(() => isDone);
}

 

where T : class 란?

T는 클래스여야 하며 int, float, struct 같은 값형(Value Type)은 사용할 수 없다는 의미

JsonUtility.FromJson<T>() 같은 메서드는 참조형 타입(클래스) 만 파싱할 수 있기 때문에 그걸 강제하기 위해 사용

 

[버프 사용 예시]

이제 DataTableManager를 이용해서 사용하면 된다.

 

1. 특정 버프 데이터 가져오기

BuffData buff = DataTableManager.Instance.GetBuffById(20002);
Debug.Log($"버프 이름: {buff.Name}, 수치: {buff.Value1}~{buff.Value2}");

 

2. 모든 버프 리스트 출력

foreach (var buff in DataTableManager.Instance.Buffs)
{
    Debug.Log($"▶ {buff.Id}: {buff.Name} ({buff.Rarity}) - {buff.Value1}~{buff.Value2}");
}

 

3. 무작위 버프 선택

var allBuffs = DataTableManager.Instance.Buffs;
int index = UnityEngine.Random.Range(0, allBuffs.Count);
BuffData randomBuff = allBuffs[index];
ApplyBuff(randomBuff);
반응형