킹머핀의 제작 일지
대사 불러오기 기능 수정 본문
버그 수정
저렇게 완성한 코드에서 문제가 발생했습니다. 여러 테스트 결과, 이유는 모르겠지만 사전에서 문자열 키의 바이트가 클수록 찾는 속도가 느려서 발생하는 문제였습니다. 순서를 건너뛰거나, 잠시 멈춥니다.
해결할 방법은 둘 중 하나입니다.
- 실행 시간을 늦추지 않고 순차적으로 요청한 데이터를 받을 묘안을 떠올린다.
- 그냥 노가다로 일일이 만든다. (나의 그간 몇 년동안의 경험에 따르면 이게 제일 빠름)(근데 그 경험에 따르면 이렇게 한 적이 거의 없음)
저는 1번을 시도해보겠습니다.
먼저 사전 형식으로 작성했던 JSON 파일을 배열 형식으로 만들었습니다. AJAX로 가져와 저장할 객체도 사전이 아니라 배열입니다. 어차피 이전에도 배열의 인스턴트를 하나씩 만들어서 사용했던 터라, 자동으로 생성되는 첫 번째 배열은 비어있었는데 이렇게 활용하게 됐네요!
그러곤 이 함수를 호출합니다. 제가 복잡하고 고급스러운 재귀함수를 만들 실력은 못 되지만 반복문 흉내내기 따위는 손쉽게 만들 수 있거든요. 하하. 허허. 암튼 여기서 방금 저장한 배열의 0부터 끝까지의 값을 순서대로 다른 함수의 인수로 사용합니다. (근데 이거 메모리에 영향 있나?)
중요한 점은, 또다른 함수가 비동기 함수라는 점과, 그 다음 액션이 'Wait for previous actions to complete'라는 점입니다. 기존의 반복문과 다르게 모든 반복 액션을 순차로 실행시킬 수 있는 방법입니다!
다시 강조하지만 비동기 함수입니다. 사실 저번에 배운 기초를 써먹을 수 있어서 뿌듯합니다. 역시 기초가 제일 중요하죠? 난 잘 했어.
이렇게 매개변수를 이용해 나머지 배열에 데이터를 저장하면! 올바른 순서로 데이터를 저장할 수 있게 됩니다.
'Wait for previous actions to complete'를 반복 한 번당 두 번씩 써서 그런지 미세하게 느려졌지만, 크게 문제될 정도는 아닙니다.
기능 수정
위에서 미리 알아본 구글 스프레드시트 확장 앱이 JSON으로 추출하는 방식이 예상과 달랐다. 역시 대충 하면 되는 일이 없다..!
원래 Illume의 대사도 구글 스프레드시트에서 작성했지만, csv 포맷으로는 현재 열려있는 시트 하나씩만 다운로드해야 했기 때문에 20개가 넘는 대사 파일을 일일이 열고 다운로드하는 수고를 줄이기 위해 애플의 넘버스로 전부 옮기고 일괄 개별 변환했다.
그런데 구글 스프레드시트를 오랜만에 사용해서 일괄 개별 다운로드가 된다고 착각했고, 그 확장 앱도 똑같이 작동할 거라고 예상했다. 그래서 위의 코드는 각 JSON 파일을 가져오는, 예상대로 작동하리라는 전제로 완성한 기능이다..
그래도 엄청 좋은 점은, csv 포맷으로 다운로드할 때와는 달리 하나의 JSON 파일에 모든 시트를 포함한다는 점이다! 그러면 파일 관리도 조금 더 간편하고 3차원 배열을 이용해서 조금 더 간단한 코드를 조립할 수 있을 것이다.
그러나 그것마저 무슨 소용인가. Construct 3에서 사용하는 배열의 JSON 형태는 다르다. 확장 앱은 각 시트를 객체{}로 구분하지만, Construct 3은 배열[]로 구분한다. 단순히 괄호 형태의 차이가 아니다. 객체와 배열의 차이다. 구조가 다르다.
1. JSON 데이터는 이름과 값의 쌍으로 이루어집니다.
2. JSON 데이터는 쉼표(,)로 나열됩니다.
3. 객체(object)는 중괄호({})로 둘러쌓아 표현합니다.
4. 배열(array)은 대괄호([])로 둘러쌓아 표현합니다.
쉽게 말하면, 확장 앱은 시트와 그 안의 행과 열이 모두 객체로 나누어져 있고, Construct 3은 모든 셀이 하나의 3차원 배열으로 이루어져 있다. 중괄호만 죄다 대괄호로 치환하면 XYZ 구조는 바뀌겠지만 그건 별 문제가 아니다. 파일을 추출할 때마다 맨 위에다 배열의 정보를 수동으로 입력해야 하고, 객체 이름을 모두 지우는 수고가 필요하다.
자.. 그렇다면 다시 해결 방안을 모색해보자!
- 애시당초 Construct 3의 배열 편집기를 사용한다. (사용감이 너무 떨어져서 제외)
- 모든 시트를 일일이 복사해서 Construct 3의 배열 편집기에 붙여넣는다. (특히 대사 파일을 작업할 때는 차라리 위에서 말한 수고가 더 낫다는 생각이 들 수도 있다.)
- 확장 앱으로 하나의 JSON 포맷으로 추출한 다음, 배열로 변환하지 않고 JSON을 그대로 사용한다. (JSON을 그대로 사용해본 적이 없고, 코드를 대폭 수정해야 한다.)
- 스프레드시트를 포기하고, JSON 에디터를 사용해서 직접 Construct 3 형태로 작성한다. (아무래도 2차원 편집기를 포기할 수가 없다! 이건 제외)
역시 배열로 변환하지 않고 JSON을 그대로 이용하는 방법이 가장 최선이다.
좋아 가자, 새로운 세계로!!
[반짝이는 우주와 미래 기술을 연상시키는 효과음]
이 확장 앱의 JSON Export 옵션이 핵심이다.
- Export cell arrays : 각 셀에서도 쉼표(,)로 쉽게 배열을 만들 수 있다
- Export sheet arrays : 각 시트를 객체가 아닌 배열로 만든다. (대사와 같은 순서가 필요할 때 체크)
- Export value arrays : 시트의 열이 하나일 때 행의 모든 셀을 배열로 만든다.
최종 코드
코드는 이게 끝이다. 어제부터 나는 대체 무슨 고생을 한 건가? 한 번도 JSON을 이용해보려 한 적이 없어서 그 장점을 모르고 있었는데, 사전처럼 문자열로 구별할 수 있으면서 계층 구조이기 때문에 경로가 이미 정해져 있어 사전보다 단순하면서도 사전과 배열의 장점을 모두 가지고 있다고 말할 수 있다. 나는 오늘부터 JSON만 쓴다. (사전과의 성능 차이는? 아직 모르겠다)
(추가 : 위 그림처럼 Wait 액션으로 LastData를 받으면 다른 이벤트에서 동시에 요청한 데이터와 순서가 꼬일 수 있으므로 항상 AJAX 이벤트와 태그를 이용해서 처리해야 한다.)
'인디 게임 개발 > 개발 일지' 카테고리의 다른 글
로그) 글자 출력 구현 그리고 환장파티 (0) | 2021.02.26 |
---|---|
글자 출력 과정 그리고 혼란파티 (0) | 2021.02.24 |
대사 불러오기 (0) | 2021.02.16 |
화살표 생성, 입력 반응, 상호작용 (0) | 2021.02.13 |
그림 해상도와 게임 해상도, 땅의 높이 정하기 (0) | 2021.01.28 |