00 / ARRIVAL
3교시의 도착점
교수자의 화면을 그대로 재현하는 것이 아니라, 같은 요구사항을 스스로 해석하고 검증합니다.
- 01
WASD와 방향키로 움직이는 4방향 Player를 완성합니다.
- 02
직선과 대각선의 최대 속도를 같게 만들고 놓으면 멈추게 합니다.
- 03
정면과 대각선으로 접근해도 네 개 이상의 Wall을 통과하지 않게 합니다.
- 04
필수 테스트 8개를 모두 PASS하고 결과를 CSV와 화면 증거로 남깁니다.
01 / MISSION CONTRACT
목표는 고정하고 방법은 선택합니다
아래 사양은 모두 충족해야 합니다. 폴더를 먼저 만들지, Player를 먼저 구성할지, Input Actions부터 확인할지는 각자 결정합니다.
60분 안에 하나의 Player가 두 종류의 키보드 입력으로 일정한 속도로 움직이고, 손을 놓으면 멈추며, 네 개 이상의 Wall과 충돌하는 Scene을 완성합니다. 완료는 필수 테스트 8개의 PASS로 판단합니다.
하나의 Move Action
Player / Move가 Value / Vector2이며 WASD와 방향키의 2D Vector Composite를 모두 가집니다.
물리 기반 Player
Rigidbody2D, Collider2D, PlayerController를 사용합니다. Gravity Scale은 0이고 Z 회전은 고정합니다.
예측 가능한 이동
입력은 Update에서 읽고, linearVelocity는 FixedUpdate에서 적용합니다. 대각선 크기는 1 이하입니다.
검증 가능한 충돌장
Box Collider 2D를 가진 Wall을 네 개 이상 배치해 정면과 대각선 충돌을 반복해서 확인할 수 있게 합니다.
오류 없는 실행
Play 전후 Console Error가 0개이며, 하나의 Player를 두 Script나 Transform 코드가 동시에 움직이지 않습니다.
결과가 남는 검증
8개 테스트의 판정과 관찰 내용을 기록하고, 계기판과 코스가 보이는 화면 증거를 저장합니다.
02 / STARTING LINE
시작 상태를 먼저 안전하게 만듭니다
기존 결과를 지키고, 실습 실패가 생겨도 돌아갈 수 있는 별도 Scene에서 시작합니다.
File → Save As3주차 Scene을 덮어쓰지 않고 Week04_InputPhysics라는 새 Scene으로 저장합니다.
Console → Clear기존 오류가 있으면 새 코드의 오류와 섞입니다. 시작 전에 빨간 오류를 0개로 만듭니다.
PlayerControls.inputactions패키지가 없을 때만 Input System을 설치합니다. Editor 재시작이 필요할 수 있으므로 초반에 확인합니다.
03 / SELF-DIRECTED ROUTE
작업 순서를 스스로 고릅니다
아래는 클릭 순서가 아니라 중간 도착점입니다. 각 도착점의 확인 문장이 참이 되면 다음 문제로 이동합니다.
여섯 개의 중간 도착점
Individual work
- 계약 읽기
Scene 이름, 성공 조건, 제출 증거를 확인하고 자신이 먼저 해결할 두 항목을 정합니다.
- 입력층 준비
Move Action이 WASD와 방향키에서 올바른 Vector2를 만드는지 확인합니다.
- 물리층 준비
Player와 Wall의 2D Component를 구성하고 Collider 경계가 Sprite에 맞는지 봅니다.
- 행동 연결
2교시의 책임 구조를 참고해 입력 읽기와 속도 적용을 연결합니다.
- 테스트와 수정
T01부터 순서대로 실행하고 FAIL의 첫 원인을 한 단계씩 좁힙니다.
- 증거 저장
8 / 8 PASS, Console Error 0, 화면 기록과 파일명을 확인합니다.
- INPUT
Move 값이 방향에 맞게 바뀜
- BODY
Player에 2D 몸체와 경계가 있음
- CODE
입력과 물리 책임이 분리됨
- WALL
네 경계에서 통과하지 않음
- TEST
8 / 8 결과가 기록됨
04 / MINIMUM SPEC
구현 전에 인터페이스를 확인합니다
코드 모양은 조금 달라도 괜찮지만, 아래 입력·상태·출력과 생명주기는 같아야 합니다.
WASD와 방향키가 같은 값을 만듭니다.
가장 최근의 방향 의도를 저장합니다.
Inspector에서 조절하는 초당 속도입니다.
Rigidbody2D에 전달할 실제 물리 속도입니다.
| 위치 | 필수 책임 | 통과 기준 |
|---|---|---|
Awake | 같은 GameObject의 Rigidbody2D 참조 저장 | Play 중 NullReferenceException이 없음 |
OnEnable | Move Action 확인 및 활성화 | 입력 계기판 값이 바뀜 |
OnDisable | Move Action 비활성화 | 생명주기가 대칭임 |
Update | Vector2 읽기, 크기 최대 1로 제한 | 대각선 Speed가 직선과 같음 |
FixedUpdate | 입력 × 속도를 linearVelocity에 적용 | 손을 놓으면 즉시 Speed 0 |
05 / VERIFICATION GATE
필수 테스트 8개로 완료를 증명합니다
한 번에 여러 값을 바꾸지 않습니다. 각 행의 조건을 만들고, 기대 결과와 실제 결과를 비교한 뒤 PASS 또는 FAIL을 기록합니다.
브라우저 저장 안내 테스트 판정과 관찰 기록은 이 브라우저에 자동 저장됩니다. 학번과 이름은 현재 탭에서만 유지되며, 공용 컴퓨터에서는 실습이 끝난 뒤 탭을 닫아 주세요.
테스트 표는 좌우로 이동해 조건, 판정과 관찰 기록을 모두 확인할 수 있습니다.
| ID | 조작·조건 | 기대 결과 | 판정 | 관찰·수정 기록 |
|---|---|---|---|---|
| T01 | Play 후 아무 키도 누르지 않음 | Move (0, 0), Speed 0.00, 위치 고정 | ||
| T02 | W를 2초간 누름 | 위쪽으로 이동, Move (0, 1), Speed는 설정값 | ||
| T03 | S, A, D를 각각 짧게 누름 | 아래, 왼쪽, 오른쪽으로 정확히 대응 | ||
| T04 | 방향키 네 개를 각각 누름 | WASD와 같은 네 방향·같은 Speed | ||
| T05 | W+D를 동시에 누름 | 오른쪽 위 이동, Speed가 직선 최대값과 같음 | ||
| T06 | 이동 중 모든 키를 놓음 | 다음 물리 갱신에 Speed 0.00, 미끄러지지 않음 | ||
| T07 | Wall 정면을 향해 3초간 계속 입력 | Player가 벽을 통과하지 않고 접촉면에서 멈춤 | ||
| T08 | Wall 모서리로 대각선 입력 | 벽 안으로 들어가거나 반대편으로 빠져나가지 않음 | ||
| T09 선택 | 게임패드 왼쪽 스틱을 절반 기울임 | 기울인 방향으로 최대값보다 느리게 이동 |
판정과 관찰 기록은 자동 저장됩니다.
06 / DEBUG LADDER
FAIL은 가까운 단계부터 좁힙니다
전체 코드를 한꺼번에 바꾸지 않습니다. 화면에서 확인 가능한 신호를 왼쪽부터 따라가며 처음 끊긴 곳을 찾습니다.
1단계 힌트 · 입력값이 계속 (0, 0)
관찰: Input Actions 에셋을 열어 Move의 바인딩을 확인합니다. 비교: Action Type은 Value, Control Type은 Vector2인지 봅니다. 한 가지 수정: 에셋 저장 또는 Move Action 참조 연결 중 하나만 먼저 고칩니다.
2단계 힌트 · 값은 바뀌지만 속도가 0
관찰: PlayerController의 moveSpeed와 Rigidbody2D Body Type을 봅니다. 비교: FixedUpdate가 body.linearVelocity에 값을 쓰는지 확인합니다. 한 가지 수정: 처음 발견한 어긋남 하나만 고칩니다.
3단계 힌트 · 대각선만 더 빠름
관찰: W+D에서 Move와 Speed를 각각 기록합니다. 비교: ClampMagnitude의 결과를 다시 moveInput에 저장했는지 봅니다. 예상: moveSpeed가 5이면 직선과 대각선 모두 Speed 5입니다.
4단계 힌트 · 키를 놓아도 움직임
관찰: 키를 놓았을 때 Move가 (0, 0)으로 돌아오는지 봅니다. 값은 0인데 미끄러지면 다른 Script, Damping 또는 속도를 덮어쓰는 코드가 있는지 확인합니다.
5단계 힌트 · 벽을 통과함
관찰: Scene 뷰의 Gizmos로 두 Collider 경계를 봅니다. 비교: 양쪽 모두 2D Component인지, Wall의 Is Trigger가 꺼졌는지 확인합니다. 검색: Player Transform을 직접 바꾸는 다른 Script가 없는지 찾습니다.
6단계 힌트 · 코드가 컴파일되지 않음
Console의 가장 위에 있는 첫 빨간 오류 하나만 읽습니다. 파일명과 class명, 괄호의 짝, using UnityEngine.InputSystem;, 표시된 줄 바로 위를 순서대로 확인합니다.
07 / EVIDENCE
다른 사람이 다시 확인할 수 있게 남깁니다
작동하는 순간만 보여 주지 않습니다. 구조, 설정, 결과를 함께 남겨 재현 가능한 증거를 만듭니다.
PlayerController.cs
입력 읽기와 물리 속도 적용의 책임이 분리된 최종 Script입니다.
Week04_InputPhysics
Player 한 개와 Wall 네 개 이상이 있으며 테스트를 다시 실행할 수 있습니다.
week04_학번_이름.png
Game View의 입력 계기판과 충돌 코스, Console Error 0이 확인되는 화면입니다.
week04_학번_이름_test.csv
이 페이지에서 저장한 T01–T08 판정과 관찰·수정 기록입니다.
종료 전 8개 확인
08 / EXIT TICKET
만든 결과를 세 문장으로 설명합니다
자신의 Scene을 가리키며 빈칸을 채웁니다. 코드 줄을 읽지 않고 말할 수 있으면 이번 목표를 이해한 것입니다.
WASD와 방향키는 서로 다른 ______이지만 같은 Move ______에 연결됩니다.
Update에서 ______을 읽고, FixedUpdate에서 ______을 바꿉니다.
벽을 통과하지 않는 결과는 Rigidbody2D와 두 ______의 경계를 Physics 2D가 계산하기 때문입니다.
09 / QUICK REFERENCES
실습 중 확인할 공식 자료
메뉴나 속성이 다르게 보일 때에는 현재 Editor 버전의 공식 문서를 먼저 확인합니다.
- Input Actions ↗Action, Binding, 값 읽기와 활성화
- Rigidbody2D.linearVelocity ↗초당 X·Y 속도 API
- Fixed updates ↗물리 계산과 고정 timestep
- Collider 2D ↗2D 충돌 경계와 Collider 종류