본문으로 건너뛰기

유니티 스프라이트 시트 자르기 · Unity 6 스프라이트와 클립

Sprite Editor에서 격자를 추측하는 대신 측정하고, 타임라인에서 애니메이션 이름을 정하고, 편집기 스크립트가 피벗이 있는 스프라이트와 애니메이션마다 AnimationClip을 만드는 번들로 내보내세요.

유니티 6에서 스프라이트 시트를 쓰려면 PNG의 Texture Type을 Sprite (2D and UI), Sprite Mode를 Multiple로 하고 Sprite Editor에서 Slice › Grid By Cell Size를 고릅니다. Pixel Size는 프레임 크기, Offset은 여백, Padding은 간격입니다. 픽셀아트라면 Filter Mode를 Point (no filter), Compression을 None으로 하고 모든 스프라이트의 Pixels Per Unit을 같게 한 뒤 스프라이트로 AnimationClip을 만듭니다. Nerulio는 격자 측정과 클립 만들기를 대신합니다. PNG, JSON, 스프라이트 영역을 피벗과 함께 쓰고 애니메이션마다 클립을 만드는 편집기 스크립트를 내보냅니다. Unity 6000.5.3f1에서 확인했습니다.

스프라이트 시트, 번호 붙은 프레임, GIF·APNG 또는 .aseprite 파일을 끌어다 놓으세요
빈 Studio 열기
브라우저에서 처리하며 파일은 업로드되지 않습니다.
Studio 스프라이트 작업 공간: 48px 사무라이 시트에서 감지한 격자(10개 애니메이션, 60프레임)를 적용 전에 미리 보는 화면
CC0 에셋(OpenGameArt)을 연 실제 Studio 화면입니다.
내보내기 대상
  • Unity 6검증됨· Unity 6000.5.3f1
  • Godot 4검증됨· Godot 4.7.2
  • Phaser 3 / 4검증됨· Phaser 3.90 + 4.2
  • PixiJS 8검증됨· PixiJS 8.21
  • Aseprite JSON검증됨· Phaser load.aseprite · PixiJS 8.21
  • .aseprite검증됨· Aseprite 1.3.18
  • Spine / libGDX검증됨· spine-canvas 4.2
  • Starling / Sparrow XML검증됨· Phaser 4.2
  • LÖVE검증됨· LÖVE 11.5
  • Defold빌드 확인· Defold bob.jar 1.13.1
  • GameMaker미검증
  • CSS sprites검증됨· Chromium
  • GIF / APNG디코딩 확인· Pillow

유니티가 텍스처 한 장을 여러 스프라이트로 나누는 방식

유니티는 스프라이트 시트를 스프라이트 하위 에셋 여러 개를 가진 텍스처 에셋 하나로 다룹니다. Sprite Mode Multiple은 이미지에 요소가 여러 개 있다는 뜻이고, Sprite Editor가 스프라이트마다 사각형 하나와 피벗 하나를 저장합니다. Slice 메뉴에는 Automatic(투명으로 떨어진 덩어리), Grid By Cell Size, Grid By Cell Count, Isometric Grid가 있습니다. 격자에서는 Pixel Size가 칸, Offset이 왼쪽 위 기준 격자 이동, Padding이 스프라이트 사이 간격이고, Keep Empty Rects는 빈 칸도 스프라이트로 남길지 정합니다.

Pixels Per Unit은 텍스처 몇 픽셀이 월드 1유닛인지 정합니다. 64px 프레임은 기본값 100에서 0.64유닛, 64에서는 정확히 1유닛입니다. 2D Pixel Perfect 문서는 모든 스프라이트에 같은 PPU, Filter Mode Point, Compression None을 권합니다. Bilinear 필터와 압축이 픽셀아트를 뭉개고 번지게 만드는 원인입니다.

