오토타일 시트로 LDtk 오토 레이어 규칙 만들기
LDtk 오토 레이어 규칙은 강력하지만 준비가 많이 듭니다. Studio는 인식한 지형 비트로 타일마다 규칙 하나를 씁니다. LDtk JSON 스키마·공식 로더·독립적인 규칙 재실행으로 확인했지만 LDtk 편집기에서 열지는 않았습니다.
LDtk에서 오토타일은 타일셋과 자동 레이어 규칙이 붙은 IntGrid 레이어입니다. 규칙마다 IntGrid 값의 패턴(1 × 1부터 7 × 7까지)이 있어 맞는 곳에 타일을 칠하고, 규칙은 위에서부터 실행되며 "break on match"가 켜져 있으면 그 칸에서 뒤의 규칙은 멈춥니다. Nerulio는 오토타일 시트의 타일마다 3 × 3 규칙 하나를 만들어(블롭 세트면 47개) 샘플 레벨이 있는 LDtk 1.5.3 프로젝트로 씁니다. 파일은 LDtk JSON 스키마와 공식 로더를 통과했고 규칙을 다시 실행하면 같은 타일이 나오지만, LDtk 앱에서 열어 보지는 않았습니다.

- LDtk일부 검증· LDtk 1.5.3 schema + loader
- Godot 4 TileSet검증됨· Godot 4.7.2
- Tiled검증됨· Tiled 1.12.2
- Unity 6 Rule Tile검증됨· Unity 6000.5.3f1 + 2D Tilemap Extras 8.0.3
IntGrid 값, 규칙, 그리고 순서
LDtk 매뉴얼은 자동 레이어를 "한 가지가 더해진 IntGrid 레이어"라고 설명합니다. 타일셋이 연결되어 있고 규칙이 타일을 자동으로 칠합니다. 사용자는 정수 값을 칠하고(JSON 레퍼런스: 0은 빈칸, 값은 1부터), 규칙이 그 값을 타일로 바꿉니다. 순수 자동 레이어는 다른 IntGrid 레이어의 값을 읽어 올 수도 있습니다.
규칙은 칸과 이웃을 덮는 정사각형 패턴, 그리고 칠할 타일로 이뤄집니다. Nerulio가 쓰는 파일에서 패턴 칸은 v(이웃이 값 v여야 함), −v(v가 아니어야 함), 0(상관없음) 중 하나이고 왼쪽 위부터 행 단위로 적히며, 타일은 가운데 칸에 놓입니다. 열린 변 뒤의 모서리는 0이라 블롭 규칙은 5~9칸을 확인합니다. JSON 레퍼런스는 breakOnMatch를 "맞으면 같은 칸에 다른 규칙이 적용되지 않게 함"으로 정의하므로, Nerulio는 가장 구체적인 규칙부터 정렬하고 이 옵션을 켜 둡니다.
모서리(듀얼 그리드) 세트는 LDtk의 타일 오프셋을 씁니다. 규칙은 칸과 그 오른쪽·아래·오른쪽 아래, 즉 한 격자점에서 만나는 네 칸을 읽고, 타일을 반 칸 오른쪽 아래인 그 점 위에 그립니다.
- IntGrid 값
- 칸마다 칠하는 정수. 지형마다 하나씩(지형 1 = 값 1 …).
- 자동 레이어 규칙
- 있어야 할 값과 없어야 할 값의 패턴, 그리고 맞을 때 칠할 타일.
- Break on match
- 규칙이 맞으면 뒤의 규칙은 그 칸을 건너뜀(LDtk 기본값).
- 타일 오프셋
- 규칙마다 칠한 타일을 픽셀 단위로 옮기는 값. 듀얼 그리드 세트는 반 타일.
예시: 블롭 타일 하나의 3 × 3 규칙(지형 = IntGrid 값 1)
타일 마스크 31: N, NE, E, SE, S 연결, W 열림
패턴(왼쪽 위부터 행 단위):
0 1 1 1 = 값 1이어야 함
-1 1 1 -1 = 값 1이 아니어야 함
0 1 1 0 = 상관없음(열린 서쪽 변 뒤의 모서리)
JSON "size":3, "pattern":[0,1,1,-1,1,1,0,1,1], "breakOnMatch":true
규칙 수 블롭 47 → 47, 변 16 → 16, 모서리 16 → 15(모두 빈 모서리 타일은 아무것도 안 그림)레벨 밖의 칸은 빈칸으로 셉니다(outOfBoundsValue 0). 그래서 레벨 경계에 닿은 지형에도 테두리 타일이 붙습니다.
이렇게 작동합니다
- 지형마다 IntGrid 값과 타일마다 3×3 규칙 하나가 든 .ldtk(1.5.3).
- autoLayerTiles가 채워진 샘플 레벨이 있어 결과를 바로 볼 수 있습니다.
- 모서리·듀얼 그리드 세트는 반 타일 오프셋으로 씁니다.
- 일부 검증: 스키마 + 공식 QuickType 로더 + 독립 규칙 재실행이 코퍼스 12세트에서 내보낸 타일과 같음.
사용 방법
- 타일셋을 넣고 배치를 적용합니다(또는 비트를 칠합니다).
- 점검 패널을 읽고 빠진 조합을 채웁니다.
- 내보내고(Ctrl+E) ldtk 폴더를 가져갑니다.
- LDtk에서 .ldtk를 열고 IntGrid 레이어를 칠합니다.
받게 되는 파일
cave.png라는 시트를 내보냈을 때 ZIP의 ldtk 폴더입니다.
| 파일 | 용도 |
|---|---|
cave.ldtk | LDtk 1.5.3 프로젝트: 타일셋 정의, 지형마다 값 하나가 있는 IntGrid 레이어 Terrain, 규칙 그룹 Nerulio terrain, autoLayerTiles가 이미 채워진 레벨 Sample. |
cave.png | 타일셋 이미지. 파일 이름으로 참조됩니다. |
README.txt | 프로젝트 구성과 샘플 레벨에 놓이는 타일 수. |
LDtk에서 열고 칠하기
ldtk폴더의 압축을 풀고 PNG를.ldtk파일 옆에 둡니다.- LDtk에서
.ldtk를 엽니다.Sample레벨에 규칙이 놓은 타일이 이미 보입니다. - LAYERS 패널에서 IntGrid 레이어
Terrain을 고릅니다. 값은 내 지형이고 AUTO PAINT 타일셋은 내 PNG입니다. - 레이어의 RULES 버튼을 누르면 타일마다 규칙 하나가 든
Nerulio terrain그룹이 검사 순서대로 보입니다. - 왼쪽 버튼으로 값을 칠하고 오른쪽 버튼으로 지우며, Shift + 드래그는 사각형, Shift + 클릭은 채우기입니다. 칠하는 동안 LDtk가 규칙을 다시 실행합니다. Rules 패널에서 Shift+R을 누르면 원래 IntGrid가 보입니다.
- 게임에서는 레벨의
autoLayerTiles(LDtk가 이미 표시 순서대로 저장)를 읽거나, 규칙을 직접 돌린다면intGridCsv를 읽습니다.
결과 확인
- 아무것도 칠하기 전에 Sample 레벨에 지형이 완성되어 보여야 합니다.
- 규칙 그룹에 블롭 세트는 규칙 47개(변 세트 16개, 모서리 세트 15개)가 있어야 합니다.
- 외딴 한 칸과 3 × 3 사각형을 칠하면 고립 타일과 서로 다른 타일 9개가 나와야 합니다. LDtk 앱 안에서는 저희가 직접 보지 못한 부분이니, 다르게 나오면 알려 주세요.
문제 해결
| 증상 | 유력한 원인 | 확인 방법 | 해결 |
|---|---|---|---|
| 타일셋 이미지가 없다고 나옴 | PNG가 .ldtk 옆에 없거나 이름이 바뀜 | 타일셋 정의의 이미지 경로 | 내보낸 이름 그대로 PNG를 프로젝트 옆에 두기 |
| 칠하면 값만 보이고 타일이 안 나옴 | 다른 레이어에 칠하고 있거나 레이어의 규칙이 꺼짐 | LAYERS 패널의 선택, Rules 패널의 Render 옵션 | Terrain을 고르고 규칙 그룹을 켜 두기 |
| 특정 타일 자리에 일반 타일이 나옴 | 직접 만든 규칙이 그룹보다 위에 있거나 Break on match를 껐음 | Rules 패널의 규칙 순서 | 내 규칙을 그룹 아래로 옮기거나 Break on match를 다시 켜기 |
| 듀얼 그리드 타일이 IntGrid와 반 칸 어긋남 | 설계상 그럼: 모서리 규칙은 반 칸 오프셋으로 격자점에 칠함 | 그룹 안 규칙의 타일 오프셋 | 그대로 두기. 타일끼리는 맞물리고 IntGrid 칸과는 반 칸 어긋나는 것이 정상 |
ZIP에 ldtk 폴더가 없음 | LDtk는 정사각형 타일과 여백·간격 값이 하나씩만 필요함 | NOTES.txt에 건너뛴 이유가 적힘 | 가로세로 여백·간격이 같은 정사각형 격자 사용 |
| 두 지형이 전환 없이 만남 | 두 지형이 함께 보이는 타일이 시트에 없음 | 그 쌍에 대한 Studio 점검 패널 | 생성기에서 A 위 B 타일 생성 |
다른 방법
| 방법 | 이럴 때 더 낫습니다 |
|---|---|
| LDtk 규칙 편집기에서 직접 작성 | 타일이 적고 내보내기가 쓰지 않는 LDtk 기능이 필요할 때: 뒤집힌 패턴, modulo, checker, 확률, 규칙 하나에 타일 여러 개. |
| Tiled Wang 세트: Tiled Wang 세트 | 맵을 Tiled에서 편집하고 IntGrid 대신 지형 브러시를 쓰고 싶을 때. |
| Godot 지형: Godot 4 오토타일 | 엔진이 Godot이고 LDtk 레벨 편집기가 필요 없을 때. |
엔진별 내보내기와 검증 방법
"검증됨"은 실제 CC0 에셋으로 내보낸 파일을 해당 엔진·도구가 직접 불러와 원본과 비교했다는 뜻입니다. 불러오지 않은 형식은 그렇게 표시합니다.
| 대상 | 파일 | 검증 |
|---|---|---|
| Godot 4 TileSet | PNG · nerulio-tileset.json · nerulio_tileset_import.gd | 검증됨 Godot 4.7.2포함된 가져오기 스크립트가 지형 피어링 비트가 설정된 TileSet을 만듭니다. set_cells_terrain_connect로 칠한 맵이 9개 코퍼스 시트의 모든 칸에서 Studio 미리보기와 같았습니다. |
| Tiled | .tsx Wang set · sample.tmx | 검증됨 Tiled 1.12.2Tiled 자체 읽기 기능이 모든 Wang ID를 그대로 읽고 샘플 맵이 픽셀 단위로 동일하게 렌더링됩니다. 지형 브러시 자체는 실행하지 않았습니다. |
| Unity 6 Rule Tile | nerulio-ruletile.json · Editor/NerulioRuleTileImporter.cs | 검증됨 Unity 6000.5.3f1 + 2D Tilemap Extras 8.0.3블롭·변 타일셋: 칠한 Tilemap의 모든 칸이 예측한 스프라이트와 같습니다. 모서리/듀얼 그리드 타일셋은 Unity로 내보내지 않습니다. |
| LDtk | .ldtk (1.5.3) · rules · sample level | 일부 검증 LDtk 1.5.3 schema + loaderLDtk JSON 스키마와 공식 로더가 받아들이고 규칙을 다시 실행하면 내보낸 타일과 같습니다. LDtk 앱에서 열어 보지는 않았습니다. |
검증 근거
타일 코퍼스에서 픽셀만으로 배치를 인식: 블롭 47 템플릿 4개와 Wang 템플릿 2개는 높은 신뢰도, 실제 64px 동굴 타일셋은 중간 신뢰도로 모든 타일의 비트가 정확. Godot 4.7.2가 모든 테스트 칸을 Studio 예측대로 칠함(블롭 세트마다 485/485, 지형 4개 듀얼 그리드 팩 251/251). Tiled 1.12.2가 모든 Wang ID를 다시 읽음. Unity 6000.5에서 블롭·변 세트의 칠한 모든 칸 일치.
한계
- LDtk 앱에서 열지 않았습니다(명령줄이 없음). 점검은 스키마, 공식 로더, 독립적인 규칙 재실행이었습니다.
- 타일 하나에 규칙 하나: 뒤집기, modulo, checker, Perlin 옵션은 쓰지 않습니다.
- 타일은 정사각형이어야 하고 여백과 간격이 두 축에서 같아야 합니다.
- Tiled 지형 브러시, LDtk 앱, Godot 편집기의 칠하기는 실행하지 않았습니다. 검증은 엔진의 읽기 기능과 set_cells_terrain_connect로 했습니다.
- Unity로는 블롭·변 타일셋만 내보냅니다. 지형이 여러 개면 서로 이어지지 않는 Rule Tile 여러 개가 됩니다.
- 아이소메트릭·육각 타일, 애니메이션 타일, 오클루전·내비게이션 레이어는 지원하지 않습니다.
- 알려진 배치 없이 비트를 제안하려면 기준이 되는 "가득 찬" 타일이 필요합니다. 변만 있는 길 템플릿은 그 타일을 선택하기 전까지 추측이 틀릴 수 있습니다.
버전과 출처
코퍼스 12세트에서 확인: 프로젝트가 LDtk 1.5.3 JSON 스키마를 통과하고 LDtk 공식 QuickType 로더로 읽혔으며, 규칙을 독립적으로 다시 실행하면 내보낸 타일과 정확히 같았습니다. 타일 id를 바꾸거나 규칙을 뒤집으면 점검이 실패합니다. 위의 UI 이름은 LDtk 공식 문서를 따르며, 앱 자체는 조작하지 않았습니다.
참고한 공식 문서
자주 묻는 질문
왜 "일부 검증"인가요?
LDtk는 명령줄이 없는 Electron 앱이라 앱에서 열어 보지 못했습니다. 파일은 LDtk JSON 스키마와 공식 로더를 통과했고, 규칙을 다시 실행하면 내보낸 타일과 같았습니다.
시트 하나에 지형 여러 개가 되나요?
네. 지형마다 IntGrid 값과 규칙이 따로 생깁니다.
무료인가요? 계정이 필요한가요?
이 페이지의 기능은 모두 무료이며 계정 없이 쓸 수 있습니다. 워터마크나 막혀 있는 내보내기가 없습니다.
스프라이트가 업로드되나요?
아니요. Studio는 이 브라우저 탭 안에서 디코딩·패킹·내보내기를 합니다. 프로젝트는 브라우저(IndexedDB)에 자동 저장되며 .nerulio 파일로 저장할 수 있습니다.
Aseprite나 엔진 플러그인을 설치해야 하나요?
아니요. .aseprite 파일은 브라우저에서 읽고 씁니다. 엔진별 번들에는 그 엔진에 필요한 것이 들어 있습니다(Godot는 가져오기 설정과 씬, Unity와 Godot 타일셋은 작은 편집기 스크립트).