본문으로 건너뛰기
SheetForge

데이터 스튜디오 — 작성 표면

데이터 스튜디오는 조회, 검색, 셀 편집, 행/컬럼/탭 작성, 시트 생성 및 삭제, 그리고 레코드가 무엇으로 이루어져 있는지 보여주는 레코드 캔버스까지 모든 것을 위한 하나의 창이다. 이 모든 것을 관통하는 규칙은 하나다: 시트가 정본이다. 스튜디오는 소스(로컬 파일 / Google 시트)에 기록할 뿐 SO에는 결코 기록하지 않으며, 모든 변경은 자동 재임포트로 확인된다.

Tools ▸ SheetForge ▸ 데이터 스튜디오가 이 창을 연다 — 메뉴의 유일한 작성 진입점이다. 플러그인이 없어도 된다: 아래의 모든 것은 코어 내장 타입만으로 동작하며, 플러그인은 그 위에 도형(shape)과 읽기 전용 키 공간을 추가한다(플러그인 유무 비교 참고).

작성 창은 오직 하나뿐이다. 더 오래된 워크벤치 — 원조 IMGUI 창 — 는 제거되었으며, 그것이 할 수 있던 모든 일을 스튜디오가 대신한다. 업그레이드 중이라면 워크벤치에는 무슨 일이 있었나를 참고하라.

화면에 보이는 것

툴바

  • 활성 소스 칩은 프로바이더 이름을 나타낸다. 활성 설정이 없으면 흐리게 표시된다.
  • ↓ 시트에서 가져오기는 Import를 실행한다.
  • ↑ 시트로 보내기는 대기 중인 변경 수를 세는 필을 담고 있다.
  • 그 옆의 파기 버튼은 창에 스테이징된 모든 변경을 버린다. 개수를 명시한 확인을 먼저 묻고, 하나의 Ctrl+Z 단계로 처리되므로 실수로 파기해도 스테이징이 되돌아온다. 소스는 결코 건드리지 않는다.
  • isolated / draft 배지.
  • ⛔/⚠ 카운터. 카운터를 클릭하면 첫 번째 에러/경고로 이동한다.
  • Export 실행, Push 실행 (Google 시트), 번역 익스포트…, 번역 임포트…, 상태 점검, 현지화 리포트 열기, **테마 설정…**을 담은 오버플로 메뉴. Google API 소스가 아닐 때도 Google push 항목은 계속 보이지만 비활성화되며, 라벨에 그 사유가 붙는다. 프로젝트에 현지화 시트가 하나도 없을 때는 두 번역 항목도 같은 방식으로 동작한다.

사이드바

  • 맨 위에는 All 항목이 있다 — 여러 시트를 아우르는 검색이며, 아래에서 설명한다.
  • 그다음 각 시트를 행 수, 색상 점과 함께 보여주며, 스테이징된 변경을 가진 시트에는 마커가 붙는다. 상단 바의 필이 전체 개수를, 이것이 어느 시트에서 왔는지를 알려준다.
  • 시트 자신의 @style 그룹 라벨에 따라 섹션으로 묶인다. 시트를 우클릭 ▸ **그룹·색 ✎**으로 설정하며, 라벨이 없는 시트는 기본 섹션에 남는다.
  • 시트 목록 아래에는 플러그인이 등록한 코드 레지스트리를 나열하는 읽기 전용 그룹이 있다.
  • 정직한 배지도 여기 있다: 미리보기에서 누락된 탭에는 parse failed, 코드 레지스트리가 실제 시트의 이름을 사용할 때는 name clash, 그리고 아래에서 설명하는 격리(quarantine) 알림.
  • 현재 차단된 각 우클릭 항목은 그 사유가 붙은 채로 계속 보인다.

테이블

  • 고정된 네 행 헤더: 원본 @name / @type / @desc 셀 위에 원본 시트 컬럼 문자. A열은 마커 전용이므로 데이터는 B열부터 시작한다.
  • 실제 시트 행 번호를 담은 거터, 그리고 행별 참조 칩 — 두 개 이상의 레코드가 이 행을 가리키면 shared N, 정확히 하나면 ↩ 1, 없으면 표시 없음.
  • 문자와 행 번호는 에러 리포트가 출력하는 것과 동일한 좌표이므로 "5행, C열"을 그대로 가리킬 수 있다. 이를 클릭하면 다중 대상 작업과 드래그 이동을 위해 그 컬럼이나 행이 선택된다 — 아래 행과 컬럼 선택하기 참고.
  • 문자는 컬럼이 아니라 자리에 속한다. 컬럼을 이동하면 반영되었을 때 그 컬럼이 앉을 위치의 문자가 표시된다. 추가했지만 아직 push하지 않은 컬럼에도 곧 받게 될 문자를 보여주는 것과 같은 규칙이다.
  • 구조 편집은 우클릭 메뉴에 있다. 컬럼 헤더는 속성, 이동, 양쪽 삽입, 삭제를 제공하고, 행 번호 거터는 위로 이동, 아래로 이동, 삭제를 제공한다. 차단된 항목은 사유가 붙은 채로 계속 보인다.
  • 컬럼 헤더는 이 컬럼까지 고정도 제공하며, 이는 그 컬럼과 그 왼쪽의 모든 컬럼을 가로 스크롤 밖에 고정한다(아래 참고).
  • 컬럼 메뉴의 나머지 항목 — 열 너비, 데이터 크기에 맞추기, 숨기기, 필터, 열 데이터 삭제, 정렬 항목들 — 은 아래 열 너비, 숨기기, 열별 필터 절에서 설명한다. 각 문자 셀의 오른쪽 가장자리에는 크기 조절용 드래그 손잡이가 있다.
  • 참조 셀 안에서는 깨진 리스트 조각만 강조 표시된다.

캔버스

  • 행을 활성화하면 테이블 아래에 열린다.
  • 열어본 레코드는 가운데 자리한다: 그것이 소비하는 것은 왼쪽에서 흘러들어오고, 그것을 소비하는 것은 오른쪽에 선다. 캔버스 위의 세그먼트 컨트롤이 각 방향으로 얼마나 멀리 볼지 정한다.
  • 손잡이를 드래그해 크기를 조절하고, Esc로 닫는다.
  • 각 노드 카드는 참조 포트와 평범한 컬럼을 편집 가능한 값 행으로 보여주므로, 캔버스는 그림이 아니라 두 번째 편집 장소다(아래 캔버스에서 편집하기 참고).

노드 인스펙터

캔버스 오른쪽 아래. 다음을 담는다:

  • 노드의 셀 주소(클릭하면 그리드에서 해당 셀에 초점);
  • "공유된 레코드" / "이 키는 존재하지 않음" / "이 레코드는 신규임" 메모;
  • Used by 목록(항목을 클릭하면 그곳으로 이동);
  • 내장된 Go to this sheet 액션;
  • 해당될 때의 Duplicate and split / Cancel new row.

Problems

하단 패널은 임포트가 만들어내는 것과 동일한 진단 정보를, 동일한 리포트 렌더러로 표시한다. 파이프라인이 진실 공급원이며, 창은 결코 메시지를 스스로 지어내지 않는다. 행을 클릭하면 문제가 된 셀에 초점을 맞추고 그 캔버스를 연다.

도메인 패널

플러그인이 등록한 패널마다 하나의 세그먼트를 가진 오른쪽 패널로, 접을 수 있으며 어느 것을 열어두었는지 기억한다. 플러그인이 패널을 등록했을 때만 그려진다 — 아무것도 등록되지 않았을 때 빈 상자가 남지 않는 것은, 빈 상자가 무언가 빠져 있다고 주장하는 셈이기 때문이다.

Push 모달

기록 전 diff: 스테이징된 모든 변경에 대해 탭 · 행 키 · 필드 · 이전 → 이후, 그리고 일부 편집이 격리된 경우의 메모. Addressables 섹션은 반영이 만들 모든 에셋 등록을 나열한다(추가 · 이동 · 그룹 생성 — 셀 편집하기 참고). Cancel은 아무것도 기록하지 않는다.

