- 핵심 질문
- 움직이는 캐릭터의 그림은 어떻게 바꿀까요?
- 학습 방식
- 이유 이해 → 화면 시연 → 한 가지씩 비교
- 이전 학습
- 4주차 이동·점프·착지
- 이어 쓸 장면
- Week06_AnimationCamera
- 수업 시간
- 핵심 설명과 시연 50분
- 도착점
- 동작 5종 · Animation Clip 5개
4주차에는 키를 눌러 Player를 움직였습니다. 그런데 가만히 서 있을 때도, 달릴 때도 같은 그림이 보였지요. 오늘은 움직이는 몸체를 유지하면서, 상황에 맞는 그림을 준비하는 방법을 배웁니다.
1교시에는 그림을 나누고 재생할 순서를 만듭니다. 2교시에는 이동 속도·공중 상태·대시 여부에 따라 Clip을 선택하고, 3교시에는 자기 프로젝트에 적용합니다. 5주차 수집·위험·목표 기능을 완성하지 않았어도 시작할 수 있습니다.
어떤 순서로 완성할까요?
지금 만든 결과를 다음 단계의 재료로 사용합니다. 한 단계가 끝날 때마다 화면에서 결과를 확인합니다.
- 시작하기 · 목표와 준비
움직임의 원리를 보고 Unity 창을 구분합니다. 기존 장면을 저장한 뒤 대기·걷기·점프·낙하·대시 그림을 준비합니다.
- 1 · 이미지 가져오기
먼저 걷기 시트와 대기 그림으로 Multiple 설정을 익힙니다. 같은 방법을 추가 동작에 적용합니다.
- 2 · 스프라이트 나누기
걷기는 여덟 칸, 대기·점프·낙하·대시는 각각 네 칸으로 나눕니다. 동작이 바뀌어도 몸의 크기와 기준점이 이어지게 맞춥니다.
- 3 · Visual에 그림 연결
Player의 자식 Visual에 그림을 붙입니다. 그림을 바꾸어도 크기와 발 위치가 유지되는지 확인합니다.
- 4 · 애니메이션 만들기
Idle에 네 장, Move에 여덟 장을 넣습니다. 대기와 걷기를 각각 미리 보고 반복 재생을 확인합니다.
- 5 · 추가 동작 완성
Jump·Fall·Dash에 각각 네 프레임을 넣어 Clip으로 만들고 다섯 Clip을 비교합니다.
- 정리 · 저장과 완료 확인
Scene과 다섯 Clip을 확인합니다. 어떤 상황에 어떤 Clip을 선택할지는 2교시에서 연결합니다.
본문의 번호 순서대로 진행하고, 각 단계의 화면에서 확인이 맞으면 다음으로 넘어갑니다. 접힌 비교 실험과 오류 안내는 필요할 때 펼칩니다. 1교시 시연을 본 뒤 3교시 개인 실습에서도 같은 순서로 따라갈 수 있습니다.
캐릭터가 이동하는 것과 그림이 움직이는 것은 다릅니다
책 모서리에 조금씩 다른 그림을 그려 빠르게 넘기면 움직이는 것처럼 보입니다. Sprite Animation도 같은 생각에서 시작합니다.
아래에서 다음 그림을 눌러 보세요. 캐릭터의 발 모양은 달라지지만, 캐릭터를 담은 네모의 위치는 그대로입니다. 재생하면 여덟 장을 1번부터 8번까지 보여 준 뒤 다시 1번으로 돌아갑니다. 이것이 한 번의 걷기 주기입니다.
01 → 02 → 03 → 04 → 05 → 06 → 07 → 08 → 01 …
같은 여덟 그림을 반복합니다. 중간 자세가 자동으로 추가되지는 않습니다.
4주차의 이동은 PlayerController가 Rigidbody2D의 속도를 바꾸어 일어났습니다. 이번에는 SpriteRenderer가 보여 주는 Sprite를 시간에 따라 교체합니다. “어디에 있는가”와 “어떤 자세로 보이는가”가 따로 정해지는 것입니다.
| 구분 | 바뀌는 것 | 예상 결과 |
|---|---|---|
| 이동만 할 때 | Player의 위치와 물리 속도 | 한 자세를 유지한 채 바닥 위를 미끄러지듯 이동합니다. |
| 그림만 재생할 때 | SpriteRenderer의 Sprite | 제자리에 서서 발 모양만 바뀝니다. |
| 이동과 그림을 연결할 때 | 물리 이동 + 이동 상황에 맞는 Clip | 앞으로 나아가면서 걷는 자세가 보입니다. 2교시의 목표입니다. |
“걷기 그림을 빨리 재생하면 실제 이동 속도도 빨라질까요?” 아래 설명을 펼치기 전에 이유를 말해 봅니다.
설명 확인
그림 교체만 빨라집니다. 실제 가로 이동 속도는 기존 이동 코드가 정합니다. 걷는 그림은 빠른데 이동은 느리면 발이 바닥 위에서 미끄러지는 것처럼 보일 수 있습니다.
먼저, 어느 창에서 무엇을 선택하는지 구분합니다
같은 “캐릭터”를 다루어도 이미지 파일과 장면 속 오브젝트는 다른 대상입니다.
Project는 재료를 보관하는 창이고, Hierarchy는 현재 장면에 놓인 오브젝트 목록입니다. Inspector는 방금 선택한 대상의 설정을 보여 줍니다. Inspector에 원하는 항목이 없으면, 설정을 찾기 전에 선택한 대상을 먼저 확인하세요.
| 창 이름 | 어떤 대상이 있나요? | 지금 확인할 것 |
|---|---|---|
| Project | Assets 폴더 안의 Scene·이미지·스크립트 파일 | Assets 폴더를 찾아 봅니다. 파일을 클릭하면 Inspector에 그 파일의 설정이 나옵니다. |
| Hierarchy | 현재 열린 Scene에 놓인 오브젝트 | 4주차 장면을 연 뒤 Player를 찾을 곳입니다. |
| Inspector | 지금 선택한 파일 또는 오브젝트의 설정 | 선택한 대상의 이름이 맨 위에 표시됩니다. 무엇을 선택했는지 먼저 읽습니다. |
예를 들어 Player를 선택한 상태에서는 PNG의 Sprite Mode를 찾을 수 없습니다. PNG를 선택한 상태에서는 Player의 Rigidbody2D가 보이지 않습니다. 서로 다른 대상의 설정이기 때문입니다.
Inspector 오른쪽 위 자물쇠가 잠겨 있는지 확인합니다. 잠금을 풀고 원하는 대상을 다시 클릭합니다.
아직 이번 수업의 그림 파일이나 Visual이 없어도 정상입니다. 다음 단계에서 장면을 열고 파일을 가져온 뒤, Player의 자식 Visual을 직접 만듭니다.
창을 닫았거나 보이지 않으면
Window → General에서 Project, Hierarchy, Inspector를 각각 다시 엽니다. 이미 열린 창이면 해당 탭을 클릭합니다.
작업 전, 4주차 장면과 자료를 준비합니다
지금 잘 움직이는 상태를 먼저 확인해 두면, 나중에 문제가 생겼을 때 어느 단계에서 달라졌는지 찾기 쉽습니다.
정상 장면을 새 이름으로 저장하기
Project 창에서
Week04_JumpCourseScene을 더블클릭해 엽니다.File → Save As를 선택하고 같은 Scenes 폴더에Week06_AnimationCamera로 저장합니다. 5주차까지 진행했다면 최근에 정상 동작한 Scene을 복사해도 됩니다.Scene은 현재 레벨의 오브젝트와 배치를 저장하는 파일입니다. 새 이름으로 저장하면 4주차 장면으로 돌아갈 수 있습니다.
화면에서 확인Hierarchy 위의 장면 이름이 Week06_AnimationCamera입니다.한 번 실행한 뒤 Play를 끄기
Unity 위쪽 중앙의 Play를 눌러 A/D 또는 좌우 방향키, Space 점프, 공중에서 다시 점프, 바닥 착지와 벽 충돌을 확인합니다. Console에 빨간 오류가 있다면 먼저 해결합니다.
확인을 마치면 같은 Play 버튼을 다시 눌러 종료합니다. 이번 설정 작업은 Play가 꺼진 편집 상태에서 합니다. Play 중 바꾼 장면 오브젝트의 값은 종료할 때 되돌아갈 수 있습니다.
화면에서 확인기존 이동이 정상이며 Play가 꺼져 있습니다.공통 자료를 프로젝트로 가져오기
위의 ZIP을 내려받아 프로젝트 밖에서 압축을 풉니다. Project 창의 Assets를 우클릭 →
Create → Folder로Week06을 만들고, 그 안에Sprites와Animations폴더를 만듭니다.Player_Idle_4.png,Player_Walk_8.png,Player_Jump_4.png,Player_Fall_4.png,Player_Dash_4.png를 파일 탐색기에서 Unity의Assets/Week06/Sprites로 드래그합니다. Walk는 8프레임, Idle·Jump·Fall·Dash는 각각 4프레임 시트입니다. 이름 끝의 _4와 _8을 확인합니다. 이전 자료의 단일 자세 PNG는 이번 Clip에 사용하지 않습니다. 함께 든PlayerAnimation.cs와PlayerDash.cs는 2교시에 사용하므로 아직 붙이지 않습니다.화면에서 확인Project 창의 Sprites 폴더에 다섯 PNG가 있고, Animations 폴더는 아직 비어 있습니다.
2~5주차의 초록 모자 캐릭터를 바탕으로 만든 걷기 8프레임과 대기·점프·낙하·대시 각 4프레임 시트, 2교시의 표현·대시 스크립트, 설정 안내가 들어 있습니다. 완성 Scene은 직접 구성합니다.
수집물이나 목표 구역이 없어도 괜찮습니다. 이번 출발점은 이동·점프·착지입니다. 여기서 막혔다면 새 설정을 진행하기 전에 교수자와 4주차 시작 상태를 확인합니다.
현재 Scene 이름은 Week06_AnimationCamera이고 Play가 꺼져 있어야 합니다. Assets/Week06/Sprites의 동작별 PNG 다섯 개를 확인합니다. 먼저 대기와 걷기로 설정 방법을 익힙니다.
먼저, 다섯 동작의 연속 그림을 준비합니다
Animator는 없는 동작을 그려 주지 않습니다. 2교시에서 상태를 연결하려면, 지금 각 상태가 사용할 Sprite와 Clip을 먼저 만들어야 합니다.
한 장의 자세로도 상태를 표시할 수 있지만, 이번에는 모든 동작에 서로 다른 연속 프레임을 사용합니다. 대기는 호흡, 걷기는 발 교대, 점프는 몸을 펴는 변화, 낙하는 균형 잡기, 대시는 짧은 돌진을 보여 줍니다. 재생 속도를 높여도 새로운 자세가 생기지는 않으므로, 그림부터 준비합니다.
| 동작 | 그림에서 바뀔 것 | Sprite 재료 | 만들 Clip |
|---|---|---|---|
| Idle · 대기 | 호흡하며 어깨·팔·모자가 조금씩 변하는 한 주기 | Player_Idle_4.png · 4프레임 | Player_Idle.anim |
| Move · 걷기 | 발을 번갈아 딛는 한 주기 | Player_Walk_8.png · 8프레임 | Player_Move.anim |
| Jump · 상승 | 도약 직후 → 무릎 접기 → 몸 펴기 → 정점 준비 | Player_Jump_4.png · 4프레임 | Player_Jump.anim |
| Fall · 낙하 | 공중에서 균형을 잡으며 옷과 팔다리가 흔들리는 한 주기 | Player_Fall_4.png · 4프레임 | Player_Fall.anim |
| Dash · 대시 | 준비 → 돌진 → 유지 → 회복 | Player_Dash_4.png · 4프레임 | Player_Dash.anim |

