테트리스 게임 시스템 설계 개요
📖 이 문서는?
테트리스 게임의 전체적인 시스템 설계를 한눈에 볼 수 있는 문서입니다.
프로젝트를 시작하기 전에 전체 구조를 이해하는 데 도움이 됩니다.
📐 예시 구조 가이드 활용
단계별 학습 2~8단계 각 문서에는 “이번 단계 후 예시 구조” 박스가 있어, 여기 나오는 Hierarchy·클래스 구조와 연결됩니다. 실습할 때 예시 구조를 보면서 “지금 만드는 게 어디에 해당하는지” 확인하면 됩니다.
🎯 시스템 아키텍처
전체 시스템 구조
┌─────────────────────────────────────────────────────────┐
│ Unity 씬 (Scene) │
├─────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ GameController│ │ InputHandler │ │
│ │ (게임 제어) │ │ (입력 처리) │ │
│ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │
│ │ 참조 │ 제어 │
│ ↓ ↓ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ GameBoard │ │ TetrisBlock │ │
│ │ (보드 관리) │◄─────┤ (블록 제어) │ │
│ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │
│ │ 사용 │ 생성 │
│ ↓ ↓ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ Spawner │ │ UI │ │
│ │ (블록 생성) │ │ (화면 표시) │ │
│ └──────────────┘ └──────────────┘ │
│ │
└─────────────────────────────────────────────────────────┘
🏗️ 클래스 역할 분담
1. GameController (게임 제어자)
역할: 게임의 전체적인 흐름 제어
책임:
- 점수 관리
- 레벨 관리
- 줄 수 관리
- UI 업데이트
- 게임 오버 처리
주요 함수:
AddScore(): 점수 추가GetLevel(): 현재 레벨 반환UpdateUI(): UI 업데이트GameOver(): 게임 오버 처리
2. GameBoard (게임 보드)
역할: 게임 보드 관리
책임:
- 10x20 그리드 관리
- 셀 상태 관리 (비어있음/채워짐)
- 행 제거 처리
- 충돌 감지
- 게임 오버 감지
주요 함수:
IsValidPosition(): 위치 유효성 확인IsCellEmpty(): 셀 비어있는지 확인AddToGrid(): 셀에 블록 배치CheckForLines(): 가득 찬 행 제거IsGameOver(): 게임 오버 확인
3. TetrisBlock (테트리스 블록)
역할: 블록 제어
책임:
- 블록 이동 (좌우, 아래)
- 블록 회전
- 자동 낙하
- 블록 고정
주요 함수:
MoveLeft(),MoveRight(),MoveDown(): 이동Rotate(): 회전HardDrop(): 하드 드롭ValidMove(): 이동 가능 여부 확인LockPiece(): 블록 고정
4. Spawner (생성기)
역할: 블록 생성
책임:
- 다음 블록 생성
- 게임 오버 확인
- 생성 위치 관리
주요 함수:
NewTetris(): 다음 블록 생성
5. InputHandler (입력 처리기)
역할: 사용자 입력 처리
책임:
- 키보드 입력 감지
- 현재 블록 찾기
- 블록 제어 함수 호출
주요 함수:
Update(): 매 프레임 입력 확인
🔄 데이터 흐름
점수 시스템 데이터 흐름
블록 고정
↓
행 제거 (GameBoard.CheckForLines())
↓
제거한 행 개수 반환
↓
GameController.AddScore(clearedRows)
↓
점수 계산
├─ score += points[linesCleared] * level
├─ lines += linesCleared
└─ level = (lines / 10) + 1
↓
UI 업데이트
├─ scoreText.text = "Score: " + score
├─ linesText.text = "Lines: " + lines
└─ levelText.text = "Level: " + level
블록 이동 데이터 흐름
키 입력
↓
InputHandler.Update()
↓
TetrisBlock.MoveLeft() 호출
↓
ValidMove() 확인
├─ GameBoard.IsValidPosition()
└─ GameBoard.IsCellEmpty()
↓
이동 가능 여부 반환
↓
이동 또는 정지
├─ position 업데이트
└─ UpdateVisualPosition()
📊 상태 관리
게임 상태
게임 상태 변수:
- score (점수)
- lines (제거한 줄 수)
- level (레벨)
- isGameOver (게임 오버 여부)
블록 상태
블록 상태 변수:
- position (위치)
- cells (셀 위치들)
- shapeIndex (모양 번호)
- fallTime (낙하 시간)
보드 상태
보드 상태:
- grid[width, height] (그리드 배열)
- 각 셀: null 또는 Transform (블록)
🎮 이벤트 시퀀스
블록 고정 이벤트 시퀀스
1. TetrisBlock.MoveDown()
- 더 이상 내려갈 수 없음
↓
2. LockPiece() 호출
↓
3. 블록을 GameBoard에 저장
- gameBoard.AddToGrid() 호출
↓
4. 행 제거 확인
- gameBoard.CheckForLines() 호출
- 제거한 행 개수 반환
↓
5. 점수 추가
- gameController.AddScore() 호출
↓
6. 다음 블록 생성
- spawner.NewTetris() 호출
↓
7. 현재 블록 삭제
- Destroy(gameObject)
🔗 클래스 의존성
의존성 그래프
GameController
├─ GameBoard (참조)
└─ UI Text (연결)
GameBoard
└─ (독립적)
TetrisBlock
├─ GameBoard (참조)
├─ GameController (참조)
└─ Spawner (참조)
Spawner
├─ GameBoard (참조)
└─ GameController (참조)
InputHandler
└─ TetrisBlock (참조)
설명:
- 화살표 방향: 의존하는 방향
- 예: TetrisBlock는 GameBoard를 사용하므로 GameBoard에 의존
📐 UI 구조
UI 계층 구조
Canvas
├─ EventSystem (자동 생성)
├─ ScoreText
├─ LinesText
└─ LevelText
위치:
- ScoreText: 오른쪽 상단 (X: 400, Y: 200)
- LinesText: ScoreText 아래 (X: 400, Y: 150)
- LevelText: LinesText 아래 (X: 400, Y: 100)
연결:
- GameController의 public 변수에 연결
- Inspector에서 드래그 앤 드롭
⚙️ 초기화 순서
게임 시작 시 실행 순서
1. Unity 씬 로드
↓
2. Awake() 함수들 실행 (동시에)
- GameBoard.Awake(): 그리드 초기화
- GameController.Awake(): 변수 초기화
↓
3. Start() 함수들 실행 (동시에)
- GameController.Start(): UI 초기화
- Spawner.Start(): 첫 블록 생성
- TetrisBlock.Start(): 블록 초기화
- InputHandler.Start(): (없음)
↓
4. Update() 함수들 실행 (매 프레임)
- InputHandler.Update(): 입력 확인
- TetrisBlock.Update(): 자동 낙하
🎯 핵심 설계 원칙
1. 단일 책임 원칙
각 클래스는 하나의 명확한 역할만 담당:
- GameController: 게임 제어
- GameBoard: 보드 관리
- TetrisBlock: 블록 제어
- Spawner: 블록 생성
- InputHandler: 입력 처리
2. 느슨한 결합
클래스들이 서로 독립적으로 작동:
- FindObjectOfType으로 필요할 때 찾기
- 직접적인 참조 최소화
3. 명확한 인터페이스
각 클래스의 public 함수가 명확:
AddScore(): 점수 추가CheckForLines(): 행 제거NewTetris(): 블록 생성
📚 관련 문서
- UI배치구조설계.md: UI 배치 상세 가이드
- 프로그램처리흐름설계.md: 처리 흐름 상세 설명
- 개념설명.md: 프로그래밍 개념 설명
- 각 클래스 파일의 주석: 코드 레벨 설명
🎓 학습 가이드
초보자를 위한 학습 순서
권장 학습 경로:
1단계: 전체 구조 이해
└─ 시스템설계개요.md 읽기
- 클래스 역할 이해
- 시스템 구조 파악
↓
2단계: 처리 흐름 이해
└─ 프로그램처리흐름설계.md 읽기
- 게임 루프 이해
- 데이터 흐름 이해
↓
3단계: UI 구조 이해
└─ UI배치구조설계.md 읽기
- UI 배치 방법 이해
- 레이아웃 설계 이해
↓
4단계: 개념 학습
└─ 개념설명.md 읽기
- 프로그래밍 개념 이해
- Unity 개념 이해
↓
5단계: 실습
└─ 단계별학습가이드.md 따라하기
- 실제로 코드 작성
- 게임 만들기
↓
6단계: 코드 이해
└─ 각 클래스 코드 읽기
- 주석 읽기
- 구현 방법 이해
강의 진행 시:
- 각 주차 시작 전에 관련 설계 문서 읽기
- 실습 중 문제 발생 시 설계 문서 참고
- 완성 후 전체 흐름 다시 확인
이 문서를 먼저 읽고 프로젝트를 시작하세요! 🎮