셀 편집하기

  • 위젯은 @type을 따른다. 읽어들이는 @type은 화면에 보이는 그것이므로, 추가하거나 다시 타이핑했지만 아직 push하지 않은 컬럼도 이미 해당 타입의 위젯을 받는다.
    • 필수 bool은 토글이다. 선택적 bool은 상태가 세 가지이므로 enum 셀이 쓰는 것과 동일한 피커를 연다.
    • Enum<T>은 값에 ▾를 붙여 보여주며, 참조 셀이 쓰는 것과 동일한 검색 가능한 피커 창을 연다. 인식되지 않은 값은 조용히 재작성되는 대신 목록 맨 위에 남으며, enum이 시트에 정의된 경우에는 피커 끝에 **"새 멤버 추가…"**가 붙는다. 빈 선택적 셀은 , 또는 **— (기본값)**으로 표시된다.
    • RecordId@Tab 컬럼은 참조 드롭다운을 받는다(아래 참고).
    • AssetRef@Group 컬럼은 에셋 피커가 붙고 드롭도 받아들인다(아래 참고).
    • Color / AnimationCurve / Gradient 컬럼은 Unity 자신의 색상, 커브, 그라디언트 필드를 받는다(아래 참고).
    • 그 외의 모든 것 — 숫자, 문자열, 키, 참조가 아닌 List<>, 래퍼, 커스텀 타입 — 은 정본 그대로의 원문 텍스트다. 그 텍스트가 곧 파서가 라운드트립하는 것이기 때문이다.
  • 참조 셀에는 항상 드롭다운이 있다. RecordId@Tab 셀은 텍스트 박스 더하기 ▾ 버튼이다. 손으로 직접 키를 입력하는 것도 여전히 동작한다. 대상 시트가 현재 후보를 전혀 제공하지 않을 때도 버튼은 그 자리에 있다 — 그 상태는 대개 지금 무언가 깨져 있다는 뜻이며, 바로 그럴 때 이 도구가 필요하다. 피커는 그 사실을 알려주고 빈 목록을 여는 대신 생성을 제안한다.
    • List<RecordId@Tab> 셀은 +▾를 받는다. 피커가 열린 채로 유지되며 각 행은 체크박스여서, 세 개의 레코드를 체크하는 데 한 번의 방문이면 된다. 체크하면 추가되고, 체크를 풀면 그 요소가 제거되며, 각 체크는 그 자체로 하나의 undo 단계다.
    • 요소의 순서는 드롭다운이 답하는 것이 아니다. 요소 순서 변경은 캔버스에서 한다(리스트의 각 요소는 자신만의 ▲▼ 행을 갖는다).
    • 스칼라 셀은 값을 바꾸고 닫히며, 셀에 이미 있는 키는 두 번 선택할 수 없도록 표시된다.
  • 선택적 컬럼은 다시 비워둘 수 있다. 컬럼이 ? 또는 =default를 선언한 경우, 피커들 — 참조·enum·선택적 불리언 모두 — 은 셀이 대체될 값을 라벨로 단 비워두기 행을 갖는다. 필수 컬럼에는 이런 행이 없다 — 그곳에서는 빈 셀이 에러이기 때문이다.
  • 셀에서 바로, 없는 레코드를 만든다. 원하는 키가 존재하지 않으면 피커에서 + 새 … 레코드 생성을 누른다: 검색 박스가 시트의 공통 접두사로 미리 채워진 키 박스로 바뀐다. 이름을 입력하고 Enter를 누르면, 행이 생성되고 동시에 이 셀에 기록되며, 이는 하나의 Ctrl+Z 단계다.
    • 동작할 수 없을 때는 이 항목이 제공되지 않는다. 코드가 소유한 키 공간에는 추가할 수 없으며(피커가 문장으로 알려준다), 읽기 전용 소스, 실행 중인 파이프라인, 또는 xlsx 기반 시트는 캔버스가 사용하는 것과 동일한 게이트로 이를 차단한다.
  • 에셋 셀에는 피커가 있고, 드롭도 받아들인다. AssetRef@Group 셀은 텍스트 박스 더하기 버튼이며, Unity의 오브젝트 필드와 같은 정신으로 만들어졌다. 에셋이 어느 경로로 도착하든 규칙은 동일하다.
    • **⊙**는 SheetForge 에셋 피커를 연다: 그 그룹에 이미 있는 주소들을 — 컬럼에 <Type>이 있으면 그것으로 좁히고, 서브 에셋은 자신의 부모 뒤에 parent[sub]로 나열하며 — 검색과 함께, 현재 값을 표시해 보여준다. 목록 아래의 ⊙ 프로젝트 찾아보기… 줄은 그 타입으로 필터링된 Unity 자신의 오브젝트 피커를 연다.
    • Project 창에서 셀로 에셋을 드래그할 수도 있다: 스칼라 컬럼에는 에셋 하나, List<>에는 몇 개든(순서대로 추가되며, 셀에 이미 있는 키는 건너뛴다).
    • 그 그룹에 이미 등록된 에셋은 자신의 주소를 그대로 유지한다. 아직 어드레서블이 아닌 에셋은 등록 대기로 스테이징된다: 셀은 즉시 그 주소를 — 확장자를 뺀 파일 이름을 — 받으며, 그룹 항목은(그리고 아직 존재하지 않으면 그룹 자체도) 시트 기록이 성공한 뒤 반영할 때 생성된다. 그전까지는 프로젝트 안에서 아무것도 바뀌지 않으며, 스테이징을 버려도 아무것도 바뀌지 않는다.
    • 다른 그룹에 이미 등록된 에셋은 먼저 묻는다 — 두 그룹의 이름과, 기존 그룹을 통해 그 에셋을 참조하는 다른 셀이 몇 개인지 알려주는 대화상자다 — 그런 다음 이동을 스테이징한다.
    • 다음은 거부되며, 이유를 알려주는 토스트가 뜬다: 씬 오브젝트, 폴더, 스칼라 셀에 드롭된 여러 에셋, 컬럼의 타입을 만족하지 않는 에셋, 그리고 그 그룹의 다른 에셋이 이미 쓰고 있는 주소.
    • 스테이징된 등록은 push 모달의 Addressables 아래에 나타나며 상단바 필 개수에도 반영된다. Ctrl+Z는 셀 값과 등록을 함께 제거한다; 셀을 다시 입력해 그 주소를 더 이상 아무것도 참조하지 않게 되면 같은 단계에서 등록도 함께 사라지므로, 낡은 등록이 홀로 살아남는 일은 없다.
    • 모든 에셋 셀은 오른쪽에 상시 버튼도 갖는다: 누르면 Project 창이 그 에셋을 핑하고 선택한다 — 리스트 셀은 담고 있는 모든 에셋을 선택하고 첫 번째를 핑하며, parent[sub] 주소는 서브 오브젝트 자신을 핑한다. 셀을 Ctrl+클릭(macOS에서는 Cmd+클릭)해도 동일하게 동작하며, 평범한 클릭은 여전히 텍스트를 편집한다. 주소가 에셋으로 해석되지 않을 때는 버튼이 계속 보이되 비활성화되며, 사유가 툴팁으로 붙는다.
    • 셀을 우클릭하면 프로젝트에서 핑을 — 리스트 셀도 포함해서 — 제공하며, 선택적 컬럼에서는 **지우기(기본값)**를 제공한다. 캔버스의 값 행도 동일한 핑 버튼을 갖는다. 같은 위젯이기 때문이다.
    • Problems는 반영하기 전에 UnknownAssetKeyAssetTypeMismatch를 보고하며, 스테이징된 등록은 에러가 아니다 — 프로젝션이 이미 이를 반영해 센다. Addressables 패키지가 없으면 ⊙ 버튼과 드롭은 사유를 툴팁으로 단 채 비활성화되지만, 주소를 직접 입력하는 것은 여전히 동작한다.
  • 에셋 셀은 에셋 자체를 보여준다. AssetRef 셀의 주소가 해석되면 텍스트 옆에 작은 썸네일이 선다 — 에디터가 미리보기를 그려낼 수 있는 모든 에셋 타입이 대상이며, 행 높이가 결코 바뀌지 않도록 크기가 맞춰진다. List<> 셀은 첫 번째 요소의 썸네일을 보여준다.
    • 썸네일을 클릭하면 떠 있는 확대 보기가 열리며, 레코드 캔버스에서는 이미지 에셋이 카드 위에 크게 그려진다.
    • 해석되지 않는 주소는 그냥 썸네일을 보여주지 않는다 — ↗ 핑 버튼이 이미 그 사유를 담고 있다.
  • AssetRef<AudioClip> 셀은 재생된다. 클립 주소 옆의 재생 버튼은 에디터 자신의 미리듣기 채널로 이를 재생한다; 다시 누르면 멈추고, 다른 곳으로 넘어가도(셀 전환, 창 닫기, 도메인 리로드) 멈춘다.
    • 에디터 빌드가 미리듣기 기능을 제공할 수 없을 때는 버튼이 계속 보이되 비활성화되며, 사유가 툴팁으로 붙는다. 에셋이 오디오 클립이 아닌 셀에는 아예 버튼이 없다.
  • 색상, 커브, 그라디언트 셀은 곧 네이티브 필드다. Color, AnimationCurve, Gradient 스칼라 셀은 그 자체가 Unity의 색상 필드, 커브 필드, 그라디언트 필드다 — 셀 전체가 그렇지, 원문 텍스트가 아니다.
    • 모든 변경은 정규 텍스트로 커밋된다(시트 문법 참고). 색상 피커를 드래그하거나 커브 에디터 세션을 여는 것 같은 한 묶음의 변경은 하나의 undo 단계로 합쳐진다 — 타이핑이 따르는 것과 같은 규칙이다.
    • 선택적 컬럼에서 빈 셀은 **—**로 표시된다. 클릭하면 타입 기본값으로 필드가 열리고, 우클릭 ▸ **지우기(기본값)**로 다시 비울 수 있다.
    • List<Color>, List<AnimationCurve>, List<Gradient>칩 에디터다: 요소마다 칩 하나(스와치, 커브 썸네일, 그라디언트 바)와 칩 하나. 클릭하면 요소마다 네이티브 필드와 ▲▼, ✕가 있는 팝업이 열린다; 추가·제거·순서 변경과 각 요소 편집은 각각 자신만의 undo 단계다 — 리스트의 순서도 데이터이기 때문이다. 다른 타입의 리스트는 정본 텍스트 그대로 남는다.
    • 캔버스의 값 행도 정확히 동일한 위젯을 사용한다.
  • 컬럼 폼에서 에셋 컬럼을 하나의 타입으로 제한한다. 컬럼 속성 폼에서 — 그리고 컬럼 추가 폼과 시트 생성 폼에서도 — @type 필드 옆에는 타입… 버튼이 항상 있다; 입력 중인 표기가 AssetRef@Group일 때는 활성화되고, 그렇지 않으면 사유를 알려주는 툴팁과 함께 비활성 상태로 남는다. 이 버튼은 프로젝트가 로드할 수 있는 에셋 타입을 나열하고(검색 가능, 짧은 이름과 부제로 전체 이름), 필드를 AssetRef@Group<Type>로 다시 쓴다 — List<>, ?, =default는 그대로 둔다; **제한 없음(모든 에셋)**은 <…>를 제거한다. 손으로 직접 제한을 입력하는 것도 동작한다. 컬럼 헤더 툴팁은 해석된 전체 타입 이름을 보여준다.
  • 입력한 것이 곧 즉시 보이는 것이다. 그리드 텍스트는 baseline에 스테이징을 더한 것이므로, 검증을 결코 기다리지 않는다. 커밋된 값은 커밋되는 순간 곧바로 스테이징 색을 띤다 — 드롭다운에서 고른 값이든, 시각적 값 편집이든, 빠른 타이핑이든 마찬가지이며, 셀이 아직 포커스를 가진 동안에도 그렇다. 더 무거운 미리보기(Problems, 카운터, 칩, 캔버스)는 키 입력마다가 아니라 편집 묶음마다 한 번씩 재계산된다 — 다만 캔버스에서의 일회성 제스처 이후에는 그 자리에서 다시 그려진다는 예외가 있다.
  • 입력하는 동안의 인라인 검증은 없다 — 진단 정보는 오직 하나의 채널(사전 검증/임포트 검증기)에서만 나오며, Problems 패널에 표시된다.
  • + Row는 제안된 id(공통 접두사 감지, 충돌 안전)를 가진 레코드를 추가한다. 스테이징된 모든 변경 — 셀 편집, 키 편집, 행 추가, 모두 파기 — 은 하나의 Ctrl+Z / Ctrl+Y 단계이며, 스테이징된 변경이 있는 채로 창을 닫으면 저장/파기/취소를 묻는다.
  • ↑ 시트로 보내기는 공유 디스패처를 실행한다: 사전 검증 → 소스별 쓰기 반영 → 자동 재임포트. 키 이름 변경은 여전히 "N개의 참조가 업데이트됩니다 — 계속하시겠습니까?"라고 묻고, Google push는 무언가 전송되기 전에 여전히 계획 승인을 보여준다.
  • 정직한 게이트:
    • 읽기 전용 소스(Google ExportUrl)는 마우스 오버 사유와 함께 편집과 push를 비활성화한다;
    • xlsx 원본 탭은 배지와 함께 읽기 전용이다(작성 반영은 xlsx를 건너뛴다);
    • 임포트/export/push가 실행되는 동안에는 pull과 push가 비활성화된다.