유니티의 애니메이션은 정해진 시각에 SpriteRenderer의 스프라이트를 바꾸는 키를 가진 AnimationClip이고, Animator가 Animator Controller를 통해 재생합니다. Animation 창에서 클립을 만들면 컨트롤러와 Animator 컴포넌트도 자동으로 생깁니다. 시트로 직접 만든 클립은 보통 모든 스프라이트에 같은 프레임 속도를 씁니다.

Nerulio는 격자를 재고(신뢰도를 보고 바꿀 수 있음) 행 애니메이션 이름, 프레임별 시간, 피벗을 정하게 한 뒤 파일 세 개를 내보냅니다. 편집기 스크립트가 텍스처를 Sprite / Multiple / Point / 무압축 / 밉맵 없음 / PPU 100으로 설정하고, 프레임마다 피벗이 있는 스프라이트 영역을 쓰고, 프레임마다 제 시작 시각에 키가 있는 .anim을 애니메이션마다 만듭니다.

Sprite Mode Multiple
텍스처에 스프라이트가 여러 개 있고, 영역은 Sprite Editor에서 정함.
Pixels Per Unit (PPU)
월드 1유닛당 텍스처 픽셀 수. 한 게임의 모든 스프라이트에서 같게 유지.
Grid By Cell Size
Pixel Size(칸), Offset(여백), Padding(간격)을 받는 슬라이스 방식.
피벗
스프라이트의 원점. 영역 안에서 0~1로 정규화, y는 위쪽.
AnimationClip
시간에 따라 SpriteRenderer.sprite를 바꾸는 키 모음. Animator가 재생.

예시: 384 × 128 시트, 애니메이션 두 개

시트 384 × 128 px: 64 × 64 칸이 2행 × 6열, 여백·간격 없음
  Grid By Cell Size: Pixel Size 64 × 64, Offset 0 × 0, Padding 0 × 0 → 스프라이트 12개
  월드 크기: 64 px / PPU 100 = 0.64유닛      64 px / PPU 64 = 1유닛

Nerulio 내보내기(행 이름 idle·run, 프레임 125 ms, 피벗 하단 중앙):
  유니티 영역 y(원점 왼쪽 아래) = 페이지 높이 − (y + h)
  하단 중앙 피벗 → 각 영역 안에서 (0.5, 0)
  run.anim 키: 0, 0.125, 0.25, 0.375, 0.5, 0.625초 + 마무리 키 0.75초
  loop on(반복 ∞)      클립 프레임 속도 10

마무리 키는 마지막 스프라이트를 한 번 더 넣어, 클립이 처음으로 돌아가기 전에 마지막 프레임도 125ms를 온전히 보여 주게 합니다.

이렇게 작동합니다

  • 그림에서 칸·여백·간격을 측정하고 빈 칸은 뺍니다.
  • 클릭하거나 입력한 프레임별 피벗이 각 스프라이트 영역에 들어갑니다.
  • 스크립트가 Sprite Mode Multiple, Point 필터, Compression None을 설정합니다.
  • 태그마다 프레임 길이가 들어간 AnimationClip 하나. Unity 6000.5.3f1 배치 모드에서 확인.

사용 방법

  1. 시트를 넣고 적용을 누릅니다.
  2. 애니메이션 이름, 시간, 피벗을 정합니다.
  3. 패킹·내보내기에서 Unity 6을 고릅니다.
  4. 번들을 Editor 폴더와 함께 Assets/에 복사합니다.

받게 되는 파일

패킹·내보내기 › Unity 6이 쓰는 파일(파일 이름을 따르며 여기서는 hero)입니다.

파일용도
hero.png패킹된 프레임(트림, 2px 간격, 회전 없음). 양이 많으면 페이지가 늘어납니다.
hero.unity.json유니티의 왼쪽 아래 기준 좌표로 변환한 스프라이트 영역, 정규화한 피벗, 프레임별 밀리초가 든 클립 정보.
Editor/NerulioSpriteImporter.csTools › Nerulio › Import Studio JSON 메뉴의 편집기 스크립트: 가져오기 설정, 스프라이트 영역, AnimationClip.
README-UNITY.md이 번들에 맞춘 아래 단계.

