Week 03 / Period 01

코드를 ‘읽는 법’부터 배웁니다

C# 문법을 낱말처럼 외우기보다, 어떤 값을 기억하고 어떤 조건에서 어떤 행동을 실행하는지 하나의 흐름으로 이해합니다.

왼쪽의 코드 구조가 가운데 컴포넌트 설정을 거쳐 오른쪽 2D 오브젝트의 연속 위치 변화로 이어지는 장면
수업 방식
교수자 설명과 코드 판독
핵심 질문
코드 한 줄은 무엇을 기억하고 판단하는가?
이전 학습
GameObject · Component · Transform
핵심 개념
field · type · method · condition
학생 활동
예측하고 자신의 말로 설명하기
다음 교시
Unity가 코드를 실행하는 방식
교수자 설명 자료 이 교시에는 Unity 프로젝트를 따라 만들지 않습니다.

교수자는 화면의 코드와 도해를 이용해 개념을 설명하고, 학생은 짧은 예측 질문에 답합니다. 실제 구현은 3교시의 독립 미션에서 진행합니다.

오늘의 도착점 코드를 보고 “기억하는 값, 실행하는 행동, 행동을 결정하는 조건”을 구분해 설명할 수 있습니다.

철자 전체를 외우는 것보다 각 요소의 책임을 구분하는 능력이 먼저입니다. 이 구분이 되면 새로운 코드를 만나도 구조부터 읽을 수 있습니다.

  1. 이전 학습 회수

    GameObject와 Component의 관계를 질문으로 복원합니다.

  2. Script의 자리

    Script Asset과 Component instance를 구분합니다.

  3. 값을 읽는 법

    field, 이름, 자료형, 초기값의 역할을 해석합니다.

  4. 행동을 읽는 법

    method, parameter, return을 입력과 결과로 연결합니다.

  5. 판단을 읽는 법

    bool과 if가 실행 경로를 어떻게 나누는지 추적합니다.

  6. 회수 질문

    핵심 개념을 보지 않고 한 문장씩 설명합니다.

Script는 GameObject의 행동 Component입니다

Unity에서 Script는 독립적으로 떠다니는 명령문이 아닙니다. GameObject에 붙어 그 오브젝트의 값과 행동을 담당하는 Component가 됩니다.

01Script Asset

Project 창에 저장한 공통 행동 설계도

02Attach

GameObject에 Script를 Component로 부착

03Instance

각 GameObject가 자기 값을 가진 복사본을 보유

04Execute

Play 중 Unity가 약속된 함수를 호출

설계도 하나, 인스턴스는 여러 개

MotionController.cs 하나를 세 GameObject에 붙이면 Script 파일은 하나지만 Component instance는 셋입니다. 공통 행동은 한 곳에서 관리하고, 각 오브젝트의 속도처럼 달라야 하는 값은 instance마다 따로 가질 수 있습니다.

Retrieval 01

같은 Script를 세 GameObject에 붙이면 생기는 것은?

가장 정확한 설명을 고릅니다.

변수는 값을 기억하는 이름표입니다

Component 안에 선언되어 오브젝트의 상태를 계속 기억하는 변수를 field라고 부릅니다. 한 줄을 “접근 범위 → 자료형 → 이름 → 초기값” 순서로 읽습니다.

Field anatomy · 설명용
[SerializeField] private float moveSpeed = 2.5f;
[SerializeField] private bool shouldRotate = true;
  • [SerializeField]private field를 Inspector에 저장하고 표시하라는 Unity의 표시입니다. 자세한 동작은 2교시에 설명합니다.
  • private이 값을 이 class의 내부 구현으로 제한합니다. 다른 Script가 무분별하게 바꾸지 못하게 합니다.
  • float / bool저장할 값의 종류입니다. 자료형은 가능한 연산과 Inspector의 입력 방식을 함께 정합니다.
  • moveSpeed사람이 역할을 이해할 수 있도록 붙인 이름입니다. C# field는 보통 소문자로 시작하는 camelCase를 씁니다.
  • = 2.5f / true처음 사용할 기본값입니다. ;은 하나의 명령이 끝났음을 나타냅니다.

이번 주에 자주 만나는 네 가지 자료형

int

정수

개수, 점수, 단계처럼 소수점이 필요 없는 값을 담습니다.

lifeCount3
float

실수

속도, 시간, 위치처럼 소수점이 필요한 값을 담습니다. 리터럴 뒤에 f를 붙입니다.

moveSpeed2.5f
bool

논리값

truefalse 중 하나를 담아 기능을 켜고 끄는 판단 재료가 됩니다.

shouldRotatetrue
Vector3

세 축의 묶음

x, y, z 세 float를 한 값처럼 다룹니다. 2D Transform도 위치를 Vector3로 저장합니다.

position(2, 1, 0)

자료형은 단순한 이름표가 아닙니다

bool에는 2.5를 넣을 수 없고, float에는 true를 넣을 수 없습니다. 자료형은 잘못된 값을 일찍 발견하게 해 주는 약속입니다.

함수는 이름 붙인 행동 묶음입니다

C#에서는 class 안의 함수를 method라고 부릅니다. method를 읽을 때는 “무엇을 받는가, 무엇을 하는가, 무엇을 돌려주는가”를 확인합니다.

