2단계: 게임 보드 만들기
🎯 이 단계에서 배울 것
게임 보드(10×20)를 코드로 만들고, Awake로 준비·함수로 위치 검사 (약 20~30분)
🔷 구분하기: 내가 만드는 것 vs 엔진(API)이 주는 것
| 구분 | 이번 단계 예시 | 설명 |
|---|---|---|
| 내가 만드는 것 | GameBoard 클래스, width/height/grid, IsValidPosition() | 우리가 정의하는 “게임 보드 규칙”. 보드 크기, 그리드 저장, “이 위치가 유효한가”는 우리 로직. |
| 엔진(API)이 주는 것 | MonoBehaviour, Awake(), Transform, Vector2Int, Debug.Log | Unity가 제공하는 타입·함수. Awake()는 엔진이 “가장 먼저 한 번” 불러 주는 자리이고, Transform·Vector2Int는 엔진의 “위치·좌표” 타입. |
왜 엔진 것을 쓰나?
Awake()는 엔진이 “준비 단계”로 한 번만 호출해 주는 곳입니다. 여기에 우리 보드 초기화 코드를 넣습니다. Transform은 엔진이 “오브젝트 위치”를 다루는 타입이므로, 우리는 그걸 저장해 두는 변수(grid) 와 우리 규칙(IsValidPosition) 만 만듭니다.
📝 실습
📐 이번 단계 후 예시 구조 (가이드)
아래처럼 만들면 됩니다. Hierarchy에서 트리로 보이는 모습입니다. 실습 후 이 예시로 Hierarchy(위치)를 체크해 보세요.
씬 (Tetris)
├─ Main Camera
└─ GameBoard ← 빈 오브젝트 + Game Board (Script)
자세한 전체 구조 → 시스템 설계 개요
📌 위치 표기: 설명에서 어디를 눌러야 하는지는 [Hierarchy] (읽는 법: 하이어러키), [Inspector] (읽는 법: 인스펙터), [Project] (읽는 법: 프로젝트) 처럼 트리로 적습니다. → 1단계 - 위치 표기 규칙 · 발음: 영어 용어 발음·표기
📌 작업 씬 제차 확인 (매 단계 필수)
이번 단계 실습을 시작하기 전에 다시 한 번 확인하세요.
- 상단 씬 탭에서 지금 열린 씬 이름이 Tetris (게임용)인지 봅니다.
- Tetris가 아니면 (SimpleScene, SampleScene, Untitled 등) 반드시 Tetris로 이름을 변경한 뒤 진행하세요. → 1단계 씬 이름 변경 방법
- Tetris 씬을 아직 안 만들었다면 1단계의 “작업 씬 이름 확인 및 저장”을 먼저 진행하세요.
1. GameBoard 스크립트
Scripts 폴더 → 우클릭 → Create > C# Script → 이름 GameBoard
GameBoard.cs 더블클릭 → 아래 코드로 전체 교체:
📌 이 단계에서는 나중에 삭제하거나 바꿀 코드를 미리 넣지 않습니다. 지금 필요한 것만 넣고, 6단계 등에서 추가할 때 그때 가서 넣습니다.
📌 코드 주석 — [우리 멤버], [Unity가 호출], [Unity API] 등은 내가 만든 것 / 상속·Unity 것 구분용입니다. 자세한 표기 → 4단계 - 소스코드 구분 표기.
using UnityEngine;
public class GameBoard : MonoBehaviour // [MonoBehaviour 상속] Unity 부모 클래스
{
public int width = 10; // [우리 멤버] 가로 10칸
public int height = 20; // [우리 멤버] 세로 20칸
private Transform[,] grid; // [우리 멤버] 2차원 배열
void Awake() // [Unity가 호출] 씬 로드 시 엔진이 한 번 호출
{
grid = new Transform[width, height];
Debug.Log($"게임 보드 생성: {width}x{height}"); // Debug.Log: [Unity API]
}
public bool IsValidPosition(Vector2Int position) // [우리 메소드]
{
return position.x >= 0 && position.x < width &&
position.y >= 0 && position.y < height;
}
}
📌 복기: width, height, grid 는 변수(저장소). grid 는 배열(같은 타입을 순서대로). 한 번에 이해 못했어도 변수 · 배열에서 다시 실습해 보세요.
2. GameBoard 스크립트 파일 생성
2-1. Scripts 폴더에서 스크립트 생성
-
[Project > Assets > Scripts] 로 이동 (Project 창에서 Assets → Scripts 폴더 클릭)
- C# 스크립트 생성
- [Project > Assets > Scripts] 선택 상태에서 우클릭 → “Create” → “C# Script”
- 이름 변경
- 생성된 “NewBehaviourScript”를 F2 또는 더블클릭으로 “GameBoard” 로 변경
- 결과: [Project > Assets > Scripts > GameBoard.cs]
2-2. 스크립트 코드 작성
- GameBoard.cs 파일 열기
- [Project > Assets > Scripts > GameBoard.cs] 더블클릭
- 에디터가 열림
- 코드 작성
- 에디터에 기본 코드가 있음
- 위의 코드로 전체 교체
- 저장
- Ctrl + S (Windows) 또는 Cmd + S (Mac)로 저장
- 또는 메뉴: File > Save
3. GameBoard 오브젝트 생성
3-1. 빈 GameObject 생성
-
[Hierarchy] 창 확인 (화면 왼쪽, 씬 오브젝트 트리)
- 빈 GameObject 생성
- [Hierarchy] 빈 공간 우클릭 → “Create Empty”
- 또는 [메뉴 > GameObject > Create Empty]
- 이름 변경
- 생성된 “GameObject”를 F2 또는 [Inspector] 맨 위 이름 칸에서 “GameBoard” 로 변경
- 결과: [Hierarchy > GameBoard]
3-2. GameBoard 스크립트 추가
- 스크립트 드래그 앤 드롭
- [Project > Assets > Scripts > GameBoard.cs] 를 클릭하고 잡은 상태로
- [Hierarchy > GameBoard] 위로 드래그하여 놓기
- 스크립트가 추가됨
- 스크립트 추가 확인
- [Hierarchy > GameBoard] 클릭
- [Inspector > Game Board (Script)] 가 보이면 성공!
또는 Add Component 방법:
- [Hierarchy > GameBoard] 선택 → [Inspector > Add Component] 클릭 → 검색 “GameBoard” → “Game Board” 추가
3-3. Transform 위치 설정 — 논리 좌표와 맞추기
-
[Hierarchy > GameBoard] 클릭
- [Inspector > GameBoard > Transform] 에서 Position 확인
- X: 0, Y: 0, Z: 0 으로 두세요.
- 이렇게 해야 논리 그리드 (0,0)~(9,19) 와 씬(월드) 좌표가 일치합니다. (블록·보드 배경이 나중에 같은 좌표계를 쓰게 됩니다.)
- 값이 다르다면
- Position 필드에 0, 0, 0 을 입력해 (0, 0, 0)으로 맞춥니다.
- GameBoard를 다른 위치에 두고 싶다면 7단계 보드 논리좌표와 시각 일치에서 좌표 헬퍼를 쓰면 됩니다.
💡 요약: GameBoard Position (0, 0, 0) = 논리 좌표와 씬 좌표를 같게 둔 상태. 이걸로 두면 6단계에서 보드 시각화(배경)를 붙일 때도 좌표가 정확히 맞습니다.
3-4. 게임 실행 및 확인
- Play 버튼 클릭
- Unity 에디터 상단의 ▶ (Play) 버튼 클릭
- Console 창 확인
- Console 창에서 “게임 보드 생성: 10x20” 메시지 확인
- 메시지가 보이면 GameBoard가 정상적으로 작동하는 것!
- 게임 정지
- ▶ (Play) 버튼을 다시 클릭하여 정지
참고:
- GameBoard의 Unity 월드 좌표는 씬에서 자유롭게 설정할 수 있습니다
- 게임 보드의 논리적 좌표계는 항상 (0, 0)부터 시작합니다 (Unity 월드 좌표와는 별개)
- 실제 코드에서는
grid[position.x, position.y]로 논리적 좌표를 사용합니다
💡 이번 단계에서 익히는 개념
- 함수 = 할 일을 묶어 둔 것 (예:
IsValidPosition()은 “위치가 유효한지 확인”이라는 일을 묶은 함수) - Awake() = 게임이 켜질 때 가장 먼저 한 번 실행 (예: GameBoard의 grid 배열을 만드는 것처럼 “준비”할 때 사용)
📌 복기: 변수(width, height, grid) = 저장소, 배열(grid) = 같은 타입을 순서대로. 한 번에 이해 못했어도 변수 · 배열에서 다시 실습해 보세요.
📖 기초 개념 학습 (복기 → 점진적 실습)
📌 복기로 위 개념을 떠올린 뒤, 아래 기초 개념 문서에서 점진적으로 확장된 실습을 진행하세요. 단계가 올라갈수록 같은 개념이 조금씩 확장되므로, 차근차근 따라 하면 됩니다.
| 개념 문서 | 이번 단계와의 연결 |
|---|---|
| 함수 | 할 일을 묶은 함수. 문서 안 실습으로 함수 정의·호출해 보기 |
| 배열 | 2차원 배열 grid. 1차원·2차원 배열 실습으로 익히기 |
| MonoBehaviour | Awake()가 Start()보다 먼저 한 번 실행. 실행 순서 실습 |
| 클래스 | GameBoard 클래스 = 변수(width, height, grid) + 함수(IsValidPosition). Player 클래스 실습 |
📐 이 단계 확장 실습 (전용 씬에서 점진적 연습): 2단계 확장 실습 01 - Awake와 배열·범위 검사
→ 단계별 확장 실습 전체 목차: 단계별 확장 실습 (목차)
✅ 확인 사항
- GameBoard 클래스가 정상적으로 작동하는가?
- Console에 보드 생성 메시지가 출력되는가?
- IsValidPosition 함수가 올바르게 작동하는가?
📖 기초 개념 학습으로 이어가기
위 표의 기초 개념 학습을 진행한 뒤, 좌표 처리 방식이 궁금하면 좌표 처리 가이드에서 점진적으로 이어가세요.
✅ 다음 단계 전 점검: 작업 씬이 Tetris인지 재차 확인하세요. Tetris가 아니면 씬 이름 변경 방법을 따라 Tetris로 바꾼 뒤 다음 단계로 넘어가세요.
| ← 이전 단계: 1단계 - Unity 기초 | 다음 단계: 3단계 - 테트리스 블록 만들기 → |