Week 07 / Period 01 / Lecture

게임은 상태를
기억해야 합니다

게임이 현재 상태를 기억하면 UI와 소리는 그 사실을 화면과 소리로 정확히 전달할 수 있습니다.

플레이어 말이 준비, 플레이, 성공, 실패 지점을 순환하고 중앙의 점수 계수기와 시간 다이얼이 상태를 보여 주는 입체 모형
GAME STATE가 규칙을 결정하고 UI / AUDIO가 그 결과를 플레이어에게 전달합니다.

학습 목표

1교시의 도착점

지금은 제작보다 판단 기준을 세우는 시간입니다. 3교시에서 무엇을 연결해야 하는지 상태의 언어로 설명할 수 있게 합니다.

  • 01

    게임 데이터, 게임 상태, 화면 출력을 서로 다른 층으로 설명합니다.

  • 02

    Ready, Playing, Won, Lost에서 허용되는 행동을 구분합니다.

  • 03

    HUD와 시작·결과 화면이 각각 언제 보여야 하는지 설명합니다.

  • 04

    수집과 시간 종료가 점수·UI·소리·상태 전환으로 이어지는 흐름을 말합니다.

수업 흐름

60분의 설명 흐름

6주차에 완성한 움직이는 장면에서 출발해, 플레이어가 목표와 결과를 이해할 수 있는 게임 루프로 확장합니다.

00-60 min

보이지 않는 상태를 보이는 피드백으로 바꾸기

Lecture / professor-led

  1. 6주차 결과 회수

    움직임과 카메라는 있지만 목표, 남은 시간과 끝이 없는 장면을 보여 주고 무엇이 부족한지 묻습니다.

  2. 데이터와 출력 구분

    점수 숫자와 점수 글자, 남은 시간과 타이머 글자를 각각 원인과 표시로 나눕니다.

  3. 네 가지 게임 상태

    Ready, Playing, Won, Lost의 허용 행동과 전환 조건을 하나씩 정의합니다.

  4. HUD와 화면 레이어

    계속 보여야 할 정보와 특정 상태에서만 보여야 할 화면을 구분합니다.

  5. 사건과 피드백

    수집과 시간 종료가 데이터, UI, Audio, 상태에 미치는 영향을 순서대로 읽습니다.

  6. 회수 질문

    화면을 덮고 하나의 수집 사건과 하나의 실패 사건을 상태 흐름으로 복원합니다.

이전 학습 연결

움직이는 장면과 완결된 게임은 다릅니다

조작할 수 있다는 사실만으로는 게임의 목표와 결과를 알 수 없습니다. 플레이어는 현재 상황을 해석하고 다음 행동을 결정할 정보가 필요합니다.

WEEK 06 / PLAYABLE SCENE

움직이고 따라옵니다

Player, Collision, Animation과 Camera가 반응합니다. 그러나 얼마나 모았고 언제 끝나는지는 아직 알 수 없습니다.

WEEK 07 / GAME LOOP

목표와 끝을 이해합니다

점수와 시간이 보이고, 성공과 실패가 구분되며, 버튼으로 처음 상태에서 다시 시작할 수 있습니다.

조작 가능한 장면상태와 피드백반복 가능한 게임 루프

하나의 기준

게임의 사실은 UI 글자 안에 있지 않습니다

화면은 결과를 보여 주는 출력입니다. 실제 점수와 남은 시간, 현재 상태는 코드의 데이터가 기억하고 있어야 합니다.

  1. 01 / EVENT사건 발생

    Player가 수집물에 닿거나 시간이 흐릅니다.

  2. 02 / DATA값 변경

    score가 늘고 timeRemaining이 줄어듭니다.

  3. 03 / RULE조건 판정

    목표 점수와 시간 종료 조건을 검사합니다.

  4. 04 / STATE상태 전환

    Playing에서 Won 또는 Lost로 이동합니다.

  5. 05 / FEEDBACK표현 갱신

    HUD, 결과 화면과 효과음이 상태를 알립니다.

DATAscore

현재 모은 수를 저장하는 정수입니다.