Method anatomy · 입력과 결과
private float CalculateDistance(float speed, float seconds)
{
    float distance = speed * seconds;
    return distance;
}
float

반환 자료형

method가 일을 마친 뒤 float 결과 하나를 돌려준다는 뜻입니다. 결과가 없으면 void를 씁니다.

CalculateDistance

method 이름

행동이 드러나는 동사 형태로 짓습니다. C# method 이름은 보통 대문자로 시작하는 PascalCase를 사용합니다.

(float speed, float seconds)

parameter

호출하는 쪽에서 전달받을 입력의 종류와 이름입니다. 이 method는 두 개의 float가 필요합니다.

return distance;

결과 반환

계산한 값을 호출한 위치로 돌려주고 method 실행을 끝냅니다.

CalculateDistance(2f, 3f) → 2 × 3 → 6

Retrieval 02

CalculateDistance(4f, 0.5f)의 결과는?

method 안의 계산을 손으로 추적합니다.

조건문은 실행할 길을 나눕니다

if는 괄호 안의 식을 먼저 평가합니다. 결과가 true일 때만 바로 뒤 중괄호 안의 코드를 실행합니다.

Condition trace · 회전 여부
private void RotateWhenEnabled()
{
    if (shouldRotate)
    {
        transform.Rotate(Vector3.forward, 90f);
    }
}
01Read

shouldRotate의 현재 값을 읽습니다.

02Evaluate

true인지 false인지 판단합니다.

03Branch

true이면 중괄호 안으로 들어갑니다.

04Continue

false이면 회전을 건너뛰고 다음 코드로 갑니다.

shouldRotate = true회전 method 실행

조건을 통과하므로 transform.Rotate(...)가 호출됩니다.

shouldRotate = false회전만 건너뜀

Script 전체가 멈추는 것이 아니라, 해당 중괄호 안의 코드만 실행하지 않습니다.

Retrieval 03

shouldRotate가 false라면 무엇이 일어날까요?

중괄호가 감싸는 범위를 기준으로 판단합니다.

class 전체를 세 층으로 읽습니다

긴 코드를 처음부터 끝까지 한 글자씩 읽으면 역할이 흐려집니다. 먼저 저장된 값, 행동 method, 판단 지점을 찾으면 전체 구조가 빠르게 보입니다.

MotionController.cs · 구조 미리보기
using UnityEngine;

public class MotionController : MonoBehaviour
{
    // 1. 기억하는 값
    [SerializeField] private float moveSpeed = 2f;
    [SerializeField] private bool shouldRotate = true;

    // 2. 실행하는 행동
    private void Move()
    {
        transform.Translate(Vector3.right * moveSpeed);
    }

    // 3. 행동을 고르는 판단
    private void RotateWhenEnabled()
    {
        if (shouldRotate)
        {
            transform.Rotate(Vector3.forward, 90f);
        }
    }
}
  1. moveSpeedshouldRotate가 각 Component instance의 현재 설정을 기억합니다.
  2. 행동Move()RotateWhenEnabled()가 해야 할 일을 이름 있는 단위로 나눕니다.
  3. 판단if가 현재 bool 값을 읽고 회전 method 내부의 실행 경로를 나눕니다.
  4. 아직 남은 질문이 method들은 누가, 언제, 얼마나 자주 호출할까요? 그 답이 2교시의 MonoBehaviour 생명주기입니다.

이 코드는 아직 완성된 움직임 코드가 아닙니다

시간 보정과 Unity의 호출 함수가 빠져 있습니다. 지금은 문법의 역할만 읽기 위한 설명용 예시입니다. 화면에서 안정적으로 움직이는 완성 구조는 2교시에서 교수자가 시연합니다.

보지 않고 네 문장으로 설명합니다

학생은 코드를 작성하지 않고, 아래 질문에 자신의 말로 답합니다. 교수자는 정확한 용어보다 개념의 관계가 맞는지 확인합니다.

Component

Script Asset과 instance는 어떻게 다른가?

Asset은 공통 설계도이고, GameObject에 붙은 instance는 자기 값을 가진 실행 Component입니다.

Field

자료형은 왜 필요한가?

field가 저장할 값의 종류와 가능한 연산을 제한해 잘못된 값을 일찍 발견하게 합니다.

Method

parameter와 return의 차이는?

parameter는 method가 받는 입력이고, return은 method가 돌려주는 결과입니다.

Condition

false라면 무엇을 건너뛰는가?

Script 전체가 아니라 해당 if의 중괄호 안에 있는 코드만 건너뜁니다.

설명의 근거가 되는 공식 문서

수업에서는 필요한 부분만 쉬운 언어로 풀어 설명합니다. 정확한 규칙을 다시 확인할 때 아래 원문을 사용합니다.

Unity Manual

Creating scripts ↗

Script를 만들고 GameObject에 Component로 연결하는 기본 구조

Unity Manual

MonoBehaviour ↗

MonoBehaviour Script가 GameObject의 Component로 동작하는 방식

질문이 남았다면

“모르겠어요”보다 “이 줄에서 float는 자료형이고 moveSpeed는 이름으로 이해했는데, private의 범위가 헷갈립니다”처럼 이미 이해한 부분과 막힌 지점을 함께 말합니다.