유니티 6로 가져오기

  1. 압축을 푼 폴더를 Assets/ 아래(예: Assets/Characters/Hero/)에 복사하고 PNG는 JSON 옆에 둡니다. NerulioSpriteImporter.cs가 든 Editor 폴더는 유니티가 컴파일하며, 모든 2D 템플릿에 있는 2D Sprite 패키지(com.unity.2d.sprite)가 필요합니다.
  2. Tools › Nerulio › Import Studio JSON을 고르고 프로젝트 안의 hero.unity.json을 선택합니다.
  3. 스크립트가 텍스처를 Sprite (2D and UI), Multiple, Point (no filter), 무압축, 밉맵 없음, PPU 100으로 바꾸고 프레임마다 피벗이 있는 스프라이트를 씁니다. Sprite Editor를 열면 영역이 보입니다.
  4. JSON 옆에 애니메이션마다 클립(idle.anim, run.anim)도 씁니다. 프레임마다 제 시각에 SpriteRenderer의 스프라이트를 키로 잡고, Loop Time은 태그대로입니다.
  5. 클립을 Animator Controller에 넣고, SpriteRenderer가 있는 게임 오브젝트의 Animator에 그 컨트롤러를 지정합니다.
  6. 게임이 다른 PPU(예: 16px 타일이면 16)를 쓴다면 가져온 뒤 텍스처의 Pixels Per Unit을 모든 스프라이트에서 같은 값으로 바꿉니다.

Nerulio 없이 하려면: PNG를 고르고 Texture Type을 Sprite (2D and UI), Sprite Mode를 Multiple, Filter Mode를 Point (no filter), Compression을 None으로 해서 적용합니다. Sprite Editor에서 Slice › Grid By Cell Size를 고르고 Pixel Size, Offset, Padding, Pivot을 넣은 뒤 Slice와 Apply를 누릅니다. 그다음 Window › Animation › Animation을 열어 게임 오브젝트의 클립을 만들고 일정한 간격으로 스프라이트 키를 잡습니다.

결과 확인

  • Sprite Editor에서 채워진 칸마다 영역이 하나씩 있고, 피벗 표시가 발 위치에 있어야 합니다.
  • 텍스처 인스펙터가 Filter Mode Point (no filter), Compression None이어야 합니다.
  • Animation 창에서 run.anim의 키 6개가 0.125초 간격이고 0.75초에 끝나야 합니다.
  • Game 뷰를 정수 배율로 보면 픽셀 경계가 선명하고, 프레임이 바뀌어도 발이 움직이지 않아야 합니다.

문제 해결

증상유력한 원인확인 방법해결
스프라이트가 흐리거나 번짐Bilinear 필터나 텍스처 압축텍스처 인스펙터의 Filter Mode와 CompressionPoint (no filter)와 None으로. 유니티 픽셀아트 흐림 참고
슬라이스가 밀리거나 스프라이트를 반으로 자름Pixel Size에 간격이 포함됐거나 Offset·Padding이 틀림마지막 열에서 빨간 슬라이스 윤곽과 그림을 비교잰 칸·여백·간격을 입력. 프레임 크기 참고
Tools › Nerulio 메뉴가 없거나 스크립트가 컴파일되지 않음스크립트가 Editor라는 폴더에 없거나 2D Sprite 패키지가 없음(3D 템플릿)콘솔의 UnityEditor.U2D.Sprites 관련 오류Editor/NerulioSpriteImporter.cs 위치를 유지하고 패키지 관리자에서 2D Sprite 설치
"is not inside this project's Assets folder" 오류파일 대화상자에서 고른 JSON이 Assets/ 밖에 있음오류에 나온 경로번들을 Assets/에 복사하고 그 사본을 선택
타일 옆에서 스프라이트 크기가 맞지 않음내보내기는 PPU 100인데 타일은 다른 값두 텍스처의 Pixels Per Unit 비교모든 스프라이트 텍스처의 PPU를 같게
직접 바꾼 가져오기 설정이 사라짐Import Studio JSON을 다시 돌리면 Point·무압축·PPU 100을 다시 적용하고 같은 이름의 클립을 새로 만듦수정 후 메뉴를 다시 실행했는지 확인가져올 때마다 설정을 다시 적용하거나, 손으로 고친 클립은 이름을 바꾸기