행과 컬럼 선택하기 — 그리고 드래그하기

그리드의 좌표는 스프레드시트에서와 마찬가지로 손잡이다.

  • 행 번호를 클릭하면 그 행이, 컬럼 문자를 클릭하면 그 컬럼이 선택된다.
    • Ctrl+클릭은 선택에 더 추가하고, Shift+클릭은 마지막으로 클릭한 지점부터의 범위를 선택한다.
    • 헤더와 본문은 선택된 모든 것을 강조 표시하며, 키보드가 자리한 셀은 화살표 키 이동을 따라가는 선택 윤곽선을 그린다.
    • 시트를 전환하면 선택이 풀린다 — 그곳에서는 같은 번호가 다른 컬럼을 가리키게 되기 때문이다 — 그리고 메뉴에는 선택 해제 항목이 있다.
  • 선택을 드래그해 옮긴다. 선택된 행 번호(또는 컬럼 문자)를 잡고 드래그하면, 삽입선이 놓일 위치를 따라가며, 놓으면 그 선택을 그 자리로 옮기는 하나의 Ctrl+Z 단계가 된다.
    • 떨어져 있는 선택 — 이를테면 2, 5 그리고 9행 — 은 선택한 순서 그대로 놓인 지점에 모여서 도착한다.
    • 정렬·검색·필터가 보이는 순서를 고정하고 있는 동안에는, 메뉴 항목이 스스로 비활성화되는 것과 같은 이유로 행 이동도 계속 거부된다 — 그리고 드래그를 시작하는 순간 조용히 움직이지 않는 대신 그 사실을 즉시 알려준다.
  • 우클릭 메뉴는 선택 전체에 작용한다. 여러 컬럼이 선택된 상태에서는 열 너비…, 데이터 크기에 맞추기, 숨기기, ◀▶ 이동, 삭제, **열 데이터 삭제…**가 선택된 모든 컬럼에 적용되며, 여러 행이 선택된 상태에서는 이동과 삭제가 그 모두를 아우른다 — 각 배치는 하나의 undo 단계다.
    • 한 번에 하나의 대상에만 의미가 있는 항목들 — 속성, 필터, 정렬, 고정, 삽입 — 은 각자의 단일 대상 섹션에 따로 선다.
    • 차단된 항목은 다른 모든 곳과 마찬가지로 그 사유가 붙은 채로 계속 보인다.

선택은 화면 시점의 제스처다: 어떤 동작이 그것을 쓰기 전까지는 아무것도 스테이징되거나 기록되지 않는다.

메뉴들 자체가 이제 하나의 컴포넌트다. 스튜디오의 모든 컨텍스트 메뉴와 드롭다운 메뉴 — 컬럼 헤더, 행 거터, 툴바의 ⋯, 사이드바, 캔버스 노드와 와이어, 셀 메뉴 — 는 모두 같은 모양이다: 제목이 붙은 섹션, 체크 표시, 키보드 탐색, 그리고 사유가 붙은 채로 자리를 지키는 비활성 항목. 웹 앱의 메뉴와 같은 모양이므로, 둘 사이에 다시 배울 것이 없다.

캔버스에서 편집하기

캔버스는 테이블과 동일한 스테이징 버퍼를 편집한다 — 아래의 모든 것은 평범한 스테이징된 변경이다: Push 모달에 표시되고, 하나의 Ctrl+Z 단계이며, 동일한 사전 검증과 재임포트 체인으로 다시 기록된다.

무엇이 그려지는가

모든 것은 한 방향으로 흐른다: 왼쪽에는 재료, 오른쪽에는 그것을 사용하는 것들이며, 그 사이에 열어본 레코드가 있다.

캔버스 위의 세그먼트 컨트롤이 각 방향으로 얼마나 멀리 볼지 정한다:

  • 재료 → 이것 → 사용처 — 각 한 단계씩;
  • 재료만 — 조립 체인을 따라가기 위한 두 단계;
  • 사용처만.

자신만의 참조 컬럼이 없는 시트는 왼쪽에 아무것도 없으므로, 그중 마지막 것만 제공한다. 단계 제한이 있는 이유는 널리 쓰이는 재료 하나가 프로젝트 전체를 화면에 쏟아붓지 못하게 하기 위해서다. 더 멀리 보려면, 이웃을 더블클릭해 그것을 새로운 종착점으로 만든다.

  • 같은 레코드에 두 번 도달해도 여전히 하나의 노드다.
  • 존재하지 않는 레코드도 어쨌든 그려지며 깨짐으로 표시된다 — 보이지 않는 링크는 고칠 수 없는 링크이기 때문이다.
  • 순환도 숨겨지지 않는다 — 순환을 닫는 엣지는 카드들 아래의 차선을 따라 점선으로 되돌아가므로, 어디로 돌아가는지 따라갈 수 있다.

레이아웃은 결정적이다 — 같은 데이터는 항상 같은 그림을 만든다. 노드 위치는 세션 동안 드래그할 수 있으며, 드래그한 위치는 의도적으로 저장되지 않는다.

노드 위에는 무엇이 있는가

헤더는 키, 부제(자신의 시트, 또는 플러그인이 제공한 사람이 읽기 쉬운 이름), 셀 주소, 그리고 다른 무엇이 이 레코드를 가리키는지 세는 배지를 담는다.

그 아래에는 참조 포트가 항상 보인다. 포트는 와이어가 꽂히는 곳이므로, 하나를 숨기면 그림이 거짓말을 하게 된다. 각 포트는 채워지거나 빈 점, 무엇을 받아들이는지, 몇 개가 연결되어 있는지를 보여준다. 리스트 포트는 그 요소를 순서대로 보여주며, 각각 이동·제거 컨트롤을 갖는다 — 리스트의 순서는 데이터이기 때문이다.

평범한 컬럼들은 "n개의 값" 그룹으로 접히며, 종착점에서는 펼쳐지고 그 외에는 닫혀 있다. 각 행은 입력할 수 있는 값 행이다 — 그리드가 사용하는 것과 동일한 위젯이며, 동일한 게이트를 거쳐 커밋된다. 포트의 점은 그것이 받아들이는 시트의 색으로 물들어, 하나의 체인이 하나의 색으로 읽힌다.

카드는 테이블이 보여주는 것과 동일한 프로젝션을 보여준다. 이번 배치에서 스테이징된 컬럼 — 아직 반영되지 않았고, 필수 컬럼과 참조 타입도 포함 — 은 이미 카드 위에 서 있으며, 테이블의 헤더가 표시하는 것과 같은 방식으로 대기 중임이 표시된다(툴팁 포함): 스테이징된 참조 컬럼은 포트로 나타나고, 스테이징된 평범한 컬럼은 값 행으로 나타나며, 스테이징된 이름 변경은 원래 값 위에 새 이름을 보여주고, 스테이징된 삭제는 카드에서도 그 행을 제거한다. 채워진 시트에 필수 컬럼을 추가해도 빈 셀이 아직 채워지는 중이라고 카드가 비어 보이게 만들지 않는다 — 캔버스는 그리드가 하는 것과 정확히 똑같이, 반영 이후의 시트 모습을 계속 보여준다.

오른쪽 어깨에는 단 하나의 출력 점이 있다. 이 레코드가 내보내는 것은 자기 자신뿐이므로 하나만 있으며, 여기서 드래그하는 것은 포트를 드래그하는 것("이것은 무엇을 가리키는가?")과 반대되는 질문("나는 이것을 어디에서 쓰는가?")을 던진다.

그 점은 프로젝트 안의 어떤 시트가 실제로 이 시트를 받아들이는 컬럼을 가지고 있을 때만 그려진다 — 갈 곳이 없는 점은 반드시 실패하는 어포던스이기 때문이다. 판정 기준은 데이터가 아니라 스키마다: RecordId@ThisSheet를 선언하는 컬럼은 그 누구도 단 한 행을 쓰기 전부터 이 점을 살아 있게 만든다.

