TL;DR

  • Easel이 JSON·CSV 데이터 파일 가져오기를 지원해 외부 도구에서 만든 콘텐츠를 더 크고 풍부한 멀티플레이어 게임에 활용할 수 있음.
  • as 키워드로 지정하는 스키마가 데이터의 필드 이름 변경, 형식 변환, 여러 데이터 구조 수용을 처리함.
  • 스키마는 간결하고 읽기 쉬운 변환 규칙을 제공하며, 복잡한 변환은 가져온 뒤 Easel 코드에서 처리하는 설계임.
  • 데이터 가져오기는 컴파일 시점에 수행돼 스키마와 데이터의 불일치를 일찍 찾고, 시작 속도와 다운로드 크기를 개선함.
  • 가져온 데이터는 정적 데이터로 취급돼 롤백 대상에서 제외되며, Tiled·LDtk·Spine 등의 도구에서 만든 콘텐츠와 대규모 데이터셋을 활용할 수 있음.

데이터 가져오기

  • 새 import 문을 사용하면 원시 데이터를 게임 코드의 변수에 할당할 수 있음. 파일 이름을 지정하는 한 줄의 코드만으로 데이터 가져오기를 시작할 수 있지만, 이는 Easel에서 데이터 파일을 활용하는 가장 강력한 방식은 아님.
  • Easel은 브라우저 기반 2D 게임 프로그래밍 언어로, 게임을 자동으로 멀티플레이어 게임으로 만들어 줌.

스키마로 변환하기

  • JSON은 문자열과 숫자 같은 단순한 형식을 지원하지만, Easel은 벡터(Vector), 심벌(Symbol), 색상(Color), 에셋(Asset) 등 더 다양한 형식을 지원함. 데이터를 게임에서 사용할 수 있도록 가져오는 과정에서 이를 Easel의 형식으로 변환해야 함.
  • import 문에서 as 키워드로 스키마를 지정하면 가져온 데이터의 구조를 변환할 수 있음. 예시 스키마는 world.geo.json의 국가 데이터를 가져와 다음과 같이 처리함.
  • properties.iso_a2를 id로 이름을 바꾸고, 주권 국가 이름 속성을 문자열 형식의 name으로 지정함.
  • 위도와 경도에 해당하는 두 속성을 하나의 벡터인 labelPos로 결합함.
  • 도형의 종류를 문자열로 지정하고, 좌표를 벡터 배열 또는 중첩된 벡터 배열로 받아들임.
  • 스키마는 TypeScript의 타입 정의와 비슷해 익숙하게 읽을 수 있지만, 데이터의 현재 구조를 설명하는 데 그치지 않고 게임 코드에 더 유용한 형태로 바꾸는 규칙도 포함할 수 있음.
  • GeoJSON은 도형이 다각형(Polygon)인지 다중 다각형(MultiPolygon)인지에 따라 좌표의 중첩 단계가 달라질 수 있으며, 대체 형식을 지정하면 두 경우를 하나의 스키마에서 처리할 수 있음.

튜링 완전성

  • Easel에는 이미 튜링 완전한 프로그래밍 언어가 있으므로, 스키마 정의는 단순하게 유지하는 선택임. 스키마는 간결하고 읽기 쉬운 방식으로 대부분의 변환을 처리하며, 더 복잡한 작업은 데이터를 가져온 뒤 Easel 코드에서 수행할 수 있음.
  • 컴파일 시점에 Easel 코드를 실행해 변환하는 방식도 검토했지만, 스키마보다 불필요하게 장황해지는 것으로 판단함. 스키마는 반복적인 데이터 변환 규칙을 더 간결하고 간결한 표현으로 작성하게 함.
  • 복잡한 변환을 위해 스키마 안에서 Easel 코드로 전환하는 방법도 검토했지만, 두 언어가 같은 문법을 다르게 해석해 두 언어를 섞어 읽는 일이 혼란을 일으킬 수 있음.