호흡에 따라 어깨와 팔, 모자 끝이 조금씩 변합니다. 4번에서 1번으로 이어 봅니다. 그림을 눌러 PNG를 내려받을 수 있습니다.

도약 직후부터 정점 준비까지 네 자세를 순서대로 보여 줍니다. 그림을 눌러 PNG를 내려받을 수 있습니다.

발은 공중에 두고 균형을 잡습니다. 착지 자세 없이 네 그림이 반복됩니다. 그림을 눌러 PNG를 내려받을 수 있습니다.

준비 → 돌진 → 유지 → 회복을 한 번 보여 줍니다. 그림을 눌러 PNG를 내려받을 수 있습니다.
기준 캐릭터와 고정할 위치 정하기
캐릭터 원본 한 장은 얼굴·모자·옷·몸 비율을 맞추는 참조입니다. 실제 Idle Clip에는 위의 Player_Idle_4.png를 사용합니다. 모든 동작은 오른쪽을 바라보고 머리 크기와 몸통 기준 위치를 유지합니다.
화면에서 확인같은 캐릭터가 같은 방향을 보며, 프레임마다 크기가 달라지지 않습니다.움직임을 네 자세로 나누기
대기는 편안한 자세 → 들숨 → 날숨 → 기본 자세로 돌아가는 순서, 점프는 도약 직후 → 무릎 접기 → 몸 펴기 → 정점 준비입니다. 낙하는 착지 없이 옷과 팔다리가 흔들리는 주기, 대시는 준비 → 돌진 → 유지 → 회복입니다. 직접 그리거나 기준 이미지를 참조해 제작하되 같은 그림을 네 번 복사하지 않습니다.
화면에서 확인다음 그림으로 넘길 때 자세 변화가 보이고, 반복 동작은 4번 → 1번도 자연스럽습니다.투명 배경과 칸 경계 확인하기
걷기는 가로 8칸, 나머지 동작은 가로 4칸 × 세로 1칸입니다. 체크무늬를 그린 배경이 아닌 실제 알파 투명 PNG인지 확인합니다. 모자·손·발이 옆 칸을 침범하지 않아야 합니다. 공통 자료로 먼저 완성한 뒤 직접 만든 시트로 교체할 수 있습니다.
화면에서 확인다섯 시트 모두 각 칸에 온전한 캐릭터 한 명이 들어 있습니다.
직접 제작할 때 쓸 시트 요청문
기준 캐릭터 PNG를 함께 첨부하고 첫 줄의 동작·순서를 바꾸어 사용합니다. 출력 크기와 칸 수, 실제 자세 변화는 결과 파일에서 확인합니다.
대기 호흡을 기본 자세 → 들숨 → 날숨 → 기본 자세로 돌아가는 네 프레임으로 그려 주세요.
참조 캐릭터의 얼굴, 모자, 옷, 몸 비율과 픽셀 아트 스타일을 유지하세요.
오른쪽 방향, 한 줄 4칸, 각 칸은 같은 크기이며 캐릭터 전체가 칸 안에 들어가야 합니다.
프레임마다 자세가 조금씩 달라야 하고, 마지막에서 첫 그림으로 자연스럽게 이어져야 합니다.
대기의 발 위치는 고정하고 머리 크기와 몸통 기준 위치를 일정하게 유지하세요.
목표 캔버스는 2048×256, 한 칸은 256×256입니다.
실제 알파 투명 PNG이며 글자·칸선·바닥·그림자·빛 번짐은 넣지 마세요.1교시의 도착점은 다섯 Clip의 개별 Preview입니다. 점프와 대시 Clip은 그림만 바꿉니다. 실제 점프는 기존 이동 코드, 실제 대시는 2교시에 추가할 PlayerDash가 담당합니다.
PNG 한 장에서 Animation Clip까지 이어 봅니다
Texture, Sprite Sheet, Sprite, Animation Clip의 관계를 실제 자료에 대입합니다.
준비한 PNG에는 같은 캐릭터의 걷기 그림 여덟 장이 들어 있습니다. Unity는 처음부터 “어디까지가 첫 자세이고, 어디부터 다음 자세인가”를 알지 못합니다. 우리가 그림의 영역을 나누고, 이름을 붙이고, 보여 줄 순서를 정해야 합니다.
Move_04로 사용할 영역입니다. 아래쪽은 그 영역을 확대해 보여 주는 비유입니다. Slice는 영역 정보를 저장하며, 원본 PNG를 별도 파일 여덟 개로 자르지 않습니다. 그림을 누르면 크게 볼 수 있습니다.| 이름 | 쉬운 뜻 | 이번 자료에서 찾기 |
|---|---|---|
| Texture | 색과 투명도 같은 이미지 정보를 가진 원본 | Player_Walk_8.png 전체 |
| Sprite Sheet | 여러 자세를 한 이미지에 모아 놓은 배치 | 가로 8칸 × 세로 1칸으로 놓인 걷기 그림 여덟 장 |
| Sprite | 원본에서 화면에 표시할 한 영역 | Move_01부터 Move_08까지 |
| SpriteRenderer | 장면에서 지금의 Sprite를 그리는 컴포넌트 | Visual에 붙이고 Sprite 슬롯에 그림을 연결 |
| Animation Clip | 어떤 값을 언제 보여 줄지 적은 시간표 | Player_Idle.anim과 Player_Move.anim |
Sprite Sheet는 새로운 파일 확장자가 아닙니다. 여러 그림을 모아 놓은 PNG를 그렇게 부릅니다. 또 Slice를 한다고 원본 PNG가 실제 파일 여덟 개로 잘리는 것은 아닙니다. Unity가 “이 영역을 하나의 Sprite로 사용한다”는 정보를 저장합니다.
“처음에는 Move_01을 보여 주고, 다음에는 Move_02, 그다음에는 Move_03을 보여 준다.” 이 시간표를 만들 것입니다. 위치·회전·색도 애니메이션으로 바꿀 수 있지만, 오늘의 Clip은 SpriteRenderer.Sprite 한 항목만 바꿉니다.
1단계 · 두 PNG의 사용 방법을 설정합니다
걷기 8프레임과 대기 4프레임 모두 Multiple로 가져옵니다. 한 PNG에서 여러 Sprite를 꺼내 쓰기 때문입니다.
Import Settings는 “이 파일을 Unity에서 어떻게 읽고 보여 줄 것인가”를 정하는 설정입니다. Project에서 PNG 파일을 선택해야 Inspector에 나타납니다.
먼저 걷기 시트 선택하기
Project에서
Assets/Week06/Sprites/Player_Walk_8.png를 한 번 클릭합니다. Inspector 맨 위의 이름과 Texture Import Settings를 확인합니다.이미지를 Scene에 놓는 작업은 아직 하지 않습니다. 지금은 파일의 사용 방법만 정합니다.
화면에서 확인선택한 파일은 Player_Walk_8이며 Inspector에 Texture Type이 보입니다.걷기 시트를 Multiple로 설정하고 Apply하기
아래 표의 걷기 시트 열을 입력합니다. Texture Type은
Sprite (2D and UI), Sprite Mode는Multiple입니다. 한 PNG 안에 여덟 자세가 있으므로 여러 영역을 꺼내 쓰겠다는 뜻입니다.나머지 값도 입력한 뒤 Inspector 아래의 Apply를 누릅니다. Inspector가 길면 아래로 스크롤합니다. Multiple로 바꿨다고 여덟 칸이 자동으로 생기지는 않습니다. 실제 분할은 2단계에서 합니다.
화면에서 확인Walk의 Sprite Mode는 Multiple, PPU는 220이며 설정이 적용되었습니다.대기 시트도 Multiple로 설정하고 Apply하기
이번에는 Project에서
Player_Idle_4.png를 클릭합니다. Inspector 맨 위의 이름이 Player_Idle_4로 바뀌었는지 확인한 뒤 아래 표의 대기 그림 열을 입력합니다.대기 시트에는 네 자세가 있으므로 Sprite Mode를
Multiple, PPU를220으로 지정합니다. 나머지 공통 설정을 입력하고 Apply합니다. 두 파일을 동시에 선택하지 않고 하나씩 설정합니다.화면에서 확인Idle의 Sprite Mode는 Multiple, PPU는 220이며 설정이 적용되었습니다.
| 설정 | 걷기 시트 · Player_Walk_8 | 대기 시트 · Player_Idle_4 | 설정하는 이유 |
|---|---|---|---|
| Texture Type | Sprite (2D and UI) | Sprite (2D and UI) | SpriteRenderer가 표시할 2D 그림으로 사용합니다. |
| Sprite Mode | Multiple | Multiple | 걷기는 여덟 영역, 대기는 네 영역을 사용합니다. |
| Pixels Per Unit | 220 | 220 | 화면에 보이는 캐릭터 높이를 비슷하게 맞춥니다. 다음 설명에서 PPU의 뜻을 확인합니다. |
| Filter Mode | Point (no filter) | Point (no filter) | 픽셀 아트의 경계를 흐리게 섞지 않습니다. |
| Compression | None | None | 압축에 의한 색과 윤곽 변화를 줄입니다. |
| Max Size | 4096 | 4096 | 이번 두 원본 이미지가 더 작게 축소되지 않게 합니다. |
두 PNG가 모두 Sprite로 설정되었습니다. 아직 걷기 시트가 펼쳐지지 않아도 정상입니다. PPU의 뜻을 확인한 뒤 2단계에서 걷기·대기 시트를 분할합니다.
PPU는 그림을 몇 Unit 크기로 보여 줄지 정합니다
Pixels Per Unit은 “월드의 1 Unit에 이미지 픽셀을 몇 개 넣을까?”라는 뜻입니다.
픽셀은 이미지 안의 작은 점이고, Unit은 Unity 장면에서 거리를 재는 단위입니다. 둘을 연결하는 비율이 PPU입니다. 같은 크기의 그림에서 PPU를 두 배로 바꾸면 장면 속 크기는 절반이 됩니다.
| 그림의 높이 | PPU | 칸의 월드 높이 |
|---|---|---|
| 100픽셀 | 100 | 100 ÷ 100 = 1 Unit |
| 100픽셀 | 200 | 100 ÷ 200 = 0.5 Unit |
이번 다섯 시트는 한 칸 256×256픽셀, PPU 220으로 통일했습니다. 캐릭터 비율과 기준 위치는 PNG 안에서 미리 맞췄습니다. 같은 PPU를 쓰면 동작을 바꿔도 몸체 크기가 이어집니다. 칸 전체의 월드 높이는 256 ÷ 220 ≈ 1.164 Unit이며, 실제 캐릭터 높이는 투명 여백을 제외한 값입니다.
투명 여백도 Sprite 사각형의 크기에 포함됩니다. 칸 전체의 높이와 실제 캐릭터의 머리부터 발끝까지 높이는 다를 수 있습니다. 부모와 자식의 Transform Scale도 최종 크기에 영향을 줍니다. 마지막 크기는 Visual에서 기존 Collider와 비교합니다.
PPU는 월드에서의 크기를 정합니다. Filter Mode는 확대·축소할 때 픽셀을 섞는 방식을 정합니다. 픽셀 아트가 흐릿하다면 Point 설정을 확인합니다.
2단계 · 걷기는 여덟 칸, 대기는 네 칸으로 나눕니다
걷기 원본은 2048×256픽셀, 1행 × 8열입니다. 나머지 시트는 1024×256픽셀, 1행 × 4열입니다. 어느 시트를 나눠도 한 프레임은 256×256 정사각형입니다.