제스처와 메뉴

점이 곧 손잡이다. 포트 점을 누르면 제스처가 시작되고 그 행의 다른 곳을 눌러서는 시작되지 않으므로, 실수로 아무것도 잡히지 않는다. 움직이지 않고 누르고 떼면 그냥 클릭이다.

  • 카드의 헤더는 그 자체로 손잡이다:
    • 클릭하면 카드가 선택되고, 겹치는 다른 카드보다 위로 올라오기도 한다;
    • 드래그하면 이번 세션 동안 카드가 이동한다;
    • 더블클릭하면 그 레코드가 새로운 종착점이 된다.
  • 빈 캔버스를 우클릭 → New record. 계단식 피커가 열린다: 왼쪽 창은 현재 그려진 포트들이 가리키는 시트를 나열하고, 오른쪽 창은 검색, 생성, 레코드 목록을 담으며, 둘 이상의 포트가 받을 수 있을 때는 세 번째 페이지가 어느 포트가 이 레코드를 받을지 묻는다.
    • 플러그인은 그 시트 목록을 좁히거나 넓힐 수 있다. 화면의 어떤 포트도 받아들이지 않는다고 선언한 시트는 사라지는 대신 사유가 붙은 채로 목록에 남는다.
    • 여기에는 맥락 없는 "새 레코드"가 없다 — 캔버스에서 태어나는 모든 레코드는 연결된 채로 태어난다. 독립된 행을 만들고 싶다면 테이블의 + Row를 쓴다.
  • 빈 포트 점을 클릭하거나, 노드를 우클릭 → Connect로 그 컬럼을 연결한다. 피커는 커서 위치에 열리며 그리드가 사용하는 것과 동일한 검색 가능한 키 목록이다.
    • 두 개의 헤더 줄이 그 슬롯이 무엇을 받아들이는지와 선택 결과가 어느 셀에 기록될지를 알려준다.
    • 각 행은 키, 표시 이름, 그리고 이미 몇 곳이 그것을 가리키는지를 담으며, 이미 여기에 연결된 키는 조용히 중복되는 대신 표시된다.
    • 원하는 레코드가 아직 없다면, 검색 박스는 시트의 공통 접두사가 채워진 키 박스가 된다. 이름을 입력하고 Enter를 누르면 하나의 제스처로 생성되고 동시에 연결되며, 이는 하나의 Ctrl+Z로 되돌릴 수 있다. 이름이 비어 있거나 이미 사용 중이면 아무것도 생성하는 대신 그 사실을(그리고 어디서인지) 알려준다.
  • 캔버스에서 만든 레코드가 곧 캔버스가 된다. 카드를 더블클릭했을 때와 같은 방식으로 뷰가 그 레코드로 이동하므로, 새 레코드가 방금 만든 링크와 함께 가운데 자리한다. (분기는 예외다 — 분기의 요점은 종착점이 자신만의 사본을 유지하는 것이므로, 뷰는 제자리에 남는다.)
  • 빈 포트 점에서 드래그하면 와이어가 커서를 따라온다: 카드 위에 놓으면 연결되고, 빈 캔버스에 놓으면 그 자리에 피커가 열린다.
    • 출력 점에서 드래그하면 반대 방향으로 동작한다. 카드 위에서 놓으면 캔버스가 그 카드의 어떤 컬럼이 이 레코드를 받을 수 있는지 찾는다(후보가 하나면 곧바로 연결되고, 여럿이면 어느 것인지 묻는다). 빈 캔버스에 놓으면 이를 받을 수 있는 시트들의 거울상 계단식 목록이 열리며, 여기에는 화면에 없는 시트도 포함된다.
    • 드래그가 진행되는 동안 관련 없는 모든 것은 흐려지고 이를 받아들일 수 있는 포트는 빛나므로, 유효한 대상이 추측이 아니라 눈에 보인다.
    • 완료된 모든 제스처는 어느 셀에 기록했는지 이름을 알리는 짧은 토스트로 응답한다 — 그리고 중요할 때는, 그 링크가 순환을 닫았거나 레코드가 이제 다른 누군가와 공유된다는 사실도 함께.
  • 이미 꽂혀 있는 링크를 집어 든다. 채워진 단일 참조 포트를 드래그하면 소켓에서 케이블을 뽑듯 바로 그 와이어가 들린다. 다른 카드에 놓으면 재조준되고, 다른 포트에 놓으면 링크가 두 셀에 걸쳐 이동한다(여전히 하나의 undo 단계이며, 두 계획이 모두 성립하지 않으면 어느 셀도 기록되지 않는다). 원래 있던 곳에 다시 놓거나 Esc를 누르면 아무것도 바뀌지 않는다.
    • 빈 캔버스에 놓으면 커서 위치에 그 셀의 피커가 열리며, 연결 해제는 그 자리에서 바로 실행되는 대신 그 안의 한 줄로 제공된다 — 손이 미끄러졌다고 링크가 지워져서는 안 되기 때문이다.
    • 그런 점을 움직이지 않고 클릭하면 대신 그 와이어가 선택되므로, 두 제스처는 서로에게 결코 대가를 치르게 하지 않는다.
    • 채워진 스칼라 포트도 다른 누군가의 드래그에 대해서는 여전히 유효한 대상이다 — 그 위에 놓으면 교체를 의미한다.
    • 리스트 포트는 들어 올릴 단일 와이어가 없으므로 항상 새로운 링크를 시작한다. 요소 하나를 제거하거나 순서를 바꾸는 것은 그 요소 자신의 ✕ / ▲▼ 행이 하는 일이다.
  • 와이어의 몸통은 드래그가 아니라 선택을 위한 것이다. 와이어를 따라 어디든 클릭하면 — 클릭 가능한 띠가 경로의 모든 구간을 따라간다 — 그것이 선택되고 와이어 인스펙터가 열린다. Delete 또는 우클릭 ▸ Disconnect는 연결을 끊는다. 재조준은 위의 포트 제스처이므로, 각 동작마다 정확히 한 가지 방법만 있다.
  • 노드를 우클릭 → Delete this record. 하나의 대화상자가 사라질 모든 것의 이름을 알려준다: 그 레코드를 가리키는 연결이 몇 개인지, 그 행의 스테이징된 편집이 몇 개나 사라질지.
  • 공유된 레코드를 분기한다. 레코드가 여러 곳에서 사용될 때, 노드 인스펙터는 Duplicate and split을 제공한다: 모든 컬럼을 새 키(시트의 접두사에서 제안됨)로 복제하고, 캔버스의 링크만 그 사본으로 재조준한다. 하나의 undo 단계이며, 다른 모두가 사용하는 레코드는 그대로 남는다.
  • 와이어 인스펙터는 선택된 와이어와 함께 열린다. 한 줄이 하나의 토큰이라는 원칙을 따른다: 링크가 기록되는 셀, 그리고 그 셀의 전체 텍스트를 토큰으로 나누어 이 줄에 해당하는 것에 표시한다.
    • 그 엣지를 연 플러그인이 이를 서술하는 경우, 키가 아닌 토큰 부분(attack:add:10add:10)을 편집하는 행이 하나 더 있다. 그 행을 편집하면 나머지 부분만 재작성된다 — 그것이 무엇을 가리키는지 바꾸는 것은 재조준이며, 이는 포트 제스처다.
    • 여기서 그것이 가리키는 레코드를 열거나, 링크를 자를 수도 있다.
  • Delete 키는 선택 상태를 읽고, 그 선택이 여기서 무엇을 의미하는지 묻는다.
    • 와이어가 선택된 상태라면 그 와이어의 연결을 끊는다.
    • 카드가 선택된 상태라면 그 카드가 열어본 레코드인지에 따라 달라진다. 종착점 — 가운데 있는 카드, 이 화면이 다루는 레코드 — 에서는 메뉴 항목과 동일한 확인 대화상자를 거쳐 레코드를 삭제한다.
    • 다른 어떤 카드에서는 그 카드와 이 화면 사이의 모든 연결을 한 번에 자른다 — 여기서 그 카드는 주제가 아니라 재료이기 때문이다. 하나의 undo 단계이며, 계획들이 사슬처럼 묶여 있어 리스트 컬럼은 마지막 하나만 남기는 대신 일치하는 요소 전부를 잃으며, 자를 수 없는 연결은 조용히 넘어가는 대신 이유를 알려준다.
    • (우클릭 ▸ Delete this record는 어느 카드에서든 항상 삭제를 의미한다 — 키는 선택에 따라 의미가 달라지는 단축키이고, 메뉴 항목은 명시적인 쪽이다.)
    • 플러그인이 그린, 시트 행이 아닌 카드는 삭제하거나 연결을 끊을 대상이 없으므로, 이 카드에서는 키가 아무 일도 하지 않는다.
  • 아무것에도 연결되지 않은 신규 레코드는 다른 사람의 캔버스에 그려지지 않는다. 새 행은 스테이징된 연결이 화면 위 무언가와 그것을 묶어줄 때만 여기 나타난다 — 그렇지 않으면 테이블의 미완성 행 하나가 프로젝트의 모든 캔버스를 따라다니게 될 것이다.
    • 이로 인해 잃는 것은 없다. 캔버스에서 레코드를 만들면 즉시 뷰가 그곳으로 이동하므로 방금 만든 행이 바로 보고 있는 것이며, 테이블에서 만든 행은 테이블에 남는다. 결국 아무것에도 연결되지 않은 채로 남는 행은 그려진 적이 있든 없든, 버려지기 전에 반영 대화상자의 파기 목록에 이름이 오른다.
  • Ctrl/Cmd + 휠은 커서 아래 지점을 고정한 채로 캔버스를 25 %에서 200 % 사이로 확대/축소한다. 캔버스 헤더의 퍼센트 표시는 100 %로 되돌아가는 버튼이다. 그냥 휠은 여전히 스크롤한다.
  • 가운데 마우스 버튼 — 또는 Alt + 왼쪽 버튼 — 을 드래그해 팬(pan)한다. 누르고 있는 동안 커서가 바뀌므로, 그 위의 무언가가 아니라 뷰 자체가 움직이고 있다는 것이 분명해진다.
    • 왼쪽 드래그만으로는 여전히 "선택하고 연결하기"를 의미하므로, 팬에는 자신만의 버튼이 주어졌다. Alt + 왼쪽은 가운데 버튼이 없는 마우스와 트랙패드를 위한 동일한 제스처다.
    • 팬은 콘텐츠의 가장자리에서 멈춘다: 이는 무한한 평면이 아니라 스크롤 뷰이므로, 그래프를 빈 공간 속에서 잃어버릴 수 없다.