컴파일 시점 변환

  • 동적 프로그래밍 언어는 빠른 프로토타이핑과 반복 작업에 유용하지만 오류가 발생하기 쉬움. 정적 프로그래밍 언어는 사전에 더 많은 선언이 필요하지만 오류를 일찍 찾아 장기적인 생산성을 높일 수 있음.
  • Easel은 동적 타입과 정적 함수 호출을 결합함. 게임 프로그래밍에서는 많은 선택적 매개변수를 받는 함수가 흔하며, PolygonSprite는 매개변수를 40개 받음. 정적 함수 호출은 매개변수를 올바르게 작성했는지 확인하는 데 도움을 줌.
  • 데이터 가져오기도 정적 검사가 중요한 작업으로 보고 컴파일 시점에 수행함. 데이터 파일과 스키마가 일치하지 않으면 컴파일 오류로 보고돼, 게임을 실행하기 전에 데이터를 빠르게 수정하고 스키마와 동기화할 수 있음.

성능

  • 컴파일 시점에 데이터를 가져오면 오류를 일찍 찾을 수 있을 뿐 아니라, 게임이 시작될 때 데이터 처리가 이미 끝나 있어 시작 속도가 빨라짐.
  • 스키마에서 참조하는 데이터만 가져오므로 플레이어가 내려받는 게임의 크기도 줄어듦.

정적 데이터

  • Easel은 게임을 자동으로 멀티플레이어로 만드는 롤백 넷코드(rollback netcode)를 사용하며, 롤백 성능을 위해 롤백할 데이터의 양을 줄이는 것이 중요함.
  • 게임 상태의 변경분만 스냅샷으로 저장하고 롤백하는 증분 롤백 넷코드(incremental rollback netcode)가 도입됐지만, 가장 빠른 방법은 작업 자체를 하지 않는 것임. 이에 따라 가져온 데이터 파일은 정적이며 변경할 수 없음.
  • 데이터 파일을 롤백 시스템의 고려 대상에서 완전히 제외할 수 있어, 파일이 전 세계에 해당하는 규모로 커도 멀티플레이어 게임의 속도를 늦추지 않음.
  • 정적 컬렉션을 지원하려면 엔진 전반에서 배열(Array)과 맵(Map)을 처리하는 방식이 바뀌지만, 게임에서는 그 차이를 느끼지 못하도록 설계함.

JSON과 CSV

  • Easel은 데이터 교환에 널리 쓰이는 두 형식인 JSON과 CSV에서 데이터를 가져올 수 있음.
  • CSV 지원의 주요 이유는 타일맵을 CSV 형식으로 내보내는 LDtk를 지원하기 위해서임. 이에 따라 다음 프로그램의 데이터를 가져올 수 있음.
  • Tiled: 널리 쓰이는 레벨 편집기
  • LDtk: 레벨 편집기
  • Spine: 스프라이트 애니메이션 도구
  • 단어 맞히기 게임을 만들 때 Google Sheets나 Microsoft Excel에서 단어 목록을 작성하고 CSV로 내보낸 뒤 Easel로 가져오는 방식도 가능함.

Geography Dash

  • 새 데이터 가져오기 기능의 활용 사례로 세계 지리 데이터셋을 가져온 게임 Geography Dash를 제작함.
  • Geography Dash에서는 세계 지도에서 특정 국가까지 날아가는 경주를 친구들과 벌임. 에리트레아의 위치를 알고 있는지, 지도가 거꾸로 놓인 상태에서도 그곳까지 날아갈 수 있는지를 시험하는 게임임.
  • Natural Earth는 Nathaniel Vaughn Kelso와 Tom Patterson이 이끄는 자원봉사자 팀이 만든 퍼블릭 도메인 데이터셋임. 이 데이터셋과 Easel을 활용해 세계 곳곳을 무대로 친구들과 멀티플레이어 경주를 할 수 있음.

더 알아보기

  • 데이터 파일 문서에서 스키마 정의와 CSV 파일 가져오기를 포함한 새 기능의 자세한 내용을 확인할 수 있음.

이번 달의 다른 변경 사항

  • 심벌과 문자열 간 변환을 위한 SymbolName, SymbolFromName, ToSymbol 함수.