Week 03 / Period 03

하나의 Script로 세 결과를 증명합니다

정해진 클릭 순서는 없습니다. 목표 상태, 기술 제약, 통과 기준을 읽고 각자 설계한 경로로 구현한 뒤 관찰 가능한 증거를 남깁니다.

세 개의 레인에서 속도와 회전이 다른 산호색 오브젝트가 검증 지점을 통과하는 목표지향 실습 장면
수업 방식
학생 목표지향 독립 실습
미션
한 Script · 한 Prefab · 세 결과
제한 시간
구현 40분 · 검증과 증거 20분
완료 정의
통과 기준 8개 모두 충족
도움 방식
힌트 단계와 진단 질문
제출
과제 1 패키지의 핵심 결과
학생 독립 미션 교수자는 결과를 대신 만들거나 다음 클릭을 지시하지 않습니다.

막혔을 때는 현재 관찰, 기대 결과, 이미 확인한 항목을 먼저 말합니다. 교수자는 정답 코드 대신 원인을 좁히는 질문이나 필요한 수준의 힌트를 제공합니다.

60분 뒤의 종료선 세 오브젝트가 같은 MotionController.cs를 사용하면서 서로 다른 속도와 회전을 보이고, 경계에서 다시 시작하며, 그 차이를 코드와 Inspector 값으로 설명할 수 있습니다.

화면이 우연히 움직이는 것만으로는 완료가 아닙니다. 재사용 구조, 시간 기반 변화, 조건, 경계 테스트, 설명 증거까지 모두 확인합니다.

  1. 미션 브리핑

    목표, 금지 조건, 통과 기준만 함께 읽습니다.

  2. 최소 동작 확보

    각자 선택한 경로로 이동하는 한 instance를 먼저 성립시킵니다.

  3. 재사용과 차이

    같은 Script를 공유하는 세 결과와 경계 동작을 완성합니다.

  4. 조건별 테스트

    정상, 변화, 경계 조건을 나누어 예상과 실제를 비교합니다.

  5. 증거 패키지

    화면 기록, 테스트표, 코드 설명을 정리합니다.

  6. 통과 판정

    8개 기준을 스스로 검사하고 미충족 항목을 표시합니다.

미션: Motion Test Lane

2D 화면 안에서 세 개의 Mover가 같은 행동 구조를 공유하되, Inspector 설정에 따라 분명히 다른 성격으로 움직이는 테스트 장면을 만듭니다.

Goal 공통 코드는 재사용하고, 차이는 데이터로 만든다.

MotionController.cs 한 파일과 PF_Mover 한 Prefab을 사용합니다. Scene에는 세 Prefab instance가 있으며, 각 instance의 직렬화된 field 값이 서로 다른 움직임을 만듭니다.

장면 이름
Week03_Motion
Script Asset
MotionController.cs 정확히 1개
Prefab
PF_Mover 1종
Scene instances
구분 가능한 Mover 3개

완성 장면에서 반드시 관찰되어야 하는 것

Behavior A

이동하고 회전하지 않음

세 instance 중 하나는 오른쪽으로 이동하지만 회전은 하지 않습니다. bool 조건의 결과가 눈에 보여야 합니다.

Behavior B

이동하며 한 방향 회전

다른 instance는 이동과 회전을 함께 수행합니다. A와 속도 차이가 분명해야 합니다.

Behavior C

다른 속도와 반대 회전

나머지 instance는 B와 다른 속도이며 회전 방향도 반대입니다. 숫자 부호의 의미가 드러나야 합니다.

Shared rule

모두 경계에서 재시작

세 instance 모두 오른쪽 경계를 넘으면 왼쪽 시작 지점으로 돌아와 움직임을 계속합니다.

숫자는 학생이 결정합니다

정해진 속도 정답은 없습니다. 다만 가장 빠른 instance와 가장 느린 instance의 차이가 한눈에 보여야 하고, resetAtXrestartAtX보다 커야 합니다. 선택한 숫자가 역할에 맞는 이유를 설명할 수 있어야 합니다.

출발점은 주어지지만, 구현 순서는 주어지지 않습니다

2주차 Scene의 복사본 또는 빈 2D Scene에서 시작할 수 있습니다. 아래 구조와 사용할 수 있는 API를 재료로 삼아 스스로 구현 경로를 정합니다.

Scene material

사용 가능한 장면 재료

  • Square, Circle 등 기본 2D Sprite
  • Transform과 SpriteRenderer
  • 2주차에 만든 정돈된 Hierarchy
  • Prefab과 instance override
Allowed API

이번 미션의 코드 재료

  • Start(), Update()
  • Debug.Log
  • Time.deltaTime
  • Transform.Translate, Transform.Rotate
  • transform.position, if, return

시작 코드 골격

field와 method의 책임만 표시되어 있습니다. TODO를 어떤 순서로 해결할지는 학생이 결정합니다. 2교시 완성 코드를 보지 않고 먼저 기억에서 복원합니다.