DATAtimeRemaining

현재 남은 시간을 저장하는 실수입니다.

STATEcurrentState

지금 허용할 게임 규칙을 선택합니다.

OUTPUTscoreText.text

저장된 값을 사람이 읽는 글자로 보여 줍니다.

한 곳에서만 진실을 관리하기 성공 여부를 확인하려고 화면의 “3 / 3” 문자열을 다시 읽지 않습니다. scoretargetScore를 비교하고, 그 결과를 UI에 씁니다.

상태 모델

상태는 지금 허용되는 규칙의 묶음입니다

상태 이름은 화면 제목이 아닙니다. 입력, 시간, 수집, 패널과 재시작 중 무엇이 작동해야 하는지를 한 단어로 묶은 규칙입니다.

  1. STATE 01Ready

    시작 패널이 보입니다. 타이머와 플레이는 아직 멈춰 있습니다.

  2. STATE 02Playing

    입력, 물리, 수집과 타이머가 작동합니다.

  3. STATE 03AWon

    목표 점수에 도달했습니다. 성공 화면을 보여 줍니다.

  4. STATE 03BLost

    시간이 먼저 끝났습니다. 실패 화면을 보여 줍니다.

상태타이머수집보이는 화면다음 전환
Ready정지무시Start PanelStart 버튼 → Playing
Playing감소허용HUD목표 달성 → Won
시간 종료 → Lost
Won정지무시Success PanelRestart 버튼 → Ready
Lost정지무시Failure PanelRestart 버튼 → Ready

화면 구조

계속 보는 정보와 잠깐 보는 화면을 나눕니다

모든 정보를 한 Panel에 넣으면 상태 전환 때 무엇을 숨겨야 하는지 복잡해집니다. 역할과 표시 시점을 기준으로 계층을 나눕니다.

HUD / WHILE PLAYING

플레이 중 판단을 돕는 정보

현재 점수, 목표 점수와 남은 시간을 화면 가장자리에 작고 지속적으로 보여 줍니다. 플레이 공간을 가리지 않아야 합니다.

OVERLAY / AT A MOMENT

상태가 바뀌었음을 알리는 화면

시작, 성공과 실패 Panel은 중요한 순간에만 중앙에 나타납니다. 짧은 문장과 한 개의 분명한 행동 버튼을 둡니다.

CanvasScreen Space · Overlay화면 위에 UI를 그리는 최상위 공간
HUDScore Text · Timer TextPlaying 동안 계속 보이는 정보
Start PanelTitle · Start ButtonReady에서만 보이는 시작 화면
Result PanelResult Text · Restart ButtonWon 또는 Lost에서만 보이는 결과 화면
CANVAS
Render Mode
Screen Space · Overlay
이유
카메라 설정과 분리해 화면 위에 직접 표시
Hierarchy
최상위에 두고 UI를 자식으로 구성
CANVAS SCALER
UI Scale Mode
Scale With Screen Size
Reference Resolution
수업 기준 화면 크기와 일치
확인
Game View 비율을 바꿔 글자와 버튼 위치 점검
UI의 역할 좋은 UI는 정보를 많이 보여 주는 화면이 아니라, 지금 필요한 판단을 가장 적은 방해로 가능하게 하는 화면입니다.

사건과 피드백

한 사건은 여러 피드백을 함께 일으킵니다

수집물은 스스로 점수 글자를 고치고 성공 화면을 켜지 않습니다. 사건을 알리고, 상태를 관리하는 한 곳이 데이터와 표현을 함께 조정합니다.

사건데이터판정보이는 피드백들리는 피드백
Start 클릭점수 0, 시간 30Ready → Playing시작 Panel 숨김, HUD 초기화필수 아님
수집물 접촉점수 +1목표 점수 검사점수 Text 갱신, 수집물 숨김Collect 효과음
목표 달성점수 고정Playing → Won성공 Panel 표시Win 효과음
시간 0시간 0에 고정Playing → Lost실패 Panel 표시Lose 효과음
Restart 클릭초깃값 복원Scene 다시 로드모든 오브젝트와 HUD 복원필수 아님