다른 방법

방법이럴 때 더 낫습니다
유니티 자체 Sprite Editor 슬라이스(위의 수동 방법)균일한 시트에 프레임 속도가 하나인 클립 몇 개라면 프로젝트에 더할 것이 없습니다.
Slice › Automatic투명으로 떨어진 스프라이트이고 칸 크기가 같을 필요가 없을 때. 영역마다 크기가 달라지니 피벗을 확인하세요.
원본 .aseprite 파일로태그와 프레임별 시간까지 옮겨집니다: Aseprite를 유니티로.
TexturePacker 아틀라스데이터와 함께 이미 패킹된 프레임: TexturePacker를 유니티로.

엔진별 내보내기와 검증 방법

"검증됨"은 실제 CC0 에셋으로 내보낸 파일을 해당 엔진·도구가 직접 불러와 원본과 비교했다는 뜻입니다. 불러오지 않은 형식은 그렇게 표시합니다.

대상파일검증
Godot 4.tres SpriteFrames · .tscn AnimatedSprite2D · .png.import검증됨 Godot 4.7.2Godot가 불러와 모든 애니메이션 프레임을 그려 원본과 비교했습니다. 씬은 Nearest 필터를 쓰고 회전은 쓰지 않습니다.
Unity 6.unity.json · Editor/NerulioSpriteImporter.cs · AnimationClip검증됨 Unity 6000.5.3f1배치 모드에서 스프라이트 영역·피벗·픽셀·클립 키·길이를 확인했습니다.
Phaser 3 / 4atlas JSON (multiatlas) · .anims.json검증됨 Phaser 3.90 + 4.2두 버전 모두에서 프레임과 애니메이션을 그렸습니다.
PixiJS 8spritesheet JSON · animations · anchor · meta.scale검증됨 PixiJS 8.21회전·여러 페이지 아틀라스도 포함해 확인했습니다.
Aseprite JSONhash / array · frameTags · slices검증됨 Phaser load.aseprite · PixiJS 8.21태그의 방향과 반복 횟수가 유지됩니다.
.asepritelayers · tags · durations · slices검증됨 Aseprite 1.3.18Aseprite 명령줄로 열어 렌더링했습니다.
Spine / libGDX.atlas검증됨 spine-canvas 4.2Spine 런타임이 회전·트림 영역을 모두 그렸습니다. libGDX 자체는 실행하지 않았습니다.
Starling / Sparrow XMLXML per page검증됨 Phaser 4.2Phaser 3.90은 트림된 XML 프레임을 잘못 그립니다(Phaser 버그). "Sparrow XML (Phaser 3)" 프리셋은 트림을 끄며 3.90·4.2 모두 통과합니다.
LÖVELua quads · nerulio_atlas.lua · main.lua검증됨 LÖVE 11.5포함된 헬퍼로 모든 프레임을 그리고 모든 애니메이션을 재생했습니다.
Defold.atlas · .tilesource빌드 확인 Defold bob.jar 1.13.1Defold 명령줄 빌더로 빌드하고 빌드된 텍스처의 UV를 다시 읽어 확인했습니다.
GameMakerspr_<name>_stripN.png · gamemaker.json미검증GameMaker에서 불러오지 않았습니다(헤드리스 실행 불가). 스트립은 GameMaker 스트립 가져오기 방식대로 자릅니다.
CSS sprites.css · preview .html검증됨 Chromium포함된 스타일시트로 모든 클래스를 그렸습니다.
GIF / APNGone file per animation디코딩 확인 Pillow내보낸 뒤 모든 프레임과 지연 시간을 다시 디코딩했습니다. APNG는 원본과 동일합니다.

