3교시의 도착점
교수자의 화면을 재현하는 것이 아니라, 자신의 장면에서 같은 품질 조건을 만족하고 재현 가능한 증거를 남깁니다.
- 01
Player가 멈췄을 때 Idle, 움직일 때 Move가 체감 지연 없이 전환됩니다.
- 02
왼쪽·오른쪽 진행 방향이 맞고, 애니메이션이 바뀌어도 몸체와 Collider가 흔들리지 않습니다.
- 03
Cinemachine Camera가 Dead Zone과 Damping을 가진 채 Player를 부드럽게 추적합니다.
- 04
레벨의 네 끝에서 화면 밖이 보이지 않으며 필수 테스트 8개를 모두 PASS합니다.
목표는 고정하고 방법은 선택합니다
아래 결과는 모두 필요합니다. Sprite부터 정리할지, Animator부터 만들지, Camera부터 추적하게 할지는 스스로 결정합니다.
60분 안에 기존 2D Player에 반복되는 Idle과 Move, 좌우 방향 표현을 연결하고 Dead Zone, Damping과 Confiner 2D를 갖춘 Cinemachine Camera를 구성합니다. 완료는 Console Error 0과 필수 테스트 8개의 PASS로 판단합니다.
흔들리지 않는 Sprite
시트를 Multiple로 나누고 모든 프레임의 크기, PPU와 Pivot 기준을 일관되게 맞춥니다.
두 개의 반복 Clip
Player_Idle.anim과 Player_Move.anim이 적절한 Samples로 자연스럽게 반복됩니다.
입력에 반응하는 Animator
Speed Parameter와 양방향 Transition으로 Idle과 Move가 체감 지연 없이 바뀝니다.
일치하는 진행 방향
왼쪽과 오른쪽 입력에서 Sprite가 이동 방향을 향하고 Collider2D 형태는 유지됩니다.
의도가 있는 추적 감각
작은 이동을 허용하는 Dead Zone과 부드러운 Damping이 있으며 카메라는 Player의 자식이 아닙니다.
노출되지 않는 화면 밖
Confiner 2D가 레벨의 왼쪽, 오른쪽, 위와 아래 끝에서 화면 전체를 경계 안에 둡니다.
기존 동작을 보존한 복사본에서 시작합니다
애니메이션을 붙이기 전에 이동과 충돌이 정상인지 확인합니다. 새 기능 때문에 이전 기능이 망가졌는지 구분할 기준을 남깁니다.
File → Save As5주차 Scene을 Week06_AnimationCamera로 저장합니다. 5주차 Scene이 없다면 작동하는 Week04_InputPhysics 복사본에서 시작합니다.
Console → ClearPlay 후 WASD와 방향키 이동, 벽 충돌이 정상이고 빨간 오류가 0개인지 먼저 확인합니다.
Package ManagerCinemachine이 없다면 Window → Package Management → Package Manager에서 설치합니다. 설치가 끝난 뒤 메뉴가 나타나는지 확인합니다.
Assets/Week06Sprites, Animations, Controllers 폴더로 결과를 구분합니다. 기존 에셋을 이동해 참조를 끊지 않습니다.
작업 순서를 스스로 고릅니다
아래는 클릭 순서가 아니라 중간 도착점입니다. 자신에게 가장 큰 불확실성부터 해결해도 됩니다.
여섯 개의 중간 도착점
개인 실습
- 계약과 시작 상태 확인
Scene 이름, 기존 이동, 제출 증거와 자신이 먼저 해결할 두 항목을 정합니다.
- 프레임 기반 준비
Import, Slicing과 Pivot을 확인하고 Idle과 Move Clip이 Preview에서 반복되게 합니다.
- 상태와 방향 연결
Animator와 Speed를 연결하고 왼쪽과 오른쪽에서 그림 방향이 맞는지 확인합니다.
- 카메라 감각 구성
Tracking Target, Position Composer, Dead Zone과 Damping을 한 값씩 조절합니다.
- 경계와 필수 테스트
Confiner 2D를 연결하고 T01부터 실패한 항목의 첫 원인을 좁힙니다.
- 증거와 종료 확인
8 / 8 PASS, Error 0, 영상과 CSV 파일명을 확인합니다.
- FRAME
Preview에서 두 Clip 반복
- STATE
Speed로 Idle ↔ Move
- FACE
좌우 방향 일치
- FOLLOW
Dead Zone 뒤 부드러운 추적
- EDGE
네 끝에서 화면 밖 0
구현 전에 필수 인터페이스를 확인합니다
에셋 이름과 세부 수치는 달라도 괜찮지만, 아래 입력, 상태와 출력의 역할 분리는 유지합니다.
기존 이동 의도, 정지면 0입니다.
입력 크기를 Animator에 전달합니다.
조건에 따라 반복 Clip을 선택합니다.
Player root를 추적하고 외곽 안에 머뭅니다.
| 영역 | 필수 사양 | 통과 기준 |
|---|---|---|
| Hierarchy | Player root에 물리, Visual 자식에 SpriteRenderer·Animator | Clip 전환 중 Collider와 root 위치가 흔들리지 않음 |
| Clips | Idle·Move 각각 Loop Time On, Sprite Keyframe만 사용 | Preview와 Play Mode에서 끊김 없이 반복 |
| Animator | Speed Float, 양방향 Transition, Has Exit Time Off | 입력 시작·종료 후 0.2초 안에 상태 변경 |
| Facing | 수평 입력이 0이 아닐 때만 마지막 좌우 방향 갱신 | 멈춰도 마지막 방향 유지, Collider 변화 없음 |
| Follow | Player root Tracking Target, Position Composer 사용 | 작은 이동은 허용하고 범위를 벗어나면 부드럽게 추적 |
| Boundary | PolygonCollider2D와 Confiner 2D 연결 | Game View의 네 화면 가장자리가 레벨 밖을 보이지 않음 |
필수 테스트 8개로 완료를 증명합니다
각 테스트는 한 조건만 바꿉니다. 기대 결과와 실제 결과를 비교하고, FAIL이면 처음 보인 현상과 바꾼 한 가지를 기록합니다.
| ID | 조작과 조건 | 기대 결과 | 판정 | 관찰과 수정 기록 |
|---|---|---|---|---|
| T01 | Play 후 2초 동안 입력하지 않음 | Idle Clip이 반복되고 Player·Visual 위치가 흔들리지 않음 | ||
| T02 | D 또는 오른쪽 방향키를 누름 | 0.2초 안에 Move로 전환되고 이동 중 반복 재생 | ||
| T03 | Move 중 모든 이동키를 놓음 | 0.2초 안에 Idle로 돌아오고 마지막 방향을 유지 | ||
| T04 | A와 D를 번갈아 입력 | Sprite가 매번 진행 방향을 향하고 Collider2D 모양은 유지 | ||
| T05 | 상하좌우와 대각선 이동, 벽 충돌을 반복 | Animation 전환 중에도 Visual이 튀지 않고 이동과 충돌이 이전과 같음 | ||
| T06 | 화면 중앙에서 Dead Zone 안만큼 짧게 이동 | Player는 움직이지만 카메라 프레임은 움직이지 않음 | ||
| T07 | 한 방향으로 계속 이동해 Dead Zone을 벗어남 | 카메라가 갑자기 붙거나 떨리지 않고 일정한 Damping으로 추적 | ||
| T08 | 레벨의 왼쪽, 오른쪽, 위와 아래 끝에 차례로 도달 | 네 위치 모두 Game View에 레벨 밖 배경이 한 줄도 드러나지 않음 | ||
| T09 선택 | Game View를 16:9와 4:3으로 바꿔 네 끝 확인 | 두 화면 비율에서도 카메라 경계가 안정적으로 유지됨 |
입력한 결과는 이 브라우저에 자동 저장됩니다.
FAIL은 보이는 신호를 따라 좁힙니다
코드와 Inspector를 동시에 바꾸지 않습니다. 왼쪽부터 확인해 처음 끊긴 단계에서 한 가지만 수정합니다.
Clip Preview부터 흔들립니다
관찰: 각 Sprite의 Rect와 Pivot 표시를 비교합니다. 한 가지 수정: 모든 프레임의 Pivot을 같은 발 중심으로 맞춘 뒤 Apply합니다. Rigidbody2D나 Camera 값은 아직 바꾸지 않습니다.
두 Clip은 정상인데 상태가 바뀌지 않습니다
Play 중 Animator 창의 Speed 값을 봅니다. 0에서 변하지 않으면 Animator 참조와 SetFloat를, 값이 변하면 Condition, Parameter 철자와 Transition 방향을 확인합니다.
상태 전환이 늦습니다
Has Exit Time을 끄고 Transition Duration을 0에 가깝게 낮춥니다. 두 값을 동시에 바꾸었다면 하나를 되돌리고 어떤 설정이 지연을 만들었는지 기록합니다.
왼쪽에서 Player 전체가 뒤집힙니다
Player root의 Scale X를 확인합니다. 음수로 바꾸지 말고 Visual의 SpriteRenderer에 flipX를 적용합니다. Scene View에서 Collider Gizmo가 변하지 않는지 봅니다.
Camera가 너무 붙거나 늦게 따라옵니다
먼저 Dead Zone만 조절해 “언제 움직일지”를 맞춥니다. 그다음 Damping만 조절해 “얼마나 빨리 따라갈지”를 맞춥니다. Camera가 Player 자식이면 먼저 분리합니다.
한쪽 끝에서만 화면 밖이 보입니다
Game View를 유지한 채 PolygonCollider2D의 해당 쪽 꼭짓점과 Orthographic Size를 비교합니다. Bounding Shape 연결이 맞다면 경계가 화면 반쪽 크기만큼 안쪽에서 멈추는 것이 정상입니다.
코드가 컴파일되지 않습니다
Console의 가장 위 첫 빨간 오류 하나만 읽습니다. 오류 파일과 줄, 괄호, animator와 spriteRenderer 필드 선언, Parameter ID 철자를 순서대로 확인합니다.
정지 화면이 아닌 동작 증거를 남깁니다
Animation과 Camera는 시간에 따른 변화이므로 영상이 필요합니다. 에셋 구조와 테스트 기록을 함께 제출해 다시 확인할 수 있게 합니다.
Week06_AnimationCamera.unity
Player, Visual, Cinemachine Camera와 CameraBounds가 연결된 재실행 가능한 Scene입니다.
Player_Idle.anim, Player_Move.anim
두 Clip과 이를 연결한 Animator Controller를 함께 제출합니다.
week06_학번_이름_demo.mp4
15-25초 안에 Idle → Move → Idle, 좌우 방향, Camera follow와 한 경계 도달을 끊지 않고 보여 줍니다.
week06_학번_이름_test.csv
이 페이지에서 저장한 T01-T08 판정, 관찰과 수정 기록입니다.
종료 전 8개 확인
체크 결과는 이 브라우저에 저장됩니다.
자신의 선택을 세 문장으로 설명합니다
수치 자체보다 그 수치가 만든 결과를 말합니다. 자신의 Game View를 가리키며 빈칸을 채웁니다.
내 Animator는 Speed가 ______일 때 Idle, ______일 때 Move를 재생합니다.
Dead Zone은 ______만큼의 작은 이동을 허용하고, Damping ______은 카메라를 ______하게 느끼게 합니다.
CameraBounds는 ______ 모양이며, 네 끝에서 화면의 ______가 레벨 밖으로 나가지 않습니다.
실습 중 확인할 공식 자료
메뉴나 속성이 다르게 보일 때에는 검색 결과보다 현재 버전의 Unity와 Cinemachine 공식 문서를 먼저 확인합니다.
- Sprite texture Import Settings ↗Multiple, PPU, Pivot과 Filter Mode
- Animation transitions ↗Transition Condition과 Has Exit Time
- Animator.SetFloat ↗Speed Float Parameter 갱신
- Position Composer ↗2D Camera의 Dead Zone과 Damping
- Cinemachine Confiner 2D ↗화면 가장자리를 Polygon 경계 안에 두는 방법