Sprite Editor 열기
Project에서
Player_Walk_8.png를 선택한 상태로 Inspector의 Sprite Editor를 누릅니다. 새 창에 원본 이미지가 보입니다. 창을 넓혀 가로 한 줄의 그림 여덟 장을 확인합니다.화면에서 확인여덟 자세가 한 장의 이미지 안에 보입니다.Slice에서 C 8, R 1 입력하기
Slice를 열고 Type을
Grid by Cell Count로 선택합니다.Column & Row에 C 8, R 1을 넣습니다. C는 가로에 몇 칸을 놓을지, R은 세로에 몇 줄을 놓을지 뜻합니다.Offset과 Padding은
0, Pivot은 우선Bottom Center로 지정합니다. 처음 분할할 때 Method는Delete Existing을 사용하고 Slice를 누릅니다. 이름을 붙인 뒤 불필요하게 다시 Slice하지 않습니다.화면에서 확인256×256 정사각형 여덟 개가 가로로 생깁니다.왼쪽부터 Move_01~08로 이름 붙이기
맨 왼쪽 사각형을 클릭해 Name을
Move_01로 바꿉니다. 오른쪽으로 한 칸씩 옮기며Move_02부터Move_08까지 붙입니다.앞의 0을 포함해 두 자리 번호로 쓰면 파일 이름 순서로 정렬해도 걷기 순서를 읽기 쉽습니다. 모자·손·발이 사각형 밖으로 잘리지 않는지도 확인합니다.
화면에서 확인첫 칸은 Move_01, 마지막 칸은 Move_08입니다.Apply한 뒤 Project에서 펼치기
Sprite Editor 위쪽의 Apply를 누르고 닫습니다. Project에서 PNG 옆의 작은 펼침 화살표를 클릭합니다. Sprite 여덟 개가 PNG 아래에 나타납니다.
실제 PNG 파일 여덟 개가 새로 생기는 것은 아닙니다. 같은 원본 이미지 안에서 여덟 영역을 각각 사용하는 것입니다.
화면에서 확인Move_01부터 Move_08까지 따로 선택할 수 있습니다.
프레임별로 확대해서 보기
1번째 자세
2번째 자세
3번째 자세
4번째 자세
5번째 자세
6번째 자세
7번째 자세
8번째 자세
Grid by Cell Size와 Automatic은 언제 쓰나요?
Grid by Cell Size는 한 칸의 픽셀 크기를 직접 넣습니다. 이번 자료는 모든 시트에 Pixel Size X 256 / Y 256을 입력하면 됩니다. Offset과 Padding은 0입니다. Grid by Cell Count를 쓰면 Walk는 C 8 / R 1, 나머지는 C 4 / R 1로 같은 결과가 나옵니다.
Automatic은 투명한 경계로 그림 영역을 찾습니다. 자세마다 영역의 크기가 달라질 수 있어, 같은 칸과 기준점을 비교하는 이번 실습에서는 Grid를 사용합니다.
같은 방법으로 대기 시트를 네 칸으로 나눕니다
Project에서 Player_Idle_4.png를 선택하고 Sprite Editor를 엽니다. Slice → Grid by Cell Count → C 4 / R 1, Offset·Padding 0, 처음 분할할 때 Delete Existing으로 Slice합니다. 왼쪽부터 Idle_01, Idle_02, Idle_03, Idle_04로 이름을 붙이고 Apply합니다. 한 칸은 걷기와 같은 256×256픽셀입니다.
Project에서 걷기 PNG를 펼치면 Move_01~08, 대기 PNG를 펼치면 Idle_01~04가 나옵니다. 다음 단계에서 각 칸의 Pivot을 맞춥니다.
Sprite Editor 버튼이 없거나 열리지 않으면
Texture Type이 Sprite (2D and UI)인지, 변경 후 Apply했는지 확인합니다. 그래도 안 되면 Window → Package Management → Package Manager에서 2D Sprite 설치 상태를 확인합니다.
Pivot은 그림을 붙잡는 기준점입니다
투명 필름에 그린 그림을 압정 하나로 벽에 고정한다고 생각해 봅시다. 어느 지점에 압정을 꽂느냐에 따라 그림이 놓이는 위치가 달라집니다.

