실습 목표와 범위
2교시에는 이동, 회전 조건, 경계 재시작을 하나씩 구현하고 검증했습니다. 이번 교시는 그 기능을 골격에서 스스로 복원하고, 같은 Script와 Prefab으로 세 가지 움직임을 만드는 시간입니다. 아래 일곱 단계를 순서대로 진행합니다. 직접 작성하거나 1교시에 연결한 AI 도구의 도움을 받을 수 있으며, 각 단계의 완료 기준을 확인한 뒤 다음으로 넘어갑니다.
먼저 대상 하나에서 동작을 완성한 뒤 Prefab으로 재사용합니다. 세 대상의 차이를 만든 후에는 예상과 실제 결과를 기록하고, 어떤 field와 method가 그 차이를 만들었는지 설명합니다. 구현 중 막히면 해당 단계에 연결된 2교시 자료를 참고하고 현재 단계로 돌아옵니다.
- 하나의
MotionController.cs와 하나의 Prefab을 세 instance에 재사용 - 시간 기반 이동, 조건부 회전, 경계 재시작을 화면에 보이게 구현
- AI 활용 기록, 테스트 결과, 코드 설명으로 차이를 검증
이번 실습의 결과물은 하나의 코드와 서로 다른 Inspector 값으로 만든 세 움직임입니다. Rigidbody2D, 힘, 키보드 입력, Input System은 추가하지 않습니다. 입력과 물리는 4주차 범위입니다.
| 시간 | 단계 | 완료 기준 |
|---|---|---|
| 0~5분 | 1 · 결과 보관 | 2교시 Scene 저장과 코드 보관 |
| 5~13분 | 2 · 골격 준비 | 별도 Scene의 대상 하나와 시작 로그 |
| 13~21분 | 3 · 이동 복원 | 속도 0과 2의 결과 비교 |
| 21~33분 | 4 · 회전과 경계 | 회전 조건과 X 재배치 확인 |
| 33~40분 | 5 · Prefab과 배치 | 하나의 원본에 연결된 세 instance |
| 40~48분 | 6 · 세 움직임 설정 | Inspector 값으로 동작 차이 만들기 |
| 48~60분 | 7 · 테스트와 제출 준비 | 관찰 기록과 코드 설명 정리 |
장면 구성 기준
2D 화면 안에서 세 개의 Mover가 같은 행동 구조를 공유하되, Inspector 설정에 따라 분명히 다른 성격으로 움직이는 테스트 장면을 만듭니다. 다른 사람이 Game 뷰만 보고도 “회전 없음 / 한 방향 회전 / 반대 회전”을 구분할 수 있어야 합니다.
필수 구성
- 장면 이름
Week03_Motion. 원본 Scene을 덮어쓰지 않고 별도로 저장합니다. 2주차 Playground를 Save As 없이 고치면 이전 실습이 사라집니다.- Script Asset
MotionController.cs정확히 1개. instance마다 Script를 복사하거나MotionController2처럼 이름만 바꾼 class를 만들지 않습니다.- Prefab
PF_Mover1종과 구분 가능한 Scene instance 3개. Hierarchy 이름은 역할이 읽히게 붙입니다. 예: Mover_A, Mover_B, Mover_C.
완성 장면에서 관찰할 것
- Behavior A
오른쪽으로 이동하지만 회전하지 않음. bool 조건의 결과가 보여야 합니다. 이동이 멈춘 것이 아닙니다.
- Behavior B
이동과 한 방향 회전을 함께 수행. A와 속도 차이가 분명해야 합니다. 숫자가 1과 1.1처럼 거의 같으면 화면에서 구분되지 않습니다.
- Behavior C
B와 다른 속도이며 회전 방향도 반대. 숫자 부호의 의미가 드러나야 합니다. 색만 다르게 하고 값이 같으면 실패입니다.
- Shared rule
세 instance 모두 오른쪽 경계를 넘으면 왼쪽 시작 지점으로 돌아와 움직임을 계속합니다. y 높이가 바뀌며 점프하듯 보이면 x만 바꾼 것이 아닙니다.
STEP 6의 출발 설정으로 먼저 비교한 뒤 자신의 속도 값을 선택할 수 있습니다. 가장 빠른 대상과 가장 느린 대상의 차이가 보여야 하고, resetAtX는 restartAtX보다 커야 합니다. 선택한 숫자가 역할에 맞는 이유를 설명합니다.
STEP 1 · 2교시 결과 확인과 보관
시작 상태: 2교시에서 이동·회전·경계 재시작을 확인한 Scene과 MotionController.cs가 열려 있습니다.
현재 결과를 한 번 실행
Play해 이동, 회전 끄기, 경계 재시작을 확인합니다. 동작이 빠졌다면 2교시 비교용 코드와 해당 함수를 확인합니다. Console 오류가 없어야 다음으로 넘어갑니다.
Play를 종료하고 저장
MotionController.cs와 현재 Scene을 저장합니다. 실행 중 바꾼 값은 종료 시 되돌아가므로 Edit Mode의 Inspector 값도 확인합니다.
완성 코드를 비교 자료로 보관
편집기의 변경 이력 또는 Unity 프로젝트 밖의 폴더에 2교시 완료 코드를 남깁니다. Assets 안에 .cs 복사본을 만들면 같은 class가 중복될 수 있습니다. 이번 실습은 보관한 코드를 참고해 빈 함수를 하나씩 복원합니다.
Scene 복사와 Script 복사는 다릅니다
Scene을 Save As로 따로 저장해도 두 Scene은 같은 MotionController.cs 파일을 사용합니다. 다음 단계에서 이 파일을 골격으로 바꾸면 원래 Scene에서도 같은 코드가 실행됩니다. 그래서 Scene 저장과 별도로 완료 코드를 먼저 보관합니다.
2교시 Scene과 코드가 저장되어 있고, 완료 코드를 다시 읽을 수 있습니다.
STEP 2 · 실습 Scene과 코드 골격 준비
시작 상태: 2교시 결과를 보관했고 Play Mode를 종료했습니다.
현재 Scene을 별도로 저장
학기 프로젝트 GameEngine1에서
File → Save As로Assets/Scenes/Week03_Motion.unity를 저장합니다. 2교시 Scene의 장면 배치를 보존한 채 실습을 이어갑니다.움직일 대상 하나 확인
2교시에서 움직인 Player를 선택해 이름을
Mover_A로 바꿉니다. 기존 MotionController Component 하나를 그대로 사용합니다. 같은 Script가 붙은 다른 대상이 있다면 이 실습 Scene에서 잠시 비활성화해 시작 로그를 구분합니다. 아직 Prefab을 만들거나 대상을 복제하지 않습니다.장면의 기준값 설정
Mover_A의 Transform Position은
(-4, 0, 0), Rotation은(0, 0, 0), Scale은(1, 1, 1)로 둡니다. Game 뷰에서 대상과 X=-4부터 4까지의 이동 구간이 보이는지 확인합니다. 구간이 잘리면 카메라의 화면 범위에 맞춰 두 경계와 시작 X를 함께 조정합니다.
시작 코드 골격
기존 Assets/Scripts/MotionController.cs의 내용 전체를 아래 골격으로 한 번 교체합니다. 새 Script를 만들거나 기존 코드 뒤에 덧붙이지 않습니다. 이 골격은 이미 컴파일할 수 있지만, 함수 안이 비어 있어 아직 움직이지 않습니다. 다음 단계부터 Move → RotateWhenEnabled → WrapAtBoundary 순서로 기존 TODO를 채웁니다.
using UnityEngine;
public class MotionController : MonoBehaviour
{
[SerializeField] private float moveSpeed = 2f;
[SerializeField] private bool shouldRotate = true;
[SerializeField] private float rotationSpeed = 90f;
[SerializeField] private float resetAtX = 4f;
[SerializeField] private float restartAtX = -4f;
private void Start()
{
// TODO: 시작을 확인할 수 있는 로그를 한 번 출력합니다.
}
private void Update()
{
// TODO: 아래 세 책임을 매 프레임 호출합니다.
}
private void Move()
{
// TODO: 오른쪽으로 시간 기반 이동을 만듭니다.
}
private void RotateWhenEnabled()
{
// TODO: bool이 허용할 때만 시간 기반 회전을 만듭니다.
}
private void WrapAtBoundary()
{
// TODO: 오른쪽 경계를 넘으면 x 위치만 왼쪽으로 옮깁니다.
}
}
파일을 저장하고 컴파일이 끝나면 Inspector를 확인합니다. 이번 출발값은 moveSpeed=2, shouldRotate=true, rotationSpeed=90, resetAtX=4, restartAtX=-4입니다. 기존 Component의 저장값이 남아 있을 수 있으므로 숫자를 직접 맞춥니다.
Start의 TODO에 Debug.Log(name + "의 움직임을 시작합니다.");를 넣습니다. Play하면 Mover_A의 움직임을 시작합니다.가 한 번 출력되고 대상은 그대로 있어야 합니다. 확인 후 Play를 종료합니다.
이번 실습의 구현 규칙
- 하나의 Script를 유지하고 설정은
[SerializeField] privatefield로 둡니다. - 이동·회전·경계 판단은 각각의 함수에 작성하고 Update에서는 호출 순서를 읽을 수 있게 합니다.
- 2교시의
Time.deltaTime, Transform API, if와 return을 사용합니다. 입력과 Rigidbody2D는 다음 주에 다룹니다.
직접 작성하거나 AI에 함수 하나씩 요청합니다
2교시의 요청·검토·실행 절차를 사용합니다. 현재 골격과 이번 함수 이름을 전달하고, TODO의 내용과 필요한 Update 호출만 수정하도록 요청합니다. 예제의 함수 전체를 참고하더라도 같은 이름의 함수를 추가하지 않습니다. 설명하지 못하는 코드는 제출물에 남기지 않습니다. 선택한 코드와 검증 결과는 AI 활용 기록에 적습니다.
별도 Scene의 Mover_A 하나에 골격이 연결되고, 오류 없이 시작 로그 한 줄이 출력됩니다.
다음 단계: 빈 Move 함수부터 채웁니다.
STEP 3 · 한 대상의 이동 복원
시작 상태: 시작 로그가 한 번 나오며 Update와 세 행동 함수는 아직 비어 있습니다.
이동 함수를 한 문장으로 설명
Move는 “초당 moveSpeed만큼 월드의 오른쪽으로 이동한다”는 책임을 가집니다.
방향 × 초당 속도 × 이번 프레임 시간에 들어갈 값을 먼저 적습니다.Move의 TODO와 Update를 수정
Move 안에서
Vector3.right * moveSpeed * Time.deltaTime으로 이동량을 계산하고,transform.Translate에Space.World와 함께 전달합니다. Update에는 우선Move();만 넣습니다. 막히면 2교시 이동 예제와 비교합니다.속도 0과 2를 따로 검증
저장·컴파일 후 Edit Mode에서 Move Speed=0으로 Play해 위치가 유지되는지 확인합니다. 종료 후 2로 바꿔 다시 Play하면 Position X만 증가해야 합니다. Y·Z와 회전은 그대로입니다. 아직 경계 함수가 비어 있어 화면 밖으로 나가면 돌아오지 않습니다.
예측: 속도 2, 프레임 시간 0.1초라면 X에 얼마를 더할까요? 0.2는 이번 이동량입니다. 현재 X가 -4라면 이동 뒤에는 -3.8이 됩니다.
한 대상이 속도 0에서는 멈추고 2에서는 오른쪽으로 이동하며, Update에는 Move 호출이 있습니다.
다음 단계: 이동을 유지한 채 회전과 경계를 차례로 복원합니다.
STEP 4 · 회전과 경계 처리 복원
시작 상태: Move가 검증되었으며 Move Speed는 2입니다. Play를 종료한 상태에서 편집합니다.
먼저 회전 조건을 복원합니다
회전 함수의 TODO 채우기
shouldRotate가 false이면 이 함수만 return하고, true이면
rotationSpeed * Time.deltaTime만큼 Z축을 중심으로 회전하도록 작성합니다. Update의 Move 호출 다음 줄에RotateWhenEnabled();를 추가합니다. 2교시 회전과 조건에서 조건식과 return의 범위를 확인할 수 있습니다.회전만 끄고 방향 바꾸기
Play 중 Should Rotate를 끄면 이동은 계속되고 회전만 멈춰야 합니다. 다시 켠 뒤 Rotation Speed를 90에서 -90으로 바꾸면 회전 방향만 반대가 되는지 봅니다. Play를 종료하고 Should Rotate 켬, Rotation Speed=90으로 맞춥니다.
그다음 경계 재시작을 복원합니다
경계 함수의 TODO 채우기
transform.position.x <= resetAtX이면 현재 함수를 끝냅니다. 경계를 넘으면 현재 position을 지역 변수로 읽고 X만 restartAtX로 바꾼 뒤 Transform에 다시 적용합니다. Update의 마지막 줄에WrapAtBoundary();를 추가합니다. 2교시 경계 처리와 비교합니다.같은 높이에서 다시 시작하는지 확인
Reset At X=4, Restart At X=-4로 Play합니다. X가 4를 넘으면 -4로 돌아오고 Y·Z는 유지되어야 합니다. 회전을 꺼도 경계 검사가 계속되는지 확인합니다. 경계가 잘 보이지 않으면 두 값을 화면 안쪽으로 조정해 관찰합니다.
Update는 Move(); → RotateWhenEnabled(); → WrapAtBoundary(); 순서입니다. 보관한 2교시 코드와 세 함수의 책임을 비교하고, 다른 줄이 있다면 동작이 같은지 설명합니다. 완료 후 Play를 종료하고 기본 설정과 Scene을 저장합니다.
대상 하나에서 이동·조건부 회전·경계 재시작이 모두 작동하고 Console 오류가 0개입니다.
STEP 5 · Prefab 생성과 세 대상 배치
시작 상태: Mover_A 하나의 동작이 모두 검증되었습니다. Play를 종료하고 저장했습니다.
검증한 대상을 Prefab으로 저장
Hierarchy의 Mover_A를 Project의
Assets/Prefabs폴더로 드래그합니다. 생성된 Prefab Asset의 이름을PF_Mover로 바꿉니다. Hierarchy의 기존 Mover_A가 이 Prefab에 연결된 첫 번째 instance입니다.두 instance를 더 생성
Project의 PF_Mover를 Hierarchy로 두 번 드래그하고 이름을
Mover_B,Mover_C로 바꿉니다. 기존 A를 포함해 세 개입니다. 각 Inspector에 MotionController가 하나씩 있고 같은 Script와 Prefab을 사용하는지 확인합니다.세 개의 높이로 나누기
A의 Position을
(-4, 2, 0), B를(-4, 0, 0), C를(-4, -2, 0)으로 둡니다. 세 대상이 Game 뷰에서 구분되는지 확인합니다. 모두 같은 크기와 회전각으로 시작하고, 위치는 서로의 부모·자식 관계가 아닌 Scene의 세 instance에서 조절합니다.
앞에서 화면에 맞춰 경계를 조정했다면 세 대상의 시작 X도 같은 restartAtX로 맞춥니다. 지금은 같은 설정을 복제했으므로 세 대상이 같은 속도로 움직이고 회전하는 것이 정상입니다. 저장한 뒤 다음 단계에서 차이를 만듭니다.
PF_Mover 1종과 연결된 A·B·C 세 instance가 서로 다른 높이에 배치되었습니다.
STEP 6 · Inspector 값으로 세 움직임 구성
시작 상태: 세 instance가 같은 코드를 사용하고, 위치만 위아래로 나뉘어 있습니다.
Play를 종료하고 Hierarchy의 각 instance를 선택합니다. 먼저 아래 값으로 시작해 결과를 비교합니다. 두 경계는 세 대상 모두 resetAtX=4, restartAtX=-4로 유지합니다. 화면에 맞춰 다른 경계를 정했다면 그 값을 세 대상에 공통으로 사용합니다.
| 대상 | moveSpeed | shouldRotate | rotationSpeed | 예상 결과 |
|---|---|---|---|---|
| Mover_A | 1 | false | 90 | 느리게 이동하며 회전하지 않음 |
| Mover_B | 2 | true | 90 | A보다 빠르게 이동하며 회전 |
| Mover_C | 3 | true | -90 | B보다 빠르게 이동하며 반대로 회전 |
원본과 개별 설정 구분
Project의 Prefab 원본이 아니라 Scene의 A·B·C 값을 바꿉니다. 개별 차이는 instance override로 둡니다. 이 차이를 Prefab 원본에 Apply하면 다른 instance의 설정에도 영향을 줄 수 있으므로 이번에는 Scene에 저장합니다.
예측하고 Play
A에 Rotation Speed=90이 있어도 회전하지 않는 이유, B와 C의 회전 방향이 다른 이유를 먼저 말합니다. Play해 예상과 비교합니다. 세 대상은 모두 오른쪽으로 가고, 자기 높이를 유지하며 경계에서 다시 시작해야 합니다.
선택한 값의 이유 기록
위 숫자로 확인한 뒤 속도 차이를 더 분명하게 만들고 싶다면 값 하나씩 바꾸어 비교합니다. 양수 이동 속도, A의 회전 끔, B·C의 반대 회전은 유지합니다. 최종 숫자와 선택 이유를 적고 Play를 종료한 뒤 Edit Mode에 반영해 저장합니다.
같은 Script와 Prefab으로 이동만 하는 A, 회전하는 B, 반대로 회전하는 C가 보입니다.
STEP 7 · 테스트와 제출 증거 정리
시작 상태: 세 움직임의 최종 Inspector 값이 Edit Mode에 저장되어 있습니다.
먼저 B를 선택해 아래 네 조건을 검사합니다. 매 테스트는 저장한 최종 값에서 시작하고, Play 중 조건 하나만 바꿔 관찰한 뒤 종료합니다. 종료 후 최종 설정이 복원되었는지 확인합니다. 마지막에는 A·B·C가 각자의 높이에서 경계를 통과하는지 모두 확인합니다.
| Test | 입력 조건 | 예상 결과 | 관찰 기록 |
|---|---|---|---|
| Normal | moveSpeed > 0, 회전 켬 | 오른쪽 이동과 회전이 함께 지속됨 | 통과 / 실패와 근거 |
| Toggle | 같은 instance에서 회전만 끔 | 이동은 유지되고 회전만 멈춤 | 통과 / 실패와 근거 |
| Direction | 회전 속도의 부호만 반대로 | 이동 방향은 같고 회전 방향만 반대 | 통과 / 실패와 근거 |
| Boundary | 경계를 화면 안쪽으로 임시 이동 | 경계 통과 즉시 x만 시작값으로 변경 | 통과 / 실패와 근거 |
관찰 기록에는 “됨” 한 글자 대신 본 것을 적습니다. 예: “shouldRotate를 끄자 Transform Rotation은 멈추고 Position X는 계속 증가함.” Toggle에서 이동까지 멈추면 return이 Update 전체를 끝냈거나 이동 코드가 같은 if 안에 들어간 것입니다.
도움을 요청하기 전 네 가지를 기록합니다
- 기대
어떤 결과를 예상했는가?
- 관찰
화면과 Console에서 실제로 무엇을 보았는가?
- 범위
이 결과를 담당하는 field와 method는 무엇인가?
- 시도
한 번에 하나씩 무엇을 확인하거나 바꾸었는가?
오류나 예상 밖의 동작을 다시 질문합니다
“안 돼요” 대신 방금 실패한 테스트의 조건과 실제 결과를 전달합니다. AI가 Unity를 직접 확인하지 않았다면 관찰 결과는 학생이 채워야 합니다. Console 오류가 없어도 예상과 다른 움직임은 다시 확인합니다.
Unity 6.6 / Assets/Scripts/MotionController.cs입니다.
현재 코드: [최신 파일을 첨부하거나 붙여 넣기]
실패한 테스트: [Normal / Toggle / Direction / Boundary 중 하나]
Inspector 값: [moveSpeed, shouldRotate, rotationSpeed, 두 경계값]
예상한 결과: [내가 기대한 동작]
실제 결과: [Play에서 관찰한 동작]
Console: [첫 오류의 전체 문장과 파일·줄 번호, 또는 오류 없음]
이 차이의 원인을 현재 코드에서 찾아 설명해주세요.
관련 함수의 최소 수정만 제안하고, 수정 후 다시 확인할 조건을 적어주세요.
제출 증거와 코드 설명
이 결과는 과제 1 ‘Unity 기초 장면과 C# Script’로 이어집니다. 테스트를 통과한 최종 상태에서 Inspector 화면과 30-45초 Play 영상을 준비합니다. 정확한 마감과 제출 시스템은 수업 공지를 따릅니다.
- Project
Assets,Packages,ProjectSettings포함된 Unity project.
Library,Temp,Logs,obj는 제외합니다. 이 폴더를 넣으면 용량만 커지고 채점 대상이 아닙니다.- Scene
Week03_Motion정리된 Hierarchy,
PF_Mover의 세 instance, 하나의MotionController.cs. 이름이 Cube, GameObject 그대로면 역할을 읽기 어렵습니다.- Evidence
- Inspector와 Play 기록
세 instance의 Inspector 값이 한눈에 보이는 화면과 30-45초 Play Mode 영상. Console 오류 0개도 포함합니다. 영상에는 이동, 회전 차이, 경계 재시작이 보여야 합니다.
- AI record
- 요청·변경·판단·검증
아래 AI 활용 기록 한 건. 미사용인 경우에도 직접 구현한 과정과 검증을 기록합니다.
- Explanation
- 테스트표와 다섯 문장
네 조건 테스트표와 아래 다섯 문장을 자신의 말로 완성한 코드 설명. 빈칸을 채운 문장이 자기 코드의 이름과 맞아야 합니다.
AI 활용 기록
기능 하나를 선택해 아래 기록을 제출합니다. 대화 전체를 복사할 필요는 없습니다. AI가 작성한 부분과 직접 수정한 부분, 선택 이유와 실제 테스트를 구분합니다. AI를 사용하지 못했다면 사유와 직접 구현·검증한 과정을 같은 양식으로 적습니다. 도구나 유료 구독 종류는 점수 기준이 아닙니다.
도구와 모델: [사용한 도구 / 표시된 모델명, 미사용이면 사유]
요청: [해결하려고 한 작업과 실제로 입력한 요청]
변경: [파일과 함수 이름 / 추가·삭제한 핵심 줄]
판단과 직접 수정: [채택·거절한 제안과 이유 / 내가 고친 부분]
검증: [테스트 이름 / Inspector 값 / 예상 / 실제 결과]
내 설명: [이 코드가 동작하는 이유를 내 말로 두 문장]
코드 설명 다섯 문장 틀
아래 빈칸을 강의 문장을 복사하지 말고, 자기 파일에 있는 이름과 화면에서 본 결과로 채웁니다. “움직이게 했습니다”처럼 역할이 없는 문장은 설명이 아닙니다.
01 · 목적MotionController는 GameObject가 ______하도록 만드는 Component입니다.02 · 데이터Script는 하나인데 결과가 다른 이유는 각 instance의 ______이 다르기 때문입니다.03 · 실행Update()는 매 프레임 ______, ______, ______ 순서로 method를 호출합니다.04 · 조건shouldRotate가 false이면 ______만 건너뛰고 ______은 계속됩니다.05 · 시간Time.deltaTime을 곱한 이유는 ______입니다.
구조
하나의 Script와 하나의 Prefab을 재사용하고, Hierarchy와 이름이 읽기 쉽게 정돈되어 있습니다.
동작
시간 기반 이동, 조건부 회전, 반대 회전, 경계 재시작이 의도대로 작동합니다.
검증
정상·토글·방향·경계 테스트에 입력, 예상, 실제 관찰이 있으며 AI 활용 기록의 검증 결과와 연결됩니다.
설명
field, method, if, deltaTime을 자신의 코드와 화면 결과에 연결해 설명합니다.
네 조건 테스트표, 최종 Inspector 값, 영상, 구현 기록과 다섯 문장 설명이 준비되었습니다.
다음 단계: 완료 점검 여덟 항목을 실제 결과와 대조합니다.
실습 완료 점검
완료는 여덟 가지 관찰로 판정합니다. Unity에서 결과를 직접 확인한 항목만 체크합니다. 이 체크는 Unity 파일을 검사하거나 제출하는 기능이 아닙니다. 예상만으로 체크하지 않습니다. Play를 눌러 화면과 Console을 본 뒤에 표시합니다.
완료 항목
Week03_Motion이 원본과 별도로 저장되고 Hierarchy 이름이 읽힘.
Console의 빨간 오류 0개, instance마다 Start 로그 한 번.
MotionController.cs 1개와 PF_Mover 1종이 세 instance에 공유됨.
세 instance가 오른쪽으로 이동하며 속도 차이가 분명함.
이동과 회전에 Time.deltaTime을 사용함.
한 instance는 회전하지 않고 둘은 반대로 회전함.
세 instance가 경계에서 y와 z를 유지한 채 x만 왼쪽 시작값으로 바뀜.
테스트표, Inspector, 영상, AI 활용 기록, 다섯 문장 설명을 준비함.
문제 해결과 힌트
바로 완성 답을 보는 대신 현재 막힌 수준에 맞는 항목만 펼칩니다. 확인한 뒤에는 창을 닫고 자신의 코드로 돌아갑니다. 힌트를 모두 열어 붙여 넣는 방식은 설명을 남기지 않습니다.
Hint 01 · Update가 복잡해졌다면?
Update()를 전체 실행 순서를 보여 주는 목차로 생각합니다. 이동, 조건부 회전, 경계 검사를 각각 이름 있는 작은 method로 분리하고 Update에서는 세 method를 호출합니다. Update 안에 Translate와 Rotate와 위치 대입이 함께 있으면, 실패한 줄이 어디인지 찾기 어렵습니다.
Hint 02 · 프레임마다 너무 빠르게 움직인다면?
이번 프레임의 이동 벡터에는 세 재료가 필요합니다: Vector3.right, moveSpeed, Time.deltaTime. 곱셈 뒤 Space.World 기준으로 Translate합니다. 속도 숫자만 줄여도 기기마다 체감이 달라질 수 있습니다. 빠진 것은 대개 시간입니다.
Hint 03 · 회전을 껐는데 이동도 멈춘다면?
if의 중괄호 또는 조기 return이 통제하는 범위를 확인합니다. 회전 여부는 회전 method 안에서만 판단해야 하며 Update 전체를 빠져나가게 두지 않습니다. if (!shouldRotate) return;가 Update 맨 위에 있으면 이동과 경계도 함께 건너뜁니다.
Hint 04 · 오른쪽 끝에서 사라진다면?
현재 x가 오른쪽 경계보다 큰가?를 판단합니다. 참이면 현재 position을 임시 변수에 담고 x만 왼쪽 시작값으로 바꾼 뒤, 수정한 Vector3를 transform.position에 다시 대입합니다. transform.position = Vector3.zero;처럼 통째로 넣으면 높이가 0으로 떨어집니다.
Hint 05 · Console에 여러 오류가 한꺼번에 보인다면?
가장 위의 첫 빨간 오류부터 봅니다. 파일명과 줄 번호로 이동해 세미콜론, 괄호 짝, method 위치를 확인합니다. 첫 오류를 고친 뒤 저장하고, 나머지 오류가 함께 사라지는지 다시 확인합니다. 아래쪽 오류는 위의 깨진 문법 때문에 연쇄로 생긴 경우가 많습니다.
선택 확장
기본 미션을 모두 통과한 뒤, 시각 역할과 parameter를 연결한 네 번째 instance를 추가할 수 있습니다. 기본 여덟 항목이 끝나기 전에 색과 크기를 먼저 바꾸지 않습니다.
네 번째 instance
색, 크기, 속도, 회전 중 두 요소를 의도적으로 연결하고 선택 이유를 한 문장으로 기록합니다. 예: 더 빠른 instance를 더 작게 만들어 속도가 크기로 읽히게 한다. 이유 없는 장식은 확장으로 보지 않습니다.
참고 자료
힌트로도 해결되지 않을 때 필요한 API의 입력값과 동작 규칙을 공식 문서에서 확인합니다. 1교시와 2교시 자료에서 문법과 실행 순서를 다시 읽는 것도 같은 작업입니다.
- Prefabs ↗공통 GameObject 구조와 instance별 override
- MonoBehaviour ↗Script Asset을 GameObject에 붙여 실행 Component로 사용하는 구조
- Serialization rules ↗Inspector에 저장할 수 있는 field와 SerializeField의 규칙
- Time.deltaTime ↗프레임률과 무관한 시간 기반 변화를 만드는 초 단위 값
- 1교시 개념 자료Script, field, method, if
- 2교시 적용 자료생명주기, Inspector, deltaTime과 완성 코드
질문이 남았다면
현재 코드 전체를 던지기보다 실패한 Test 이름, 입력값, 예상, 실제 관찰, 관련 method를 제시합니다. 예: “Boundary Test에서 x가 3을 넘었는데 다시 시작하지 않습니다. 조건식과 Inspector의 두 경계값을 확인했습니다.”