자주 생기는 오류

기능이 늘어날수록 책임을 한곳에 모읍니다

처음에는 어디에 코드를 써도 작동해 보이지만, 성공과 실패가 추가되면 서로 다른 Script가 같은 값을 바꾸기 시작합니다.

점수를 UI Text에서 다시 읽습니다

화면 문자열은 표현 형식이 바뀌기 쉽습니다. score 정수를 진실로 유지하고, scoreText.text에는 그 값을 사람이 읽는 모양으로 써 줍니다.

isWin, isLose, isPlaying을 따로 둡니다

여러 bool이 동시에 true가 되는 모순이 생길 수 있습니다. 한 번에 하나만 가질 수 있는 GameState enum으로 현재 상태를 표현합니다.

각 수집물이 성공 화면을 직접 켭니다

수집물은 접촉 사건만 전달합니다. 전체 목표 점수와 종료 조건을 아는 GameManager가 점수를 올리고 성공 여부를 판단합니다.

결과 화면 뒤에서도 점수가 계속 오릅니다

AddScore 시작에서 현재 상태가 Playing인지 검사합니다. Won이나 Lost라면 곧바로 return해 사건을 무시합니다.

시간이 0 아래로 계속 내려갑니다

Mathf.Max(0f, ...)로 표시값을 0에 고정하고, Playing에서만 시간을 줄입니다. 종료 전환은 한 번만 실행합니다.

UI 크기가 화면 비율마다 크게 달라집니다

Canvas Scaler와 Rect Transform Anchor를 함께 확인합니다. 화면 중앙, 모서리 등 요소의 역할에 맞는 기준 위치를 먼저 정합니다.

회수 질문

화면을 덮고 상태 흐름을 복원합니다

먼저 자신의 말로 답한 뒤 펼쳐 확인합니다. 메뉴 이름보다 원인, 상태와 출력의 순서를 설명하는 것이 중요합니다.

Q1. 점수 Text가 게임의 실제 점수가 아닌 이유는?

Text는 score를 사람이 읽도록 보여 주는 출력이기 때문입니다. 게임 규칙은 정수 데이터인 scoretargetScore를 비교해야 합니다.

Q2. Playing 상태에서만 해야 하는 일은?

입력과 물리 이동, 수집 처리, 타이머 감소와 성공·실패 판정입니다. Ready, Won과 Lost에서는 이 규칙을 멈추거나 무시합니다.

Q3. HUD와 Result Panel의 차이는?

HUD는 플레이 중 계속 참고하는 점수와 시간입니다. Result Panel은 Won 또는 Lost로 상태가 바뀐 순간 중앙에 나타나 결과와 다음 행동을 알립니다.

Q4. 수집 사건 뒤의 올바른 순서는?

Playing인지 확인하고 점수를 올립니다. HUD와 수집 효과음을 갱신한 뒤 목표 점수를 검사하고, 도달했다면 Won으로 한 번만 전환합니다.

01

게임의 실제 점수는 ______에 저장하고, UI Text는 그 값을 화면에 보여 줍니다.

02

Ready, Playing, Won, Lost처럼 한 번에 하나만 선택되는 상태 묶음은 C#의 ______으로 표현할 수 있습니다.

03

상태 → UI·Audio처럼 원인에서 표현으로 흐르면 디버깅할 때 ______을 좁히기 쉽습니다.

공식 자료

Unity 공식 자료

화면 공간 UI, 해상도 대응과 효과음의 역할은 Unity 6 공식 문서를 기준으로 정리했습니다.

  • Canvas ↗Unity UI 2.0의 Canvas와 Screen Space · Overlay 렌더 모드
  • Canvas Scaler ↗Unity UI 2.0의 Scale With Screen Size와 Reference Resolution
  • AudioSource ↗Unity 6.6에서 AudioClip을 재생하는 Component와 주요 함수
  • AudioSource.PlayOneShot ↗현재 재생을 취소하지 않고 짧은 AudioClip을 한 번 재생하는 함수