MotionController.cs · mission starter
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 = 8f;
    [SerializeField] private float restartAtX = -8f;

    private void Start()
    {
        // TODO: 시작을 확인할 수 있는 로그를 한 번 출력합니다.
    }

    private void Update()
    {
        // TODO: 아래 세 책임을 매 프레임 호출합니다.
    }

    private void Move()
    {
        // TODO: 오른쪽으로 시간 기반 이동을 만듭니다.
    }

    private void RotateWhenEnabled()
    {
        // TODO: bool이 허용할 때만 시간 기반 회전을 만듭니다.
    }

    private void WrapAtBoundary()
    {
        // TODO: 오른쪽 경계를 넘으면 x 위치만 왼쪽으로 옮깁니다.
    }
}

골격도 이해한 뒤 사용합니다

복사했다면 각 field가 사용될 method를 먼저 주석으로 표시합니다. 자신의 코드에 남은 줄은 모두 “왜 이 위치에 있는가”를 설명할 수 있어야 합니다.

해결 방법을 선명하게 만드는 기술 제약

제약은 창의성을 막는 규칙이 아니라 이번 주 개념을 실제로 사용했는지 확인하는 경계입니다.

Required 01

Script Asset은 하나

오브젝트마다 Script를 복사하거나 이름만 바꾼 class를 만들지 않습니다.

Required 02

값은 직렬화한 private field

속도, 회전 여부, 회전 속도, 두 경계값을 [SerializeField] private로 둡니다.

Required 03

시간 기반 변화

이동량과 회전량 모두 Time.deltaTime을 사용해 초 단위로 계산합니다.

Required 04

조건이 화면에 보임

boolif로 한 instance의 회전만 끌 수 있어야 합니다.

Required 05

작은 method로 책임 분리

Update()는 이동, 회전, 경계 method를 호출하는 읽기 쉬운 목차가 됩니다.

Not this week

물리와 입력 사용 금지

Rigidbody2D, 힘, 키보드 입력, Input System은 4주차 범위이므로 사용하지 않습니다.

AI 사용 범위

MCP와 Ask로 한 줄의 의미, Console 오류, 두 수정 후보의 차이를 물을 수 있습니다. 질문과 실제 적용 내용을 기록하고, 설명하지 못하는 코드는 제출물에 남기지 않습니다.

완료는 여덟 가지 관찰로 판정합니다

“대충 움직임”이나 “코드가 있어 보임”은 판정 기준이 아닙니다. 아래 항목을 다른 사람이 장면과 증거에서 확인할 수 있어야 합니다.

01Scene

Week03_Motion이 원본과 별도로 저장되고 Hierarchy 이름이 읽힙니다.

02Compile

Console의 빨간 컴파일 오류가 0개이며 Start 로그가 instance마다 한 번 보입니다.

03Reuse

MotionController.cs 1개와 PF_Mover 1종이 세 instance에 공유됩니다.

04Move

세 instance가 오른쪽으로 계속 이동하고 속도 차이가 화면에서 구분됩니다.

05Time

이동과 회전 계산 모두 Time.deltaTime을 포함합니다.

06Condition

한 instance는 회전하지 않고, 나머지 둘은 서로 반대 방향으로 회전합니다.

07Boundary

세 instance 모두 오른쪽 경계를 넘으면 y와 z를 유지한 채 왼쪽에서 다시 시작합니다.

08Evidence

테스트표, Inspector 값, Play 결과, 자신의 코드 설명이 제출 패키지에서 확인됩니다.

중간 시간 신호

20분 경과 시 한 instance의 시간 기반 이동이 보여야 합니다. 40분 경과 시 세 결과와 경계 동작이 보여야 합니다. 기준에 도달하지 못했다면 시각 장식과 선택 확장을 멈추고 최소 기능으로 범위를 줄입니다.

조건을 하나씩 바꾸어 원인을 검증합니다

테스트할 때 여러 값을 동시에 바꾸면 어떤 값이 결과를 만들었는지 알 수 없습니다. 한 번에 한 조건만 바꾸고 예상과 실제를 기록합니다.

Test입력 조건예상 결과관찰 기록
NormalmoveSpeed > 0, 회전 켬오른쪽 이동과 회전이 함께 지속됨통과 / 실패와 근거
Toggle같은 instance에서 회전만 끔이동은 유지되고 회전만 멈춤통과 / 실패와 근거
Direction회전 속도의 부호만 반대로이동 방향은 같고 회전 방향만 반대통과 / 실패와 근거
Boundary경계를 화면 안쪽으로 임시 이동경계 통과 즉시 x만 시작값으로 변경통과 / 실패와 근거

도움을 요청하기 전 네 가지를 기록합니다

  1. 기대

    어떤 결과를 예상했는가?

  2. 관찰

    화면과 Console에서 실제로 무엇을 보았는가?

  3. 범위

    이 결과를 담당하는 field와 method는 무엇인가?

  4. 시도

    한 번에 하나씩 무엇을 확인하거나 바꾸었는가?

필요한 만큼만 힌트를 엽니다