연결 해제와 거부

연결 해제는 누르기 전에 무슨 일이 일어날지 알려준다. 지우기는 결코 거부되지 않지만, 메뉴 항목이 그 결과를 명확히 알려준다:

  • 기본값이 있는 선택적 컬럼은 그 기본값으로 대체된다 — 그래서 와이어는 사라지지만 레코드는 런타임에도 여전히 해석된다;
  • 기본값이 없는 선택적 컬럼은 그냥 비워진다;
  • 필수 컬럼은 빈 셀이 되어 Problems 패널이 이를 보고한다 — 그 상태로 스테이징할 수 있으며, 사전 검증은 채울 때까지 반영을 막는다;
  • 리스트는 그냥 그 요소 하나를 잃는다.

검증은 하나의 채널에만 있다 — 캔버스는 결코 자신만의 두 번째 채널을 따로 운영하지 않는다.

두 가지는 거짓으로 꾸며지는 대신 실제로 거부되며, 메뉴가 어느 것인지 알려준다:

  • 어느 셀에 기록되는지 알려주지 않는 와이어는 편집할 수 없다. Core는 자신이 직접 읽는 참조에 대해서는 이를 채워 넣는다. 손으로 와이어를 추가하는 플러그인은 이를 직접 제공해야 한다(또는 정직하게 비워 둔다).
  • 커스텀 타입 안에 묻힌 링크 — 예를 들어 Modifier 값 안의 스탯 이름 — 은 그 엣지를 연 플러그인이 IAuthorableEdgeContributor도 옵트인했을 때만 편집 가능하다. 그렇지 않으면 와이어는 표시 전용이다.

중복 키, 읽기 전용 소스, xlsx 기반 탭, 그리고 실행 중인 임포트는 테이블에서와 정확히 동일하게 캔버스 작성을 비활성화하며, 각각 메뉴 항목에 그 사유가 붙는다.

구조 편집

아래의 모든 것은 셀 편집과 마찬가지로 스테이징된다 — 즉시 보이고, undo 가능하며, 한 번의 쓰기 반영으로 확정된다. 이 기능들은 위에서 설명한 우클릭 메뉴(컬럼 헤더 · 행 거터 · 사이드바 시트)에 있다.

스튜디오는 또한 시트 이름 옆, 시트의 헤더 바에 상시 버튼을 유지하므로, 우클릭 메뉴가 존재한다는 것을 몰라도 가장 많이 쓰는 기능을 찾을 수 있다 — 그중에는 + Row와, 끝에 컬럼을 덧붙이는 + Column이 있다. 같은 바에는 시트의 이름 변경 , @overlap 행 토글, 그리고 검색과 정렬 컨트롤이 있다. 새 컬럼을 특정 위치에 넣으려면 여전히 헤더를 우클릭한다.

  • 컬럼: 속성을 그 자리에서 추가, 제거, 이동, 편집한다.
    • 속성 폼(헤더의 속성 ✎)은 이름, @type, @desc, @overlap을 함께 편집한다. 오직 마커 셀만 변경되며, 컬럼의 데이터 셀은 100% 보존된다(삭제 후 재추가로 인한 데이터 손실 없음).
    • @overlap은 체크박스다. 처음 필요할 때 행이 자동 생성되며, 항상 고유한 키 컬럼에서는 비활성화된다.
    • @type 입력은 타이핑하는 동안 검증된다. 사전 검증은 그다음 기록되기 전에 기존의 모든 셀이 새 타입과 호환되는지 확인한다.
  • 마커: 선택적 @overlap 행을 추가/제거한다. 시트 자신의 @style 그룹 라벨과 색상도 동일한 경로로 스테이징된다(사이드바 우클릭 ▸ 그룹·색 ✎) — 그룹화와 색상 지정은 에디터 로컬 상태에 머무르는 대신, 다른 편집과 마찬가지로 시트에 push된다.
  • : 삭제하며, ▲▼로 순서를 바꾼다(스튜디오에서는 거터 메뉴의 "move up" / "move down").
  • 컬럼 순서 변경 — 몇 번을 이동하든 한 번의 반영으로 확정된다. 대기 중인(새로 추가된) 컬럼도 순서 변경이 가능하며, 기존 컬럼을 지나 맨 앞까지 이동할 수 있다.
  • 주석과 빈 행은 모든 구조 편집을 거치는 동안 보존된다.

WYSIWYG: 그리드는 반영 이후 시트의 실시간 미리보기다

스테이징하는 모든 것은 즉시 보이는 그대로다:

  • 추가된 컬럼은 즉시 나타난다 — 그리고 같은 배치에서 그 셀을 채울 수 있다(기존 행과 신규 행 모두). 이것이 채워진 탭에 필수 컬럼을 추가하는 방법이다: 컬럼을 추가하고 값을 함께 채운다. 채워지지 않은 필수 셀은 사전 검증에서 걸러진다.
  • 삭제된 컬럼/행은 즉시 사라진다. 스테이징 요약은 대기 중인 항목을 나열한다(Deleted: column 'hp' · Added: column 'mp') — 표시 전용이다.
  • 모든 것이 한 배치 안에서 자유롭게 섞인다: 값 편집, 행 추가, 다중 컬럼 추가/제거, 마커 토글, 순서 변경 — "배치당 하나의 작업"이라는 제약은 없다.
  • 이미 스테이징된 편집이 있는 컬럼/행을 삭제하는 경우(또는 값이 채워진 신규 컬럼을 취소하는 경우) *"N개의 편집 내용이 사라집니다 — 계속하시겠습니까?"*라고 묻는다 — 아무것도 조용히 버려지지 않는다.

탭 이름 변경과 A↔B 교환 — 참조는 데이터를 따라간다

탭 이름 변경("Rename tab ✎")은 소스의 이름을 변경하고, 확인 대화상자 이후 모든 시트에 걸쳐 그 탭을 향한 모든 @type 참조를 갱신한다(RecordId@FooRecordId@Bar, 리스트 및 커스텀 형태 포함). 소스의 이름을 변경한다는 것은 로컬에서는 확장자를 보존한 파일명 변경을, Google에서는 내용은 그대로 둔 제목 변경을 뜻한다.

상호 교환(A↔B)과 순환은 한 배치 안에서 지원된다: 어느 쪽을 먼저 스테이징해도 동작하며, 참조는 원자적 교환 재작성을 통해 데이터를 따라간다.

  • 로컬은 한 번의 쓰기 작업으로 두 파일의 내용을 교환하고, 오래된 확장자의 파일을 정리한다.
  • Google은 순간적인 중복을 피하기 위해 임시 제목을 사용해 제목 변경을 위상학적으로 정렬한다.

재임포트가 정리를 자동으로 처리한다: 생성 클래스 이름 변경, 이전 클래스 파일 제거, 베이크된 SO와 Addressables 주소 재등록.

참조 전파를 동반한 키(RecordId) 이름 변경

그리드에서 직접 키 셀을 편집한다. 반영 시, "N개의 참조가 업데이트됩니다 — 계속하시겠습니까?" 확인 이후 그 키를 참조하는(RecordId@ThisTab 스칼라 및 리스트 요소) 모든 탭의 모든 셀이 함께 업데이트된다. 로컬과 Google 경로 모두에서 동작한다. 경계:

  • 전파는 baseline 셀에만 영향을 미친다 — 같은 배치에서 방금 입력한 텍스트는 결코 조용히 재작성되지 않는다. 대신 사전 검증이 매달린 참조를 잡아내므로, 사용자가 알고 고칠 수 있다.
  • 전파가 xlsx 원본 탭에 영향을 미치게 된다면, 전체 반영이 차단된다(부분 반영은 결코 허용되지 않는다) — 해당 워크북을 직접 편집하고 재임포트한다.
  • 보조 정수 키(IntId)도 동일한 방식으로 편집 가능하다.

Ctrl+Z / Ctrl+Y — Unity의 네이티브 Undo와 연동

모든 스테이징 변경은 Unity의 네이티브 Undo와 통합된다:

  • 셀 편집;
  • 키 편집;
  • 컬럼 추가/제거/취소;
  • 행 추가/삭제;
  • 마커 토글;
  • 순서 변경;
  • 속성 편집;
  • 탭 이름 변경;
  • 캔버스 링크와 언링크;
  • 에셋 드롭과 그것이 스테이징하는 등록;
  • 심지어 "모두 취소"까지.

알아 두어야 할 두 가지 경계:

  • 텍스트 필드에 입력하는 동안에는, 필드 자체가 Ctrl+Z를 먼저 소비한다(표준 Windows 동작).
  • 반영이 성공한 이후에는 스테이징 기록이 지워진다 — Ctrl+Z는 반영 이전 세션 내에서만 동작한다. 이미 시트에 기록된 변경은 시트를 편집해서 되돌린다.

스테이징된 편집은 재임포트에도 살아남는다