Unity에서는 이 기준점을 Pivot이라고 합니다. SpriteRenderer는 Sprite의 Pivot을 자기 Transform 위치에 맞춰 그림을 표시합니다. 이번에는 먼저 Bottom Center, 즉 사각형의 아래 중앙을 확인한 뒤, 그림의 발 아래 여백을 보정합니다.
첫 그림은 발 근처, 다음 그림은 정중앙을 Pivot으로 쓰면 어떻게 될까요? Transform은 같은 곳인데 다음 그림의 붙잡는 지점이 달라지므로, 그림만 위아래로 튀어 보입니다. 캐릭터가 점프한 것과는 다른 현상입니다.
| 확인 대상 | 같아야 하는 기준 | 다르면 나타나는 현상 |
|---|---|---|
| Unity의 분할 정보 | 칸 크기와 그림에서 기준으로 삼은 위치 | 그림을 붙이는 기준점이 달라집니다. |
| 원본 그림의 정렬 | 칸 안의 발 위치와 캐릭터 크기 | 같은 Pivot이어도 발이나 머리가 들쭉날쭉해 보입니다. |
기준점은 Sprite 사각형의 아래 중앙입니다. 발 아래에 투명 여백이 있으면 Pivot과 발 사이에도 거리가 있습니다. 각 Sprite의 발을 기준으로 Pivot을 맞춘 다음, Visual의 localPosition으로 그 발을 Collider의 밑면에 맞춥니다.
모든 프레임에 같은 기준점을 적용합니다
이번 자료는 정사각형 칸 안에서 크기와 위치를 맞췄으므로, 모든 동작에 Custom / Normalized, X 0.5 / Y 0.125를 사용합니다. 발 기준선은 한 칸의 아래에서 32픽셀 위에 있습니다. 접힌 발이나 공중 자세는 이 선에 억지로 맞추지 않습니다.
Normalized는 한 칸의 크기를 0~1로 나타내는 방식입니다. X 0.5는 가로 중앙이고, Y 0은 아래 끝, Y 1은 위 끝입니다. 아래 숫자는 제공된 그림의 투명 여백에 맞춘 값입니다.
걷기 Sprite 여덟 개의 Pivot 맞추기
Project에서
Player_Walk_8.png를 선택하고 Sprite Editor를 엽니다. Move_01 영역의 Pivot을Custom, Pivot Unit Mode를Normalized로 바꾸고 X 0.5, Y 0.125를 입력합니다. Move_02~08에도 같은 값을 넣고 Apply합니다.이름과 256×256 영역은 유지합니다. Slice를 다시 누르지 않습니다.
화면에서 확인Move_01~08의 Pivot이 모두 같습니다.대기 그림에도 같은 Pivot 적용하기
Player_Idle_4.png의 Idle_01~04에 Custom / Normalized, X 0.5, Y 0.125를 입력하고 Apply합니다. Jump·Fall·Dash도 같은 값을 씁니다.화면에서 확인모든 동작이 같은 칸 크기와 기준점을 사용합니다.
| 그림 | X | Y |
|---|---|---|
| Move_01~08 · Idle_01~04 | 0.5 | 0.125 |
| Jump_01~04 · Fall_01~04 · Dash_01~04 | 0.5 | 0.125 |
기존 자료로 만든 프로젝트는 최신 ZIP의 자동 정렬 도구로 분할 크기·PPU·Pivot을 함께 갱신합니다.
대기 Sprite 네 개와 걷기 Sprite 여덟 개가 준비되었습니다. 아직 Clip을 재생할 단계는 아닙니다. 다음 단계에서 Visual에 그림을 하나씩 넣어 발과 크기를 먼저 확인합니다.
3단계 · Player 아래에 그림을 담당할 Visual을 만듭니다
Player는 이동하고 부딪히는 몸체를 유지하고, Visual은 그 몸체를 따라다니며 그림을 보여 줍니다.