검증 근거

GIF 디코더: 실제 GIF 29개 408/408프레임이 Pillow와 동일, APNG 16개 132/132프레임. .aseprite: 코퍼스 231개 파일을 가져와 다시 쓰고 Aseprite 1.3.18로 열었을 때 태그·길이·픽셀 231/231 일치. 내보내기: 실제 CC0 에셋으로 실제 엔진에서 49회 실행해 47회 통과. 실패 2회는 Phaser 3.90의 트림 XML 버그이며 Phaser 3 프리셋으로 피합니다.

한계

  • 내보내기는 항상 PPU 100을 씁니다. 게임이 다른 값을 쓰면 유니티에서 바꾸세요.
  • 검증에서는 영역·피벗·픽셀·클립 키를 확인했고, 실행 중 Animator로 클립이 재생되는지는 확인하지 않았습니다.
  • 히트박스와 충돌 폴리곤은 유니티용으로 쓰지 않고 범용 JSON에만 남습니다.
  • 격자·섬 인식은 신뢰도가 표시된 미리보기일 뿐이며 적용을 누르기 전에는 아무것도 자르지 않습니다. 모든 선택에는 한 번에 바꿀 수 있는 대안이 있습니다.
  • 레이어가 정확히 합성되지 않는 .aseprite 파일(그룹 불투명도 등)은 합쳐서 가져오고, 가져오기 패널에 이유를 표시합니다.
  • 가져온 아틀라스에서 회전된 프레임은 회전된 채로 남으며 그 내보내기는 미검증입니다.
  • 이미지는 한 변 32,768px(2억 6,800만 픽셀)까지이며 브라우저 메모리에 따라 달라집니다.

버전과 출처

Nerulio의 유니티 번들을 Unity 6000.5.3f1 배치 모드에서 실행했습니다. 함께 온 가져오기 스크립트의 Apply와 CreateClips를 호출하고(메뉴가 파일 대화상자를 열기 때문에 리플렉션으로 호출), Point 필터, 무압축, Multiple 모드, 288 × 480 사무라이 시트의 스프라이트 영역 60개 중 60개, 동일한 그림, 하나의 공통 피벗 기준, 클립 키와 시간을 다시 읽어 확인했습니다. 위에 적은 유니티 단계와 설정은 유니티 6 매뉴얼과 2D Pixel Perfect 패키지 문서를 따릅니다.

참고한 공식 문서

자주 묻는 질문

어떤 Unity 버전에서 되나요?

번들은 Unity 6000.5.3f1에서 확인했습니다. 이전 버전은 시험하지 않았습니다.

기존 시트 배치를 유지할 수 있나요?

트림과 회전을 끄면 패킹된 페이지에서 프레임이 온전히 유지되고, 스프라이트 영역은 패킹된 배치를 따릅니다.

무료인가요? 계정이 필요한가요?

이 페이지의 기능은 모두 무료이며 계정 없이 쓸 수 있습니다. 워터마크나 막혀 있는 내보내기가 없습니다.

스프라이트가 업로드되나요?

아니요. Studio는 이 브라우저 탭 안에서 디코딩·패킹·내보내기를 합니다. 프로젝트는 브라우저(IndexedDB)에 자동 저장되며 .nerulio 파일로 저장할 수 있습니다.

Aseprite나 엔진 플러그인을 설치해야 하나요?

아니요. .aseprite 파일은 브라우저에서 읽고 씁니다. 엔진별 번들에는 그 엔진에 필요한 것이 들어 있습니다(Godot는 가져오기 설정과 씬, Unity와 Godot 타일셋은 작은 편집기 스크립트).