스테이징된 편집은 물리적 행 번호가 아니라 논리적 주소(탭 · 행 키 · 필드)를 가지며, 반영 직전에 다시 해석된다. 따라서 스테이징 내용은 자동 재임포트와 백그라운드 baseline 변경에도 살아남는다.

시트가 외부에서 변경되어 해석이 깨질 때 — 행의 키가 외부에서 이름 변경되었거나, 행이 삭제되었거나, 키가 이제 충돌하는 경우 — 그 편집은 격리된다. 반영에서 제외되고 "isolated" 배지와 함께 표시된다. 이는 조용히 버려지지도, 나머지 세션을 막지도 않는다 — 확인 후 개별적으로 버릴 수 있다.

사전 검증 — 검증 후 반영

쓰기 반영은 먼저 메모리 안의 전체 예상 상태를 검증한다 — 참조 무결성, @overlap 고유성, 에셋 키와 에셋 타입(이번 세션에 스테이징된 등록은 이미 존재하는 것으로 세어진다), 그리고 모든 플러그인 도메인 검증기까지. 검증이 실패하면 아무것도 기록되지 않으며 전체 리포트를 받게 된다. 쓰기는 예상 상태 전체가 통과한 이후에만 시작된다; 스테이징된 Addressables 등록은 시트 기록이 성공한 뒤, 자동 재임포트 이전에 실행되며, 스테이징된 변경이 등록 하나뿐인 반영도 그 등록을 실행하고 재임포트한다(소스, 내보내기 및 Push 참고).

시트 생성 / 삭제

  • 생성은 두 가지 내장 템플릿 중 하나로부터, 플러그인이 등록한 템플릿으로부터, 또는 필드를 직접 정의하는 from scratch로부터 이루어진다. 클릭 한 번으로(경고 이후) 로컬 파일 또는 Google 탭을 생성한다.
    • 내장 템플릿은 *아이템 예시 (코어 타입만)*와, @enum 시트를 배치하는 Enum 정의(아래 참고)다.
    • 플러그인이 등록한 템플릿은 플러그인이 제공할 때만 존재한다 — 예: Plugin Demo의 skill 탭.
  • 현재 임포트 중인 소스가 아닌 다른 소스에 생성하면, 대화상자는 실행하기 전에 이를 알려준다: 자동 재임포트는 이전 소스를 읽고 새 탭을 결코 보지 못하므로, 생성은 임포트 소스를 전환해 생성한 그 소스로 만들고 이를 설정 에셋에 저장한다.
  • 삭제는 모든 것을 함께 정리한다: 소스, baseline, 베이크된 SO, 생성된 .cs(강력한 경고 + 승인).

여러 시트를 아우르는 검색 (All 항목)

사이드바의 첫 항목은 All이다: 검색어를 입력하면 모든 시트의 id와 필드 값을 부분 일치로 검색하며, 시트 · 키 · 필드 · 값을 페이지당 50행씩 나열한다. 검색창이 비어 있으면 모든 시트의 모든 레코드를 훑어본다.

이는 베이크된 데이터베이스를 읽으므로, 먼저 성공한 임포트가 한 번 필요하며 아직 없다면 그 사실을 분명히 알려준다. 임포트가 완료되거나 활성 설정이 바뀌면 결과가 스스로 갱신되며, 오래된 답을 계속 보여주지 않는다.

결과 행은 단순한 목록이 아니라 문이다. 더블클릭하거나 — 또는 선택한 뒤 Enter를 누르면 — 일치한 셀이 선택된 채로 그 시트가 열린다; 단일 클릭은 행을 선택할 뿐이다. 결과는 베이크된 데이터에서 나오므로, 현재 세션이 아직 로드하지 않은 시트를 가리킬 수도 있다 — 그런 행은 이동하지 않으며, 목록 아래의 짧은 안내가 아무 일도 하지 않는 대신 그 이유를 알려준다.

임포트에 실패한 시트 열기 (격리, quarantine)

예전에는 검증 에러가 나면 고칠 방법이 아예 없었다: 임포트가 실패하면 창에 어떤 시트도 나타나지 않았고, 유일한 방법은 스프레드시트 자체를 여는 것뿐이었다. 이제는 이것이 뒤집혔다.

가져오기와 저장은 검증과 분리되어 있다. 소스를 완전히 읽었다면, 검증이 실패했더라도 시트는 baseline 스냅샷으로 저장된다 — 그래서 스튜디오는 이를 열고, 문제가 된 셀마다 모든 에러를 보여주며, 평소와 정확히 같은 방식으로 고치고 push할 수 있게 한다.

계속 차단되는 것은 출력이다: 코드 생성과 베이크는 에러가 하나도 남지 않을 때까지 실행되지 않으므로, "부분 조립 없음"은 그것이 있어야 할 자리 — 출구 — 에서 유지된다.

  • 추측하게 두지 않고 알려준다. 콘솔은 시트가 저장되었다는 것과 무엇이 차단되었는지 알려준다. 사이드바에는 클릭하면 첫 번째 에러로 이동하는 ⛔ N error(s) — code generation and baking are blocked 알림이 붙으며, 시트별 에러 배지는 이미 Problems에서 보는 것과 동일한 프로젝션 진단 정보에서 온다. 아예 파싱될 수 없었던 시트는 비어 있는 것처럼 보이는 대신 그 사실을 알려준다.
  • 수정을 push하면 한 번 묻는다. 시트가 격리된 동안에는 쓰기 반영에 추가 확인이 표시된다: 기존 에러는 그대로 남고, 이 편집이 새로 만들어내는 에러도 함께 기록된다 — 검증이 이를 막지 않는다. 발견된 모든 것은 그 반영의 리포트에 경고로 나열되며, 이후 자동 재임포트가 시트 전체를 다시 검증한다. 정상적인 시트에서는 아무것도 달라지지 않는다 — 사전 검증은 여전히 강한 게이트다.
  • 출구는 계속 닫혀 있다. 격리된 동안에는 Export와 실제 시트로의 Push가 모두 거부되는데, 둘 다 마지막으로 성공한 베이크 값을 더 새로운 시트에 접합하기 때문이다 — 이는 누군가 방금 고친 바로 그 값을 되돌리는 셈이다. 같은 이유로 빌드도 최신성 검사에 의해 중단되며, 시작하기 창도 이 상태를 보여준다.
  • 플래그는 정확히 한 곳에서만 해제된다 — 임포트가 베이크까지 끝까지 실행되는 순간이다. 그 이전 단계는 어떤 것도 이를 해제할 수 없으므로, 나중의 실패가 거짓된 "모두 정상"을 남길 수 없다.

정렬과 필터 (표시 전용)

스튜디오는 시트별 정렬(모든 컬럼, 오름차순/내림차순, 타입 인지 비교, 프로젝트별로 유지됨)과 텍스트 필터를 추가한다. 둘 다 표시 순서만 바꾼다: 거터는 실제 시트 행 번호를 유지하며, 정렬이나 필터는 스테이징, 반영, push, export 그 무엇도 건드리지 않는다.

정렬이나 필터가 활성화된 동안에는 거터 메뉴의 행 이동 항목이 스스로 비활성화되고 그 이유를 알려준다 — "화면상의 이웃"이 진짜 이웃은 아니기 때문이다. 아래에서 설명하는 열별 값 필터와 열 숨기기도 동일한 규칙을 따른다.

컬럼 고정 (표시 전용)

컬럼 헤더를 우클릭 ▸ 이 컬럼까지 고정을 선택하면 그 컬럼과 그 왼쪽의 모든 컬럼이 가로 스크롤 밖의 자신만의 영역으로 이동한다 — 그래서 먼 컬럼까지 스크롤해도 키는 계속 보인다. 컬럼 고정 해제는 이를 풀어준다. 최소 하나의 컬럼은 스크롤 가능해야 하므로, 마지막 컬럼을 고정하려 하면 사유와 함께 거부된다. 컬럼이 하나뿐인 테이블은 고정할 것이 없다.

고정되는 것은 특정한 이름의 컬럼이 아니라 왼쪽부터의 컬럼 개수다 — 그래서 컬럼을 이동하면 어느 것이 고정되어 있는지가 바뀐다. 스프레드시트에서 고정된 영역이 동작하는 방식과 정확히 같다.

정렬·필터와 마찬가지로 이는 보기 설정이며, 프로젝트별 환경설정에 시트별로 저장된다. 결코 시트에 도달하지 않으므로 읽기 전용 및 xlsx 기반 시트에서도, 임포트가 실행되는 동안에도 동작하며, push나 export 어디에도 나타나지 않는다.

열 너비, 숨기기, 열별 필터 (표시 전용)

모든 컬럼 — 데이터 시트와 enum 정의 시트를 가리지 않고 — 은 손으로 크기를 조절할 수 있다: 컬럼 문자 셀의 오른쪽 가장자리에 있는 손잡이를 드래그하거나, 손잡이를 더블클릭해 측정된 맞춤 크기로 되돌리거나, 컬럼 메뉴의 **열 너비…**로 정확한 숫자를 입력하고 데이터 크기에 맞추기로 다시 측정한다. 하한은 24 px이며 상한은 없다. 너비는 시트별로 저장되고 시트나 에디터가 돌아오면 복원되며, 자동 맞춤은 보이는 행뿐 아니라 모든 행을 측정하므로 필터 때문에 너비가 갑자기 바뀌는 일은 없다.

