[Unity] 에셋없이 Google Sheet 데이터테이블 만들기 (No Asset!)
[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);