이전 🌡️ 날씨 API 연동에 이어 실질적으로 사용하는 데이터를 프로젝트에 불러와서 관리를 더 용이하게 할 것이다.
원래는 프로젝트에서 .csv
파일을 load 및 parse해서 사용하고 있었는데 자주 바뀌는 데이터에 대해서는 계속 [파일 수정] - [push] 작업이 번거로워 해당 시스템 도입을 예정하고 있었고 마침 기회가 되어 내가 진행하게 되었다.
그래서 이미 직렬화된 데이터 스크립트도 있었고 로직도 잘 구현되어있어서 정말 데이터 불러오기 로직만 바꿔치기 하면 됐어서 수월하게 할 수 있었다.
기존 csv 파일에 있던 데이터를 새로 만든 구글 시트로 옮기고 공유 권한을 링크가 있는 사용자로 바꿔주었다.
👀 대신 이렇게 해서 공유되는 url에는 수정이 조금 필요하다.
url은 간단하게 말하자면 주소 + 데이터 로 이뤄져있는데 슬래시(/)까지가 해당 웹사이트에 접근하기 위한 주소이고 그 이후 물음표(?)부터는 접근된 데이터를 어떻게 볼 것인지... 수정할 것인지 등에 대한 정보를 나타내준다.
https://docs.google.com/spreadsheets/d/구글시트의 주소/edit?gid=0#gid=0
단적으로 내가 만들 구글시트를 들어가보면, 보통 url이 이렇게 되어있는데 수정 + 0행 0열의 칸이 선택된 상태를 유저에게 보여주는 형태인 것이다.
그래서 우리는 물음표 뒤를 수정해서 원하는 {범위}의 데이터만을! 불러올 것이다.
⛔️ 사실 이렇게 하지 않으면 해당 사이트의... html 전부를 불러오기에 대참사가 일어난다.
본인에게 필요한 데이터의 범위가 항상 정해져있다면, 범위를 바로 url에 const로 때려박을 수 있지만 필자는 유동적이기에 특정 셀에 해당 시트의 마지막 행을 먼저 불러오고 이것을 url에 덧붙여 한번 더 request를 보내는 형태로 작업을 수행했다.
원하는 열들을 기준으로 가장 마지막인 행을 알려주는 엑셀 함수이다
https://www.automateexcel.com/ko/formulas/find-last-row-with-data-ko/
여기를 참고했다!
이렇게 범위의 마지막을 알았다면 이제 진짜 유니티에서 request를 보내보겠다
일단 접근하고자 하는 구글시트의 주소를 string에 저장해주고 마지막 인덱스를 가진 셀의 위치인 {G2}
를 Get해준다
string sheetURL;
const string lastColIdx = "G2";
const string exportTxt = "export?format=csv&range=";
sheetURL = "https://docs.google.com/spreadsheets/d/~~~~~/" + exportTxt;
원하는 범위의 추출을은 exportTxt
변수에 담긴 문자열처럼 url에 붙여주면 된다.
이전에 api 호출을 했던 것 처럼 (🔗 이전 글 참고) 해주고 성공적이라면 원하는 데이터가 downloadHandler
에 받아져 있을 것이므로 이 데이터를 sheetURL
에 다시 설정해주면 된다.
const string rangeIdx = "A1:E"; // 시작 위치 : 끝 위치
string output; // // Current Output is row idx where have last data.
// 호출될 url = sheetURL + rangeIdx + output
즉 현재 데이터에서는 A열 1행부터 E열 86행까지 불러올 것이다.
csv 형태로 불러왔기에 디버그를 찍어보면 "\r\n"로 line이 나눠져있다.
string[] splitResponses = output.Split("\r\n");
잘 나뉜 것을 확인했으면, 각 행에 대한 데이터 파싱은 원하는 데이터 구조에 맞게 콤마로 split해준 뒤 init해주면 된다.
이렇게 데이터를 다 불러온 이후에 원하는 형태에 맞게 저장하고 다음 로직 시작을 위해 이번에도 delegate
로 원하는 메서드 호출을 진행해줬다
private delegate void ControlSpawnData();
ControlSpawnData controlSpawnData;
controlSpawnData = SplitContext;
controlSpawnData += StartWave;
// downloadHandler를 통해 output을 저장한 이후에 콜백 호출
controlSpawnData();
정상적으로 데이터 로드되고 원하는 상태로 작동하는 것까지 확인완료! 👍