같은 컬럼 메뉴가 스프레드시트 기능 나머지도 담고 있다:

  • 열 숨기기 / 숨긴 열 보이기 (n) — 숨기기는 보기 설정이다: 문자는 시트의 실제 위치(A · C · D)를 계속 가리키고, 헤더와 본문에 굵은 경계선이 숨긴 열이 있는 자리를 표시하며, 툴바 칩이 그 개수를 센다. 마지막으로 남은 보이는 컬럼은 숨기기를 거부하며 사유를 알려준다. 숨긴 컬럼은 다른 모든 곳에서는 여전히 존재한다 — 캔버스, 검증, Export, Push는 시트를 그대로 본다.
  • 필터… — 컬럼 값의 체크리스트(빈 셀을 위한 (빈 칸) 항목 포함)에 조건 하나를 더한다: 모든 컬럼에는 포함 / 포함하지 않음 / 비어 있음 / 비어 있지 않음이, 숫자 컬럼에는 같음 / 같지 않음 / 초과 / 미만 / 이상 / 이하가 있다. 아무것도 체크하지 않으면 모든 값이 통과하며 조건은 여전히 적용된다. 필터는 검색 박스와 결합되고, 새로 추가된 행은 항상 계속 보이며, 툴바 칩이 필터링된 컬럼 수를 세고, 필터 지우기가 하나를 제거한다.
  • 열 데이터 삭제… — 확인 후, 그 컬럼의 값을 모든 행(필터로 걸러진 행과 스테이징된 신규 행 포함)에서 하나의 undo 단계로 비운다. 키 컬럼은 거부된다 — 각 행의 이름이 그곳에 살고 있으므로 셀에서 이름을 바꾼다 — 그리고 필수 컬럼은 다시 채워질 때까지 정직하게 에러를 보고한다. 지울 것이 없는 컬럼은 아무것도 스테이징하지 않는다.
  • 오름차순 / 내림차순 / 시트 순서 정렬 — 시트별 정렬이 이제 컬럼 메뉴에도 있으며, 활성 선택에는 체크 표시가 붙는다.

정렬과 컬럼 고정처럼, 이 모두는 표시 전용이다: 시트에도, push에도, export에도 결코 닿지 않는 시트별 보기 설정이다.

Enum 정의 시트

enum을 정의하는 시트(시트 문법 참고)는 레코드를 갖지 않으므로, 스튜디오는 레코드 테이블 대신 전용 그리드를 제공한다. 그리드는 enum당 하나의 컬럼에 순서대로 나열된 멤버를 보여주며, 사이드바에는 Enum definitions 배지와 몇 개의 enum을 담고 있는지에 대한 개수가 붙는다. 다른 모든 시트와 똑같이 읽힌다: 위쪽에는 컬럼 문자, 거터에는 실제 시트 행 번호, 동일한 순서의 동일한 우클릭 메뉴, 그리고 데이터 테이블이 쓰는 것과 같은 색으로 표시되는 스테이징된 변경.

시트의 구조는 데이터 시트와 정확히 같은 방식으로 그 자리에서 저작된다:

  • 새 enum 정의는 헤더 바의 + Enum 버튼으로(아직 하나도 없는 정의 시트에 첫 enum을 놓는 유일한 방법이다) 하거나, 컬럼 헤더의 우클릭 메뉴에서 원하는 위치에 한다. 폼은 이름, 선택적인 기반 타입과 설명, 그리고 첫 멤버들을 받는다 — 멤버가 하나도 없는 enum은 임포트할 수 없으므로 최소 하나가 필요하다. 멤버의 순서가 곧 그 정수 값이다.
  • enum 이름 변경을 하면 모든 시트에 걸쳐 그 enum을 가리키는 모든 @type 셀이 같은 배치에서 함께 재작성되므로, 기록 이후의 재임포트도 여전히 해석된다. 기반 타입설명은 그 자리에서 편집한다 — 마커 행은 시트에 아직 없어도 표시되며, 변경이 반영될 때 생성된다.
  • enum 삭제는 어떤 시트가 아직 그것을 사용하는 동안에는 사용 중인 컬럼의 이름과 함께 거부된다. 컬럼 순서 변경은 자유롭다 — enum의 컬럼 위치는 아무 의미도 갖지 않으므로 언제나 안전하다.
  • 모든 것이 다른 편집과 마찬가지로 스테이징된다: 즉시 보이고, 제스처마다 하나의 Ctrl+Z 단계이며, 한 번의 반영으로 기록된다. 이름이 유효한지 이미 쓰이고 있는지, 멤버가 유효한지, 기반 타입이 허용되는지, enum이 아직 사용 중인지 — 모든 판정은 임포트를 검증하는 것과 동일한 코드가 내리므로, 폼과 재임포트가 서로 어긋날 수 없다. 막힌 동작은 사라지는 대신 그 사유가 붙은 채로 메뉴에 남는다.

멤버 행은 여전히 끝에 추가만 되며 정렬은 없다. 멤버의 위치가 그 값이기 때문이다 — 멤버 순서를 바꾸면 이미 에셋에 베이크된 값들의 번호가 조용히 바뀌게 된다.

셀은 시트가 말하는 그대로를 보여준다: Name=value 문법으로 고정된 멤버는 쓰여진 그대로 나타난다. 중복 검사는 이름 부분만 비교하므로, 이미 Rare=10을 담고 있는 시트에 Rare를 스테이징하면 중복 등록되는 대신 거부된다.

멤버를 추가하려면 시트를 열 필요조차 없다. 프로젝트 어디서든 Enum<T> 셀의 드롭다운 맨 아래에는 **"새 멤버 추가…"**가 있다: 이름을 입력하면 하나의 Ctrl+Z 단계로 enum 시트에 스테이징되며, 다음 반영이 이를 기록할 때까지 스테이징됨으로 표시된다.

플러그인이 C#에서 등록한 enum에는 이 행이 없다 — 존재했다가 실패하는 대신 아예 없다 — 시트가 그 enum을 소유하지 않기 때문이다.

웹 앱도 동일한 규칙으로 이 시트들을 저작한다 — SheetForge Web 참고.

콘솔 에러에서 셀로 바로 이동하기

임포트나 반영에서 에러가 발견되면, 사람이 읽기 쉬운 콘솔 리포트는 각 에러의 좌표 옆에 클릭 가능한 "Open in Data Studio" 링크를 덧붙인다. 이를 클릭하면 스튜디오가 열리고, 해당 탭으로 전환되며, 셀이 강조 표시된다(행의 왼쪽 바와 셀의 테두리). 특정 셀이 없는 에러(파일/탭 수준)는 탭에만 초점을 맞춘다.

이 링크는 사람이 읽기 쉬운 리포트에만 추가된다. CI와 로그 스크래핑이 의존하는, 머신이 읽는 좌표 줄은 그대로 유지된다.

상태 점검

스튜디오 툴바의 ⋯ ▸ 상태 점검은 네트워크 호출 없이 빠른 진단을 실행한다. 각각에 대해 ✓/✗와 제안된 수정 방법을 출력한다:

  • 활성 설정;
  • 소스 접근 가능 여부 — 존재하는 로컬 폴더인지, 또는 Google id + 서비스 계정 키 경로인지;
  • 임포트 baseline;
  • 생성된 코드/베이크/addressable의 최신 상태.

요약 대화상자는 몇 개의 점검 항목에 조치가 필요한지 알려준다.

활성 임포트 설정

프로젝트에 SheetForgeSettings 에셋이 둘 이상 있으면, 툴바에 어느 것을 활성으로 할지 선택하는 드롭다운이 나타난다. 하나를 선택하면 즉시 활성화되고 뷰가 다시 구성된다 — 메뉴, 임포트, 그리고 창 모두 활성 선택을 따른다. 설정 에셋이 하나뿐이면 드롭다운은 숨겨진다.

활성 선택은 프로젝트별·사용자별로 저장되므로 버전 관리에 영향을 주지 않는다. 시작하기 창(Tools ▸ SheetForge ▸ 시작하기)에서 관리할 수도 있고, 설정 에셋의 인스펙터에서 관리할 수도 있다 — 인스펙터는 "active" 배지나 "Set as active" 버튼을 보여준다.

안전장치

  • 로컬 소스에 대한 외부 변경 감지.
  • 스테이징된 변경이 존재할 때의 닫기 경고.
  • 오래된 그리드에 대해 작업하는 것을 막는 스테이징 세대 앵커.
  • 모드 인지: 읽기 전용 소스(Google ExportUrl)에서는 Push / 반영 / 구조 편집 / 삭제가 마우스 오버 설명과 함께 비활성화된다.
  • 임포트/내보내기/push 동안의 진행 바, 항상 정리되며(try/finally), 현지화되어 있다.
  • 오작동하는 확장은 창을 무너뜨릴 수 없다: 캔버스 오버라이드, 위젯, 액션은 try/catch 안에서 호출되며, 실패는 영어 콘솔 경고로 남고 창의 나머지는 계속 동작한다.

이름 변경 전에 알아둘 것 (반영 후에는 되돌릴 수 없음)

  • 컬럼 이름 변경 / @type 변경은 생성된 필드(이름/타입)를 재생성한다 — 그 필드를 참조하는 게임 코드는 수동으로 업데이트해야 한다. 확인 대화상자가 이를 명시적으로 알려주며, 그 결과로 생기는 컴파일 에러는 자동 체인에 의해 조치 가능한 문장과 함께 안전 중단된다. 컬럼 은 보존된다.
  • 탭 이름 변경은 생성된 클래스 이름을 변경한다(FooDatabaseBarDatabase) — 동일한 규칙이 적용된다.
  • 상호 교환과 순환은 단일 이름 변경과 동일한 규칙을 따른다(위의 탭 이름 변경 절 참고). 오직 진짜 충돌(두 개의 이름 변경이 같은 이름을 대상으로 함)만이 거부된다.
  • xlsx 원본 탭은 이름 변경에서 제외된다. 폼이 그 이유를 알려주고 Apply는 비활성화된다 — 워크북 자체에서 시트 이름을 변경한 다음 재임포트한다.
  • Google에서는 한 가지 예외가 남아 있다: 서로를 참조하는 두 교환 탭은 다시 연결되지 않는다(로컬은 완전히 올바르게 처리한다) — 기능 및 제한 참고.
  • 반영 이후에는 이들을 Ctrl+Z로 되돌릴 수 없다(시트가 이미 기록되었기 때문이다).

