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

adsense



유니티 2D 슈팅게임 개발일지 - 6일차 (Google Sheets To Unity)

Google Sheets To Unity (GSTU)

Text Mesh Pro - TMP도 그렇고, Google Play Game Service - GPGS도 그렇고,
단어 첫머리를 대문자로 쓰고 그걸로 약어 만드는 건 유니티쪽에서의 약속 같은 건가요.


웹상에서 구글 시트에 작업한 시트를 유니티로 바로 불러와 데이터로 쓰는 방법이 있었네요.


면접봤을 때 '엑셀 같은데서 기획자가 작업한걸 프로그램으로 바로 불러오는 방법 쓰는게 있느냐'는 질문을 받았는데..
cocos2d-x만 해 봤었으니, 자체 툴/함수를 만들어 엑셀 csv 출력해서 json으로 컨버트 하거나 그냥 아스키 혹은 난독화 바이너리로 읽어오거나 하는걸 얘기했는데 어째 반응이 별로더라니,

이런 답을 원했던 거군요.


패키지 다운로드

일단 시도해보기 위한 기능은 딱 이정도면 차고 넘칠 듯요.



설치 오류

설치해 봤는데 Window 메뉴에 GSTU가 생기지 않습니다.

에러 메시지를 보니

Asset Packages/com.unity.nuget.newtonsoft-json/Runtime/_Newtonsoft.Json.dll has no meta file, but it's in an immutable folder. The asset will be ignored.

이런게 있군요.

Newtonsoft.Json.dll이 어딘가에 또 있어서 중복된다고 합니다.
Library\PackageCache\com.unity.nuget.newtonsoft-json@2.0.0\Runtime 에 있는 Newtonsoft.Json.dll을 제거해주면 됩니다.

유니티 2021 이상 버전에서는 이런 에러가 생기지 않고 2020 이하 버전에서의 문제라고 하네요.

삭제해주고 유니티 종료 후 재실행해서 Window에서 GSTU가 생성된걸 확인합니다.



구글 클라우드 연동

필요한 것 : 구글 클라우드 플랫폼(GCP)과 구글 시트 계정. (동일 계정으로 로그인되어야 합니다)

GCP에서 새 프로젝트를 만들고,
API 및 서비스 사용 설정

->sheets 검색


->Google Sheets API 사용

API/서비스 세부정보->사용자 인증 정보 만들기

->사용자 인증 정보 유형 (다음)

->OAuth 동의 화면 : *필수정보 입력 (저장 후 계속)

->범위 : 특별히 입력할거 없습니다 (다음)

->OAuth 클라이언트 ID : *필수정보 입력, 지금은 PC상에서 개발 테스트중이니까 데스크톱 앱으로 선택합니다. (만들기)

->내 사용자 인증 정보 : json 파일에 클라이언트 ID/보안 비밀 키도 포함되어 있지만 지금은 굳이 다운받지 않아도 됩니다.
[완료] 눌러서 끝.


사용자 인증 정보->OAuth 2.0 클라이언트 ID -> 앞에서 생성한 이름 선택->오른쪽에 클라이언트 ID와 보안 비밀이 표시됩니다.


이제 유니티에서 Window->GSTU->Open Config 선택합니다.

클라이언트 ID에 ①클라이언트 ID 카피페.
클라이언트 시크릿 코드에 ②클라이언트 보안 비밀 카피페.
포트 넘버 8080
->빌드 커넥션 클릭


브라우저가 열리고 계정 선택

->Google에서 확인하지 않은 앱->계속

액세스 요청->계속

연결이 끝나면 이 메시지가 뜨는 창이 열리면, 접속에 성공했습니다.


위 API 서비스에 접속한 것과 같은 계정으로 구글 시트를 만듭니다.
아래와 같은 시트를 만들었습니다.


여기서 필요한 것은 웹 접속 주소의 https://docs.google.com/spreadsheetes/d/~/edit 사이에 있는 ID. 이게 스프레드 시트 ID입니다.
그리고 시트의 이름. 지금 불러올 것은 Sheet2 입니다.


스크립트

네임스페이스
  1. using GoogleSheetsToUnity;
  2. using UnityEngine.Events;

시트호출
적당한 스크립트에 다음 함수를 작성합니다.
id가 시트 ID(①)
sheetname이 시트 이름(②)
  1. string id = "***************************************";
  2. string sheetname = "Sheet2";
  3. void UpdateStats(UnityAction<GstuSpreadSheet> callback, bool mergedCells = false)
  4. {
  5. SpreadsheetManager.Read(new GSTU_Search(id, sheetname), callback, mergedCells);
  6. }


파싱

콜백에 전달되는 GstuSpreadSheet인수 ss의 Cells, rows, colums로 각각 셀, 열, 행을 읽어올 수 있습니다.

  1. UpdateStats((GstuSpreadSheet ss) =>
  2. {
  3. var rw = ss.rows[ss.Cells["A1"].value];
  4. foreach (var rwdat in rw)
  5. {
  6. var col = ss.columns[rwdat.value];
  7. string logger = string.Empty;
  8. for (int j = 0; j < col.Count; j++)
  9. {
  10. logger += (col[j].value + ",");
  11. }
  12. Debug.Log(logger);
  13. }
  14. Debug.Log("-----------");
  15. });

3 : "A1"은 셀 이름입니다. 셀 이름 자체는 변하지 않으므로(않나?) 하드코딩해도 무방.
이걸 인수로 rows를 받아오므로 Idx, Name, LifeMax...의 6개 열을 읽어서 rw에 격납하고
4 : 열 수 만큼 foreach를 돌려
6 : 해당 열을 다시 행으로 쪼개 col에 읽습니다.
8~11 : 행의 내용을 읽어서 문자열로.


적당한 오브젝트에 스크립트를 붙여 실행해보면 아래와 같이 시트에서 받아온 내용을 로그로 확인할 수 있습니다.
시트의 내용을 변경하면 변경된 내용으로 받아옵니다.


GSTU에서 읽어들이는 key값이나 value값은 모두 string이므로 데이타를 사용하기 위해서는 적절히 형변환 해 줘야 합니다.




덧글

댓글 입력 영역


Books

Geek라이프

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

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

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

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