바로 완성 답을 보는 대신 현재 막힌 수준에 맞는 힌트 하나만 확인합니다. 확인한 뒤에는 창을 닫고 자신의 코드로 돌아갑니다.

Hint 01 · 개념Update가 복잡해졌다면?

Update()를 전체 실행 순서를 보여 주는 목차로 생각합니다. 이동, 조건부 회전, 경계 검사를 각각 이름 있는 작은 method로 분리하고 Update에서는 세 method를 호출합니다.

Hint 02 · 이동 식프레임마다 너무 빠르게 움직인다면?

이번 프레임의 이동 벡터에는 세 재료가 필요합니다: Vector3.right, moveSpeed, Time.deltaTime. 곱셈 뒤 Space.World 기준으로 Translate합니다.

Hint 03 · 조건회전을 껐는데 이동도 멈춘다면?

if의 중괄호 또는 조기 return이 통제하는 범위를 확인합니다. 회전 여부는 회전 method 안에서만 판단해야 하며 Update 전체를 빠져나가게 두지 않습니다.

Hint 04 · 경계 의사코드오른쪽 끝에서 사라진다면?

현재 x가 오른쪽 경계보다 큰가?를 판단합니다. 참이면 현재 position을 임시 변수에 담고 x만 왼쪽 시작값으로 바꾼 뒤, 수정한 Vector3를 transform.position에 다시 대입합니다.

Hint 05 · 오류 진단Console에 여러 오류가 한꺼번에 보인다면?

가장 위의 첫 빨간 오류부터 봅니다. 파일명과 줄 번호로 이동해 세미콜론, 괄호 짝, method 위치를 확인합니다. 첫 오류를 고친 뒤 저장하고, 나머지 오류가 함께 사라지는지 다시 확인합니다.

제출물은 결과와 이해의 증거를 함께 담습니다

이 미션 결과는 과제 1 ‘Unity 기초 장면과 C# Script’의 핵심입니다. 정확한 마감과 제출 시스템은 수업 공지를 따릅니다.

Submission package

제출 패키지 네 묶음

  • ProjectAssets, Packages, ProjectSettings가 포함된 Unity project. Library, Temp, Logs, obj는 제외합니다.
  • Scene정리된 Hierarchy, PF_Mover의 세 instance, 하나의 MotionController.cs가 확인되는 Week03_Motion.
  • Evidence세 instance의 Inspector 값이 한눈에 보이는 화면과 30-45초 Play Mode 영상. Console 오류 0개도 포함합니다.
  • Explanation네 조건 테스트표와 아래 다섯 문장을 자신의 말로 완성한 코드 설명.

코드 설명 다섯 문장 틀

  1. 01 · 목적MotionController는 GameObject가 ______하도록 만드는 Component입니다.
  2. 02 · 데이터Script는 하나인데 결과가 다른 이유는 각 instance의 ______이 다르기 때문입니다.
  3. 03 · 실행Update()는 매 프레임 ______, ______, ______ 순서로 method를 호출합니다.
  4. 04 · 조건shouldRotate가 false이면 ______만 건너뛰고 ______은 계속됩니다.
  5. 05 · 시간Time.deltaTime을 곱한 이유는 ______입니다.
30%

구조

하나의 Script와 하나의 Prefab을 재사용하고, Hierarchy와 이름이 읽기 쉽게 정돈되어 있습니다.

30%

동작

시간 기반 이동, 조건부 회전, 반대 회전, 경계 재시작이 의도대로 작동합니다.

20%

검증

정상·토글·방향·경계 테스트에 입력, 예상, 실제 관찰이 기록되어 있습니다.

20%

설명

field, method, if, deltaTime을 자신의 코드와 화면 결과에 연결해 설명합니다.

통과 기준을 직접 판정합니다

체크는 브라우저에 저장됩니다. 실제 증거를 확인한 항목만 표시하고, 미충족 항목은 다음 작업 목록으로 남깁니다.

Pass gate · browser saved

3교시 독립 미션 자체 점검

0 / 8 완료

8 / 8 이후 선택 확장

기본 미션을 모두 통과한 학생만 시각 역할과 parameter를 연결한 네 번째 instance를 추가합니다. 색, 크기, 속도, 회전 중 두 요소를 의도적으로 연결하고 선택 이유를 한 문장으로 기록합니다.

막혔을 때 확인하는 공식 문서

힌트로도 해결되지 않을 때 필요한 API의 입력값과 동작 규칙을 공식 문서에서 확인합니다.

Reusable objects

Prefabs ↗

공통 GameObject 구조와 instance별 override를 사용하는 방식

Component

MonoBehaviour ↗

Script Asset을 GameObject에 붙여 실행 Component로 사용하는 구조

Time

Time.deltaTime ↗

프레임률과 무관한 시간 기반 변화를 만드는 초 단위 값

질문이 남았다면

현재 코드 전체를 던지기보다 실패한 Test 이름, 입력값, 예상, 실제 관찰, 관련 method를 제시합니다. 예: “Boundary Test에서 x가 3을 넘었는데 다시 시작하지 않습니다. 조건식과 Inspector의 두 경계값을 확인했습니다.”