테스트 편집 (임시 SO 조정)

베이크된 SO 인스펙터에는 "테스트 편집" 토글이 있다(기본값 꺼짐 = 읽기 전용). 이를 켜면 SO 값을 임시로 조정하여 런타임 수치를 시험해볼 수 있다 — 결코 시트에 기록되지 않으며, 다음 재임포트에서 사라진다. 레코드는 에디터와 Play 모드 모두에서 codeName/id로 빠르게 찾을 수 있다.

스테이징된 값을 SO에 미리보기로 반영하던 워크벤치의 별도 버튼은 그 창과 함께 사라졌다. 그 버튼이 구동하던 오버레이는 이를 원하는 도구를 위해 여전히 공개 API로 남아 있다: EphemeralSoApply는 진실로 계산할 수 있는 것을 적용하며, 대기 중인 컬럼과 파싱 실패 셀은 거짓으로 꾸며내는 대신 거부한다. 위의 토글이 일상적인 경우를 감당한다.

플러그인 유무 비교

**플러그인 없음 (코어 전용)**으로 표시된 모든 항목은 순수한 프로젝트에서도 동작한다. 각 플러그인 사용 시 줄은 도메인 플러그인이 추가하는 것이다. 이 모두는 번들로 제공되는 Plugin Demo에서 실제로 동작하므로, 직접 작성하기 전에 각각이 동작하는 모습을 볼 수 있다(플러그인 작성).

  • 시트, 셀, 행
    • 플러그인 없음: 전체 테이블, 셀 편집, 행 추가, 스테이징, Ctrl+Z, push.
    • 플러그인 사용 시: 변화 없음.
  • Pull / Push
    • 플러그인 없음: 활성 소스로부터 임포트; 동일한 사전 검증 + 재임포트 체인을 거쳐 push.
    • 플러그인 사용 시: 변화 없음.
  • Problems
    • 플러그인 없음: 네 가지 코어 검증(키, 참조, @overlap, 에셋 키).
    • 플러그인 사용 시: 여기에 자신의 IDomainValidator 규칙을 더한다. 데모는 제동 장치 없는 반응 순환과 고아 레코드에 대해 경고한다.
  • 캔버스가 보여주는 것
    • 플러그인 없음: 열어본 레코드, 그것이 무엇으로 이루어져 있는지, 무엇이 그것을 사용하는지를 결정적으로 배치.
    • 플러그인 사용 시: 여기에 ISheetForgeGraphPlugin을 통한 자신의 탭별 오버라이드를 더한다 — 시트 레코드가 아닌 아이덴티티, Core가 볼 수 없는 링크, 도메인 순서로 고정된 컬럼(절대적이거나 화면의 레코드로부터 센 상대적 순서), 그리고 레코드가 불리는 사람이 읽기 쉬운 이름. 데모는 ExampleActions 레코드 주위에 이벤트 노드와 코드 블록을 덧붙이고, ExampleSkills 레코드의 시전 단계를 고정하며, 카드와 피커에서 fireballFireball로 바꾼다.
  • 그려지는 엣지
    • 플러그인 없음: 코어 스캐너가 보는 모든 RecordId@Tab 참조(스칼라, 리스트 요소, 기본값, 래퍼 내부).
    • 플러그인 사용 시: 여기에 IEdgeContributor가 선언한 엣지와 캔버스 오버라이드가 드러내는 추가 엣지를 더한다. 데모는 Modifier 미니 문법 값 안에 묻힌 스탯 참조를 드러낸다.
  • 캔버스에서 편집하기
    • 플러그인 없음: 모든 컬럼에 대한 생성, 연결, 연결 해제, 재조준, 분기, 삭제, 인라인 값 편집. 그려진 포트가 가리키는 시트에 새 레코드를 생성할 수 있다.
    • 플러그인 사용 시: 여기에 새 레코드를 어디에 만들 수 있는지 정하는 IAuthorableGraphShape, 기여자 자신의 엣지를 편집 가능하게 만드는 IAuthorableEdgeContributor, 그리고 토큰 중 키가 아닌 부분을 노출하는 IEdgeTokenEditor를 더한다. 데모의 기여자는 스탯을 연결하거나 연결 해제할 때 modifier 미니 문법을 재작성하고, 와이어 인스펙터에서 편집 가능한 한 행으로 op:value를 제공한다.
  • 셀 위젯
    • 플러그인 없음: 내장 분기(토글, 선택 피커, 참조 피커, 드롭을 받는 에셋 피커, 색상 / 커브 / 그라디언트 필드, 이 세 타입의 리스트를 위한 칩 목록, 원문 텍스트).
    • 플러그인 사용 시: 여기에 지정한 셀 타입 하나를 위한 자신의 IStudioCellEditorProvider를 더한다. 위젯 코드가 전혀 없어도, StudioCellEditorHint가 그 타입을 위해 일곱 가지 내장 형태(드롭다운, 여러 줄, 슬라이더, 토글, 색상, 커브, 그라디언트) 중 하나를 대신 지정할 수 있다. 등록된 위젯이 우선하고, 힌트는 코어 기본값보다 우선한다 — 팩이 같은 타입 이름으로 힌트를 등록하면 내장 색상 / 커브 / 그라디언트 힌트보다도 우선한다.
  • 메뉴와 패널
    • 플러그인 없음: 내장 항목만.
    • 플러그인 사용 시: 여기에 자신의 ISheetForgeStudioPlugin 등록을 더한다 — 인스펙터·행 메뉴·컬럼 헤더 메뉴·캔버스 노드 메뉴·상단바 끝의 동사(verb), 오른쪽 요약 패널, 컬럼 헤더 옆의 배지. 데모는 한 행에 반응 제동 장치를 스테이징하고, 하나의 Undo 단계로 컬럼 전체를 채우며, 시전 시간 게이지로 스킬의 조립을 요약한다.
  • 리치 패널
    • 플러그인 없음: 없음.
    • 플러그인 사용 시: IStudioPanelProvider가 임의의 UIToolkit 패널을 그린다. 서술형 패널과 동일한 id로 등록되면 여기서는 이것이 우선하고, 브라우저는 서술형 쪽을 그린다.
  • 사이드바
    • 플러그인 없음: 자신의 시트만.
    • 플러그인 사용 시: 여기에 읽기 전용 key/label/raises 그리드로 표시되는 잠긴 _Refs 스타일 코드 레지스트리(ISheetForgeCodeRegistryPlugin)를 더한다. 그 키를 가리키는 엣지는 깨짐으로 그려지지 않는다.
  • 캔버스 위쪽
    • 플러그인 없음: 없음(코어는 위젯을 제공하지 않는다).
    • 플러그인 사용 시: 자신의 IStudioGraphWidget. 데모는 종착점 행에서 채워지는 고정된 단계 스트립(VALIDATE → CAST → COMMIT → DELIVER → APPLY)을 보여준다.
  • 노드 인스펙터
    • 플러그인 없음: 주소, used-by 목록, "Go to this sheet", "Duplicate and split".
    • 플러그인 사용 시: 여기에 자신의 IStudioInspectorAction 버튼을 더한다. 데모는 제동 장치 없는 반응에 brakeSeconds = 0.25를 스테이징한다(되돌릴 수 있는 평범한 스테이징된 편집).
  • 색상과 라벨
    • 플러그인 없음: 내장 프리셋과 각 시트 자신의 @style 색상.
    • 플러그인 사용 시: 여기에 자신의 ISheetForgeThemePlugin 프리셋과 ISheetForgeStringsPlugin 문자열을 더한다 — Core에 등록되므로, 같은 팩의 라벨은 브라우저에서도 나타난다.

빈 프로젝트로 시작하기

활성 임포트 설정이 없는 상태로 열면, 스튜디오는 테이블 대신 "Get started" 패널을 보여준다 — 설정 에셋 생성, 플러그인/코어 데모 임포트, 또는 시작하기 열기를 위한 인라인 버튼이다. 설정이 존재하는 순간 이 패널은 사라진다.

더 빠른 방법: 창에 폴더를 드래그하거나, 단일 .tsv/.csv/.xlsx 파일(이 경우 그 상위 폴더가 사용된다)을 드래그한다. 확인 후, 이는 그 폴더로부터 읽어오는 임포트 설정 에셋을 생성하고 활성화한다. 이미 활성 설정이 있다면, 대화상자가 이를 알려주고 새로 생성해서 전환할지 제안한다.

워크벤치에는 무슨 일이 있었나

원조 IMGUI 워크벤치 창은 제거되었다. 이는 스튜디오의 작성 세션, 조립/검증 엔진, 반영 경로를 공유하고 있었으므로 동작 면에서 잃은 것은 없다 — 그리고 그것만이 제공하던 세 가지는 먼저 옮겨졌다:

워크벤치 기능지금은 어디에 있나
페이징을 갖춘 여러 시트 검색용 All스튜디오 사이드바 맨 위의 All 항목(동일한 검색, 동일한 페이지 크기)
드래그 앤 드롭 온보딩스튜디오 자신이 드롭을 받는다(위 참고)
Google gid 자동 채우기 / 실시간 탭 목록 패널설정 에셋의 인스펙터, Google Sheets 아래

한 가지 기능은 옮겨지는 대신 폐기되었다: 스테이징된 값을 베이크된 SO에 미리보기로 반영하던 워크벤치의 버튼이다. SO 인스펙터의 테스트 편집 토글이 같은 필요를 충족한다(위의 테스트 편집 참고).

이를 가리키는 코드나 메모가 있다면: 업데이트할 메뉴 항목은 없다 — 애초에 없었다 — 그리고 설정 인스펙터, 베이크된 SO 인스펙터, 시작하기 템플릿 갤러리는 모두 데이터 스튜디오를 연다.

관련 페이지