Hierarchy에서 어떤 오브젝트 아래에 들여쓰기되어 있는 오브젝트를 자식이라고 합니다. 부모 Player가 움직이면 자식 Visual도 함께 움직입니다. Visual의 위치와 크기는 부모를 기준으로 조절할 수 있습니다.
앞에서 설정한 Idle_01을 먼저 붙입니다. 걷기 Sprite는 크기와 발 위치를 비교할 때 잠시 바꿔 넣습니다.
이동, 중력, 충돌을 담당
보이는 그림과 그림 재생을 담당
Player의 자식으로 빈 오브젝트 만들기
Play가 꺼져 있는지 확인합니다. Hierarchy의
Player를 우클릭 →Create Empty로 빈 자식을 만들고 이름을Visual로 바꿉니다. Player 왼쪽 화살표를 펼쳤을 때 Visual이 안쪽에 들여쓰기되어 있어야 합니다.Visual을 선택하고 Inspector의 Transform에서 Position
(0, 0, 0), Rotation(0, 0, 0), Scale(1, 1, 1)로 맞춥니다. 자식의 이 값은 부모에 대한 상대값, 즉 local 값입니다.화면에서 확인Visual이 Player 아래에 있으며 빈 오브젝트라 아직 그림은 없습니다.SpriteRenderer를 붙이고 대기 그림 연결하기
Visual을 선택한 상태로
Add Component에서Sprite Renderer를 찾아 추가합니다. Project에서Idle_01Sprite를 Visual의 Sprite 슬롯으로 드래그합니다.컴포넌트는 오브젝트에 기능을 붙이는 단위입니다. 빈 Visual에 그림을 보여 주는 SpriteRenderer를 붙이고, 그릴 재료인 Sprite를 연결한 것입니다. 걷기 시트의 원본 PNG나 Scene 바닥으로 드래그하지 않도록 슬롯 이름을 확인합니다. Player_Idle_4.png 옆 화살표를 펼쳐 나온 하위 Sprite Idle_01을 넣습니다. 네 자세가 담긴 PNG 전체를 넣지 않습니다.
화면에서 확인Visual의 Sprite에 Idle_01이 들어가고 Scene에 캐릭터가 보입니다.기존 몸체에 새 그림의 크기와 발 맞추기
기존 Player의 SpriteRenderer에 적힌
Sorting Layer와Order in Layer를 확인하고 Visual에도 같은 값을 넣습니다. 이 설정은 다른 그림과 겹쳤을 때 앞뒤 순서를 정합니다.Hierarchy에서 Player를 선택하고 Scene 탭으로 마우스를 옮겨
F를 눌러 캐릭터를 가까이 봅니다. Scene의 Gizmos를 켜서 기존 Collider 경계를 확인합니다. 다시 Visual을 선택합니다.먼저 Scale
(1, 1, 1)에서 기존 그림과 높이를 비교합니다. 다를 때만 Visual의 Scale X와 Y에 같은 값을 넣어 맞춥니다. 예를 들어 둘 다 0.9이면 조금 작아지고, 둘 다 1.1이면 조금 커집니다.이어서 Visual의 Position Y로 발 높이를 맞춥니다. 발이 몸체 밑면보다 위에 있으면 Y를 낮추고, 아래에 있으면 높입니다. 몸통이 옆으로 어긋나면 Position X를 조절합니다. Z는 0을 유지합니다. 그림의 크기나 위치를 바꿀 때는 Inspector 맨 위 이름이 Visual인지 다시 확인합니다.
화면에서 확인Collider 크기는 그대로이며 새 그림의 발이 몸체 밑면에 맞습니다.겹친 원래 그림만 끄기
Player를 선택하고 기존 SpriteRenderer 컴포넌트 제목 옆 체크를 끕니다. Inspector 맨 위의 Player 오브젝트 전체 체크를 끄면 이동과 물리까지 멈추므로 위치를 구분합니다.
PlayerController, Rigidbody2D, Collider2D는 그대로 둡니다. 기존 DirectionMarker가 새 그림을 가리면 해당 자식만 비활성화합니다. Play로 이동·점프를 확인한 뒤 종료하고 Scene을 저장합니다.
화면에서 확인캐릭터 그림은 하나이며 기존 이동·점프·착지가 유지됩니다.그림만 바꿔 보고 Idle로 되돌리기
Play가 꺼진 상태에서 Visual을 선택합니다. Project의 걷기 PNG를 펼쳐
Move_01을 Visual의 Sprite 슬롯에 넣습니다. 이어Move_08도 넣어 봅니다. Player의 위치와 Collider는 그대로인데 자세만 달라져야 합니다.걷기로 바꿨을 때 캐릭터 전체가 커지거나 발 높이가 크게 바뀌면 두 파일의 PPU와 Pivot 값을 다시 확인합니다. 그림마다 Visual의 Transform을 따로 바꾸지 않습니다.
비교가 끝나면 Sprite 슬롯을
Idle_01로 되돌리고 Scene을 저장합니다. 아직 Animator가 없어도 할 수 있는 확인입니다.화면에서 확인Idle과 Move를 바꿔도 몸체와 발 기준이 유지되며, 마지막 Sprite는 Idle_01입니다.
부모의 크기를 바꾸면 그림뿐 아니라 자식과 Collider의 월드 크기에도 영향을 줍니다. 지금은 이미 확인한 이동과 충돌을 유지하면서 Visual의 localScale과 localPosition으로 새 그림을 맞춥니다.
직접 Sprite 슬롯을 바꾸어 자세를 확인했습니다. 다음에는 이 교체 순서를 Clip에 기록해 자동으로 재생합니다. Visual에는 SpriteRenderer가 있고, Sprite 슬롯에는 Idle_01이 있어야 합니다.
4단계 · Animation 창에서 Clip을 만듭니다
먼저 시간표 파일·편집 창·재생 담당 컴포넌트를 구분합니다.
| 이름 | 무엇인가요? | 오늘 할 일 |
|---|---|---|
| Animation Clip (.anim) | 그림 교체 순서와 시점을 저장하는 파일 | Idle과 Move를 따로 만듭니다. |
| Animation 창 | Clip의 시간표를 편집하고 미리 보는 창 | 그림을 놓고 재생해 봅니다. |
| Animator 컴포넌트 | 오브젝트에서 애니메이션을 재생하는 컴포넌트 | 다음 Idle Clip을 처음 만들 때 Visual에 자동 추가됩니다. |
| Animator Controller (.controller) | 어떤 Clip을 선택할지 정하는 상태와 전환 규칙 | 자동 생성된 파일을 보관하고 2교시에 편집합니다. |
Window → Animation → Animation은 Clip을 만드는 창입니다. 같은 메뉴 안의 Animator를 열면 네모 상태와 화살표를 다루는 다른 창이 나옵니다. 지금은 Visual을 선택하고 Animation 창을 열어 Create 버튼부터 찾습니다. 아직 Clip이 없으면 속성 목록과 시간표가 비어 있어도 정상입니다. 다음 절에서 Idle을 만들면 아래 요소를 확인할 수 있습니다.
| 화면 요소 | 읽는 방법 |
|---|---|
| Clip 이름 메뉴 | 지금 편집 중인 Idle 또는 Move를 고릅니다. |
| 왼쪽 속성 목록 · Track | 어느 컴포넌트의 어떤 값을 바꾸는지 보여 줍니다. 오늘은 SpriteRenderer : Sprite입니다. |
| 오른쪽 Timeline | 왼쪽에서 오른쪽으로 시간이 흐릅니다. |
| 마름모 · Keyframe | 그 시점부터 어떤 값을 쓸지 기록한 표시입니다. Sprite에서는 그림이 바뀌는 지점입니다. |
| Samples | 1초를 몇 개의 시간 칸으로 나누어 편집할지 정합니다. |
| Preview / 재생 버튼 | 게임 전체를 시작하지 않고 선택한 Clip을 미리 봅니다. |
| 빨간 Record 버튼 | 오브젝트 설정 변경을 Keyframe으로 기록합니다. 이번에는 Sprite를 직접 드래그해 키를 만들므로 꺼 둡니다. |
Animation 창 오른쪽 위 더보기 메뉴에서 Show Sample Rate를 켭니다. 창이 좁으면 넓혀 확인합니다. Samples는 “그림 파일이 몇 장 있는가”를 뜻하는 숫자가 아닙니다.
Clip을 확인할 때는 Animation 창 안의 ▶를 누릅니다. Unity 위쪽 중앙의 Play는 게임 전체를 실행하는 버튼입니다. 그림의 순서를 만드는 동안에는 게임 Play를 꺼 둡니다.
호흡하는 네 그림으로 Idle Clip을 만듭니다
Idle은 멈춰 있어도 살아 있는 느낌을 주는 대기 동작입니다. 발은 고정한 채 어깨·팔·모자가 조금씩 변하는 네 그림을 반복합니다.
Visual을 선택한 뒤 Create 누르기
Hierarchy에서 Visual을 선택합니다.
Window → Animation → Animation을 열고 Create를 눌러Assets/Week06/Animations/Player_Idle.anim으로 저장합니다. Visual의 Inspector에 Animator가 생기고 Controller가 연결되는지 확인합니다.Create가 없다면 Visual 선택과 창의 잠금을 확인합니다. 이미 Clip이 있다면 Clip 이름 메뉴에서 Player_Idle을 고르거나 Create New Clip을 선택합니다. 기존 단일 자세 Clip을 수정한다면 Sprite 행의 이전 키를 먼저 지웁니다.
화면에서 확인Animations 폴더에 Player_Idle.anim과 Controller가 있고 Visual의 Animator가 연결되어 있습니다.Samples 4로 정하고 Idle_01~04 선택하기
Animation 창의 Clip 이름이 Player_Idle인지 확인하고 Samples를
4로 지정합니다. Project에서Player_Idle_4.png를 펼쳐 Idle_01을 클릭한 뒤 Shift를 누른 채 Idle_04를 클릭합니다. 하위 Sprite 네 개만 선택합니다.선택한 네 Sprite를 Animation 창 오른쪽 타임라인의 0번 위치로 함께 드래그합니다. PNG 전체나 Player_Idle.anim을 드래그하는 것이 아닙니다. 빨간 Record는 꺼 둡니다.
화면에서 확인SpriteRenderer : Sprite 행의 샘플 0·1·2·3에 Idle_01~04가 순서대로 있습니다.Loop Time을 켜고 마지막에서 처음으로 이어 보기
Project에서
Player_Idle.anim을 선택해 Inspector의 Loop Time을 켭니다. Visual을 다시 선택하고 Animation 창에서 Player_Idle을 ▶로 재생합니다. 4 ÷ 4 = 1초마다 한 주기가 반복됩니다.4번 다음에 1번을 별도 키로 추가하지 않습니다. 호흡에 따른 어깨 움직임은 보이되 발이 미끄러지거나 캐릭터 전체가 점프하지 않아야 합니다. Transform 트랙이 있다면 Remove Property로 지웁니다. 확인 후 재생과 Preview를 끕니다.
화면에서 확인네 자세가 바뀌며 4번 → 1번도 이어집니다. Sprite 트랙만 있고 발 기준은 유지됩니다.
다음 그림으로 어깨·팔·모자의 차이를 찾고, 재생으로 호흡 주기를 봅니다. 4프레임 ÷ Samples 4 = 1초입니다.
현재 그림: Idle_01 (1/4) · 정지
4번 다음에 1번으로 돌아가 반복합니다. 실제 Player 이동은 Unity의 물리 코드가 담당합니다.
Player_Idle.anim의 Sprite 행에 키 네 개, Samples 4, Loop Time On을 확인합니다. 그림이 계속 한 자세라면 PNG 전체나 이전 단일 자세를 넣지 않았는지 확인합니다.
여덟 자세를 순서대로 재생하는 Move를 만듭니다
왼쪽부터 1번~8번을 한 번씩 보여 주면 한 주기입니다. 그다음에는 다시 1번으로 돌아갑니다.
Create New Clip으로 Move 만들기
Hierarchy에서 Visual을 선택하고 Animation 창의 왼쪽 위 Clip 이름 메뉴를 엽니다. Create New Clip을 선택해
Assets/Week06/Animations/Player_Move.anim으로 저장합니다.창의 Clip 이름이 Player_Move인지 확인합니다. Player_Idle인 채로 걷기 그림을 넣으면 대기 Clip을 바꾸게 됩니다. 첫 Clip에서 만든 Controller를 그대로 사용하므로 새 Controller를 따로 만들지 않습니다.
화면에서 확인Clip 메뉴에 Player_Idle과 Player_Move가 있고, 현재 선택은 Player_Move입니다.Samples 8로 정하고 걷기 Sprite 여덟 개 선택하기
Animation 창의 Samples를
8로 입력합니다. 빨간 Record는 꺼 둡니다. Project에서Sprites폴더의Player_Walk_8.png옆 펼침 화살표를 누릅니다.Move_01을 클릭한 뒤 Shift를 누른 채Move_08을 클릭해 여덟 Sprite를 함께 선택합니다. 이름이 01~08 순서로 보이는지, PNG 원본이나 Idle Sprite까지 선택하지 않았는지 확인합니다.화면에서 확인하위 Sprite Move_01~08만 선택되었고 Samples는 8입니다.타임라인 시작 위치에 넣고 순서 확인하기
선택한 여덟 Sprite를 Animation 창 오른쪽 타임라인의 0번 위치로 함께 드래그합니다. Scene이나 Hierarchy에 놓으면 다른 오브젝트가 생길 수 있으니 창 이름을 확인합니다.
SpriteRenderer : Sprite행에 키가 만들어집니다. 그 행에서 키가 여덟 개인지 확인합니다. 위쪽 요약 행의 마름모까지 합쳐 세지 않습니다. 첫 키는 0번, 마지막 키는 7번 샘플에 놓여야 합니다.Animation 창의 Preview를 켜고 시간 눈금 위를 클릭해 재생 위치를 옮겨 봅니다. 첫 위치에서 Move_01, 다음 위치에서 Move_02가 나오는지 확인합니다. 한 칸은
1 ÷ 8 = 0.125초입니다.화면에서 확인Move_01~08이 0번~7번 샘플에 한 장씩 배치되었습니다.Loop Time을 켜고 Move 미리 보기
Project의
Assets/Week06/Animations/Player_Move.anim을 선택해 Loop Time을 켭니다. 다시 Hierarchy의 Visual을 선택하고 Animation 창에서 Player_Move를 고릅니다.Animation 창 안의 ▶를 누릅니다. 캐릭터는 제자리에서 여덟 자세를 바꿔야 합니다. 확인 후 재생을 정지하고 Preview를 끕니다.
왼쪽 속성 목록에 SpriteRenderer : Sprite만 있는지도 봅니다. 실수로 Position, Rotation, Scale 트랙이 생겼다면 그 트랙 이름을 우클릭 → Remove Property로 제거하고 Record를 끕니다.
화면에서 확인걷기 자세가 순서대로 보이며 Transform을 움직이는 트랙이 없습니다.
그림 이름은 01부터, 시간 칸은 0부터 시작합니다. 눈금이 0:01처럼 보이면 “0초와 1프레임”이라는 뜻이며 0.01초가 아닙니다. Samples 8에서는 0:01이 0.125초에 해당합니다. 눈금이 좁으면 Animation 창을 넓혀 아래 순서와 비교합니다.
| 그림 | 샘플 위치 | Samples 8에서의 시각 |
|---|---|---|
| Move_01 | 0 | 0초 |
| Move_02 | 1 | 0.125초 |
| Move_03 | 2 | 0.25초 |
| Move_04 | 3 | 0.375초 |
| Move_05 | 4 | 0.5초 |
| Move_06 | 5 | 0.625초 |
| Move_07 | 6 | 0.75초 |
| Move_08 | 7 | 0.875초 |
프레임 수 8은 서로 다른 그림이 여덟 장이라는 뜻입니다. Samples 8은 1초를 여덟 시간 칸으로 나눈다는 뜻입니다. 한 칸에 한 장씩 놓았으므로 8 ÷ 8 = 1초에 한 주기가 끝납니다. Samples를 12로 바꾸면 8 ÷ 12 ≈ 0.667초가 됩니다.
Sprite 트랙에서는 마지막 키의 한 샘플 유지 시간도 길이에 포함됩니다. 0~7번의 여덟 키면 1초입니다. 맨 끝에 Move_01을 아홉 번째 키로 추가하지 않습니다. Loop Time이 다음 주기를 처음부터 재생합니다.
| Clip | 사용하는 Sprite | Samples | 역할 |
|---|---|---|---|
| Player_Idle | Idle_01~04 | 4 | 멈췄을 때 호흡 주기 반복 |
| Player_Move | Move_01~Move_08 여덟 장 | 8 | 1초에 한 번 걷기 주기 반복 |
그림 순서나 키 위치가 맞지 않으면
재생을 정지합니다. SpriteRenderer : Sprite 행의 잘못 놓인 키를 선택해 Delete로 지웁니다. 키는 Clip의 시간표 정보이므로 PNG 원본이 삭제되는 것은 아닙니다.
여덟 개 전체가 잘못 배치됐다면 해당 행의 키를 지우고 다시 넣습니다. 한꺼번에 놓기 어렵다면 Move_01부터 한 장씩 0~7번 샘플에 드래그합니다. 그림 이름과 아래 표를 대조하고 다시 미리 봅니다.
5단계 · 점프·낙하·대시도 네 프레임으로 만듭니다
대기로 익힌 분할과 키 배치를 반복합니다. 이번에는 한 번 재생할 동작과 계속 반복할 동작을 구분합니다.
| 파일 | Sprite Mode | PPU | 분할 | 왼쪽부터 이름 | Custom Pivot |
|---|---|---|---|---|---|
| Player_Jump_4.png | Multiple | 220 | C 4 / R 1 | Jump_01~04 | X 0.5 / Y 0.125 |
| Player_Fall_4.png | Multiple | 220 | C 4 / R 1 | Fall_01~04 | X 0.5 / Y 0.125 |
| Player_Dash_4.png | Multiple | 220 | C 4 / R 1 | Dash_01~04 | X 0.5 / Y 0.125 |
동작이 바뀌어도 같은 정사각형 칸을 사용합니다
Jump·Fall·Dash 시트는 각각 1024×256픽셀입니다. 1행 × 4열로 나누면 한 칸이 256×256이 됩니다. 세 시트 모두 PPU 220, Custom / Normalized Pivot X 0.5 / Y 0.125입니다. 캐릭터의 비율과 위치는 PNG 안에서 맞췄습니다.
Texture Type은 Sprite (2D and UI), Filter Mode는 Point (no filter), Compression은 None, Max Size는 4096입니다.
세 시트를 각각 네 칸으로 나누기
Jump·Fall·Dash PNG를 하나씩 선택해 위 Import 값을 입력하고 Apply합니다. Sprite Editor → Slice → Grid by Cell Count → C 4 / R 1, Offset·Padding 0으로 나눕니다. 왼쪽부터 Jump_01~04, Fall_01~04, Dash_01~04로 이름을 붙입니다. 각 칸의 Custom / Normalized Pivot을 X 0.5 / Y 0.125로 맞추고 Apply합니다.
화면에서 확인세 PNG마다 하위 Sprite 네 개가 펼쳐지고, 각 칸 안의 캐릭터가 잘리지 않습니다.Jump를 네 프레임의 한 번 재생으로 만들기
Visual 선택 → Animation 창 Clip 메뉴 → Create New Clip으로
Player_Jump.anim을 만듭니다. Samples12, Jump_01~04를 샘플 0~3에 넣고 Loop Time Off로 설정합니다. 약 0.333초 동안 도약 직후부터 정점 준비까지 보여 줍니다.실제 상승 시간이 더 길면 마지막 자세를 유지합니다. 정점이나 천장에 먼저 닿으면 2교시의 조건이 Fall로 바로 전환합니다. Clip이 중력이나 점프 높이를 결정하지 않습니다.
화면에서 확인Jump Sprite 키 네 개가 순서대로 있고, 게임에서 Jump 상태를 유지하면 끝 자세에 멈춥니다.Fall을 네 프레임의 반복으로 만들기
같은 Visual에서
Player_Fall.anim을 만들고 Samples8, Fall_01~04를 샘플 0~3에 넣습니다. Loop Time On입니다. 0.5초 주기로 옷과 팔다리의 변화가 반복됩니다.높은 곳에서 오래 떨어져도 낙하 동작은 이어져야 합니다. 착지 그림은 이 Clip에 넣지 않습니다. 바닥에 닿으면 Animator가 Idle 또는 Move로 전환할 것입니다.
화면에서 확인Fall_04 → Fall_01이 이어지며, 반복 중 착지 자세가 끼어들지 않습니다.Dash를 네 프레임의 0.2초로 만들기
Player_Dash.anim을 만들고 Samples20, Dash_01~04를 샘플 0~3에 넣습니다. 4 ÷ 20 = 0.2초, Loop Time Off입니다. 준비 → 돌진 → 유지 → 회복 순서입니다. 모든 Clip에는 Sprite 트랙만 넣고 같은 Controller를 사용합니다.화면에서 확인Jump·Fall·Dash에 각 네 키가 있고, 반복 여부가 동작의 목적과 맞습니다.
도약 직후 → 무릎 접기 → 몸 펴기 → 정점 준비를 한 번 재생합니다. 미리보기는 실제 PNG의 256×256 칸을 순서대로 보여 줍니다. 느리게 한 장씩 비교한 뒤 기본 속도로 봅니다.
현재 그림: Jump_01 (1/4) · 정지
한 번 재생한 뒤 마지막 그림에 멈춥니다. 다시 재생하면 1번부터 시작합니다. 실제 Player 이동은 Unity의 물리 코드가 담당합니다.
계속 떨어지는 동안 옷과 팔다리가 움직입니다. 4번 → 1번도 끊김 없이 이어지는지 확인합니다.
현재 그림: Fall_01 (1/4) · 정지
4번 다음에 1번으로 돌아가 반복합니다. 실제 Player 이동은 Unity의 물리 코드가 담당합니다.
네 프레임을 0.2초에 한 번 보여 줍니다. 대기의 호흡이나 걷기 주기와 자세·속도를 비교합니다.
현재 그림: Dash_01 (1/4) · 정지
한 번 재생한 뒤 마지막 그림에 멈춥니다. 다시 재생하면 1번부터 시작합니다. 실제 Player 이동은 Unity의 물리 코드가 담당합니다.
| Clip | 그림 수 | Samples | 길이 | Loop Time | 선택될 상황 |
|---|---|---|---|---|---|
| Player_Idle.anim | 4 | 4 | 1초 | On | 바닥에서 정지 |
| Player_Move.anim | 8 | 8 | 1초 | On | 바닥에서 이동 |
| Player_Jump.anim | 4 | 12 | 약 0.333초 | Off | 공중에서 상승 |
| Player_Fall.anim | 4 | 8 | 0.5초 | On | 공중에서 정점·낙하 |
| Player_Dash.anim | 4 | 20 | 0.2초 | Off | 대시 동작 중 |
걷기는 여덟 키, 대기·점프·낙하·대시는 각각 네 키입니다. 이 표의 길이는 Clip의 재생 길이이며, 그 상태에 머무를 시간은 2교시에서 물리 상태와 대시 시간으로 결정합니다.
동작을 이어서 바꾸며 확인합니다
개별 Clip이 잘 움직여도, 다른 Clip으로 바뀔 때 크기나 위치가 튈 수 있습니다. 재생을 누른 뒤 Idle → Move → Jump → Fall → Idle, Move → Dash → Move 순서로 버튼을 바꿉니다. 첫 프레임뿐 아니라 재생 중에도 전환해 봅니다.
아래는 같은 Transform 위치에서 실제 PNG·PPU·Pivot으로 그린 미리보기입니다. 몸의 자세는 바뀌지만 얼굴의 크기와 기준 위치는 이어집니다. 실제 점프와 대시의 이동은 Unity 물리 코드가 담당합니다.
같은 상태를 다시 눌러도 처음으로 돌아가지 않습니다. Jump·Dash가 끝나면 마지막 그림을 유지합니다. 다른 상태를 선택하면 그 Clip의 첫 그림으로 바뀝니다.
- Play를 종료하고 최신 실습 ZIP을 받습니다. 다섯 PNG를 기존 파일과 같은 경로에 덮어씁니다. 기존
.meta파일은 유지합니다. - ZIP의
Editor/Week06SpriteAlignment.cs를 프로젝트의Assets/Editor에 넣습니다. - 컴파일이 끝나면 Tools → Game Engine I → Apply Week 06 Sprite Alignment를 누릅니다. 256×256 분할·이름·공통 PPU·Pivot이 함께 적용됩니다.
- Visual에서 기존 Clip을 재생하고 위 순서로 상태를 바꿉니다. 기존 Sprite 이름이 같거나 한 줄의 분할 개수가 같으면 기존 Clip의 참조를 유지합니다.
처음 실습하는 경우에도 이 도구로 최종 정렬값을 적용할 수 있습니다. 직접 다른 그림을 만들었다면 그 그림에 맞게 PPU와 Pivot을 다시 정합니다.
미리보기와 게임 실행은 무엇이 다를까요?
Animation 창에서는 그림의 시간표를 확인하고, Unity 위쪽 Play에서는 실제 게임 동작을 확인합니다.
| 어디에서 누르나요? | 무엇을 확인하나요? | 지금 기대할 결과 |
|---|---|---|
| Animation 창의 재생 | 선택한 Clip의 그림 순서와 간격 | 제자리에서 Idle은 네 자세의 호흡, Move는 여덟 자세의 걷기를 보여 줍니다. |
| Unity 위쪽 중앙의 Play | 장면의 이동 코드, 물리, Animator 동작 | 기존 이동은 되지만 키 입력에 따른 Clip 전환은 아직 연결 전입니다. |
Animation 창에서 Move를 선택했다고 해서 게임 실행 중에도 반드시 Move가 재생되는 것은 아닙니다. 게임에서는 Animator Controller의 상태가 재생할 Clip을 정합니다. 1교시에는 다섯 Clip을 각각 미리 볼 수 있으면 됩니다. 바닥·공중·대시 상황에 맞는 Clip을 선택하는 조건은 2교시에서 만듭니다.
Animation 창 재생 정지 → Preview 끄기 → Record 꺼짐 확인 → Unity Play 꺼짐 확인 → File → Save로 Scene 저장. 미리보기 중 보이는 자세와 저장된 기본 Sprite가 달라도 당황하지 말고 Preview부터 끕니다.
완성한 뒤, 재생 속도를 비교합니다
Idle과 Move를 각각 미리 볼 수 있을 때 진행합니다. 아직 재생이 안 되면 앞의 완료 상태부터 확인합니다.
Samples의 차이는 같은 그림을 넘기는 박자에 빗대어 볼 수 있습니다. 두 줄의 그림 수를 먼저 세고, 한 주기를 마치는 시간을 비교합니다.
Move의 Samples를 8에서 12로 바꾸기
Visual을 선택하고 Animation 창에서 Player_Move를 고릅니다. 여덟 그림과 키 순서는 유지한 채 Samples를
8 → 12로 바꿉니다. 재생 전에 “그림 수, 교체 간격, 실제 이동 속도 중 무엇이 바뀔까?”를 말합니다.Animation 창 안의 ▶로 비교합니다. 같은 여덟 그림의 교체 간격이 짧아지고, 중간 그림이 새로 생기지는 않습니다. 확인 후 정지하고 Samples를 8로 복구합니다. Preview도 끕니다.
화면에서 확인걷기 주기가 1초에서 약 0.667초로 짧아졌다가, 복구 후 다시 1초가 됩니다.
선택 비교 · 완성한 Move에서 Pivot 하나만 바꾸기
재생과 Preview를 끈 뒤, Project의 Player_Walk_8.png → Sprite Editor에서 Move_04의 Pivot만 잠시 Center로 바꾸고 Apply합니다. Visual을 선택해 Animation 창에서 Move를 재생하고 그 자세에서 그림이 튀는지 봅니다.
확인 후 정지하고 Preview를 끕니다. Move_04를 Custom / Normalized, X 0.5, Y 0.125로 복구해 Apply합니다. Visual에서 Move를 다시 확인합니다.
대시를 끝없이 반복하면 회복 자세 뒤에 다시 돌진 자세가 나타납니다. Dash의 Loop Time은 Off로 두고, 대시가 끝났을 때 어떤 상태로 돌아갈지는 2교시에서 연결합니다. 지금은 Controller의 기본 상태를 바꾸지 않고 다섯 Clip을 각각 확인합니다.
Idle Samples 4, Move 8, Jump 12, Fall 8, Dash 20을 확인합니다. Loop Time은 Idle·Move·Fall On, Jump·Dash Off입니다. Pivot 비교를 했다면 제공된 그림의 최종 Pivot으로 복구하고 Apply합니다. Play·Preview·Record를 끄고 Scene을 저장합니다.
막혔다면, 처음 어긋난 단계로 돌아갑니다
그림 원본 → 가져오기 → 분할 → Visual 연결 → Clip 순서로 확인합니다. 한 번에 여러 설정을 바꾸지 않습니다.
캐릭터 한 명 대신 여덟 자세가 통째로 보입니다
Visual의 Sprite 슬롯에 무엇을 넣었는지 확인합니다. Project에서 PNG를 펼쳐 개별 Sprite인 Move_01을 넣어야 합니다. 펼칠 수 없다면 Multiple → Apply → Slice → Sprite Editor의 Apply 순서가 완료되었는지 돌아봅니다.
Sprite가 여덟 개가 아니거나 모자·발이 잘립니다
Slice가 Grid by Cell Count인지, C 8 / R 1인지 확인합니다. Offset과 Padding은 0입니다. 이번 시트는 원본 2048×256을 가로 여덟 칸으로 나눕니다. 한 칸은 256×256입니다. Grid by Cell Size의 X 256 / Y 256을 사용해도 됩니다. 원본의 전체 크기와 한 칸 크기를 혼동하지 않았는지 확인합니다.
그림이 두 장 겹치거나 캐릭터가 너무 큽니다
Player의 기존 SpriteRenderer 체크가 꺼졌는지 봅니다. 걷기 시트의 PPU가 220인지 확인한 뒤 Visual의 localScale을 조절합니다. Player 전체의 Scale이나 Collider를 먼저 바꾸지 않습니다. 그림이 아예 사라졌다면 Player 전체 체크를 끄지는 않았는지 확인합니다.
Animation 창이 비어 있거나 Create 버튼을 찾을 수 없습니다
Hierarchy에서 Visual을 선택했는지 확인합니다. Animator 창이 아니라 Animation 창인지도 봅니다. Visual에 이미 Animator가 있다면 Controller가 연결되어 있는지, Clip 이름 메뉴에 기존 Clip이 있는지 확인합니다. Inspector나 Animation 창의 잠금도 풀어 봅니다.
그림을 바꾸었더니 몸이 들썩이거나 크기가 바뀝니다
Clip의 왼쪽 속성 목록에 Transform의 Position·Rotation·Scale이 기록되어 있는지 봅니다. 필요 없는 트랙을 지우고 Record를 끕니다. Sprite 트랙만 남아도 흔들리면 여덟 칸의 Pivot, 원본의 발 위치와 그림 크기를 차례로 확인합니다.
이동 키를 눌러도 Idle만 계속 재생됩니다
1교시까지라면 아직 자연스러운 상태입니다. 다섯 Clip을 만들었다고 상황에 따른 선택 규칙까지 생기지는 않습니다. Animation 창에서 각 Clip을 미리 볼 수 있는지 확인하고, 2교시에서 State와 상태 전환을 연결합니다.
Scene에서는 보이지만 Game 화면에서는 보이지 않습니다
Visual의 활성 상태, SpriteRenderer의 체크와 Sprite 슬롯을 확인합니다. Color의 Alpha가 0인지, Sorting Layer와 Order in Layer가 기존 그림과 같은지도 봅니다. Scene에 보이는 캐릭터가 Main Camera의 화면 범위 안에 있는지 확인합니다.
1교시가 끝났을 때, 이 상태면 됩니다
다섯 Clip을 직접 선택해 보고, 각각 어떤 상황에서 사용할지 설명해 봅니다.
| 확인할 곳 | 남아 있어야 할 결과 |
|---|---|
| Project의 Sprite Sheet | Move_01~08, Idle_01~04, Jump_01~04, Fall_01~04, Dash_01~04가 각각 펼쳐집니다. |
| Hierarchy의 Player | 기존 물리와 이동 컴포넌트가 유지되고 Visual이 자식으로 있습니다. |
| Visual의 Inspector | SpriteRenderer와 Animator가 있으며 Controller가 연결되어 있습니다. |
| Animations 폴더 | Player_Idle.anim, Player_Move.anim, Player_Jump.anim, Player_Fall.anim, Player_Dash.anim과 Controller 하나가 있습니다. |
| Animation 창 | 모든 Clip의 그림이 순서대로 바뀝니다. Idle·Move·Fall은 반복하고 Jump·Dash는 한 번 재생합니다. |
| 편집 상태 | Play·Preview·Record를 끄고 Scene을 저장했습니다. |
질문 1 · PNG에서 Sprite 여덟 개를 나누면 파일도 여덟 개가 되나요?
아니요. PNG 한 장은 그대로이고, Unity가 그 안의 여덟 영역을 개별 Sprite로 사용할 수 있게 됩니다. Project에서 원본을 펼쳐 찾습니다.
질문 2 · PPU를 두 배로 하면 왜 그림이 작아지나요?
1 Unit에 넣는 픽셀 수가 두 배가 되기 때문입니다. 같은 픽셀 수의 그림은 절반의 Unit만 차지합니다. Transform Scale을 고정한 상태에서 비교해야 합니다.
질문 3 · 모든 Pivot에 같은 숫자를 넣으면 발이 정렬되나요?
반드시 그렇지는 않습니다. Pivot의 좌표는 Sprite 사각형을 기준으로 합니다. 이번처럼 발 아래 여백이 다르면 각 그림의 발 위치에 맞춰 값을 보정합니다. 같은 칸에 같은 크기와 위치로 그린 시트라면 같은 Pivot 값을 쓸 수 있습니다.
질문 4 · Move Clip을 재생했는데 왜 앞으로 가지 않나요?
이번 Clip은 SpriteRenderer.Sprite만 바꿉니다. 실제 이동은 기존 PlayerController와 Rigidbody2D가 담당합니다.
질문 5 · 걸을 때 Move를 선택하는 일은 누가 하나요?
Animator Controller가 상태와 전환 조건에 따라 Clip을 선택합니다. 다음 교시에서 이동 속도·바닥 접촉·수직 속도·대시 여부를 읽고 Idle·Move·Jump·Fall·Dash를 연결합니다.
현재 Sprite는 Idle_01이고 Visual에 SpriteRenderer와 Animator가 있습니다. 다섯 Clip을 모두 미리 볼 수 있어야 합니다. 게임에서 이동 키를 눌러도 아직 Idle인 것은 정상입니다. 다음 교시에서 “바닥에서 걷기, 공중에서 상승·낙하, 대시 중 돌진”이라는 선택 조건을 연결합니다.
공식 자료와 이미지 출처
Unity 6.6을 기준으로 메뉴와 개념을 확인합니다.
- Sprite Import Settings ↗Sprite Mode, Pixels Per Unit, Filter Mode
- Sprite Editor · Slice와 Pivot ↗Grid by Cell Count, Cell Size, Pivot의 기준
- Animation Clip 만들기 ↗Create와 자동 생성되는 Animator·Controller
- 키프레임과 시간 눈금 읽기 ↗초와 프레임 표기, Preview와 Record 구분
- Animation 창 사용하기 ↗선택한 오브젝트, 속성 목록, 시간 눈금
실습 시트는 2주차 Player 원본을, 설명 그림은 5주차의 초록 모자 캐릭터와 크림색 모형 스타일을 참조해 생성했습니다. 설명용 모형 그림과 실제 Unity 화면은 구분해 읽습니다. 생성 조건은 설명 그림 제작 기록과 8프레임 시트 제작 기록, 초기 동작 자료 제작 기록, 대기·점프·낙하 4프레임 제작 기록, 점프 자세·기준점 수정 기록, 동작 전환 정렬 수정 기록, 256×256 정사각형 시트 변환 기록에 보관합니다.
