좌표 처리 간단 가이드 (초보자용)
📍 왜 좌표 처리가 필요한가요?
테트리스 게임에서 블록의 위치를 정확히 맞춰야 합니다.
하지만 복잡하게 생각할 필요 없습니다!
🎯 핵심 원리 (간단하게!)
1. 게임 보드는 격자입니다
게임 보드 (10칸 x 20칸):
0 1 2 3 4 5 6 7 8 9 ← x축 (가로)
0 [ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
1 [ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
2 [ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
...
19[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
↑
y축 (세로)
간단하게 생각:
- 각 칸은 정수 좌표로 표현됩니다: (0, 0), (1, 0), (2, 0)…
- x는 0~9 (10칸)
- y는 0~19 (20칸)
2. 블록 위치를 정수로 만들기
문제: 블록 위치가 (5.2, 10.8)처럼 소수점일 수 있습니다
해결: 반올림해서 정수로 만들기
// 위치가 (5.2, 10.8)일 때
int x = Mathf.RoundToInt(5.2); // → 5
int y = Mathf.RoundToInt(10.8); // → 11
// 이제 (5, 11) 위치로 사용
Mathf.RoundToInt() 설명:
- 소수점을 반올림하여 정수로 만듭니다
- 예: 5.2 → 5, 5.7 → 6, 10.8 → 11
3. 실제 사용 예시
ValidMove 함수에서:
// 자식 블록의 위치를 정수로 반올림
int roundX = Mathf.RoundToInt(children.transform.position.x);
int roundY = Mathf.RoundToInt(children.transform.position.y);
// 보드 범위 확인
if (roundX < 0 || roundX >= 10 || roundY < 0 || roundY >= 20)
{
return false; // 범위 밖!
}
AddToGrid 함수에서:
// 자식 블록의 위치를 정수로 반올림
int roundX = Mathf.RoundToInt(children.transform.position.x);
int roundY = Mathf.RoundToInt(children.transform.position.y);
// 그리드에 저장
grid[roundX, roundY] = children;
💡 왜 이렇게 간단한가요?
웹사이트 방식의 장점:
- ✅ 복잡한 좌표 변환 함수 없음
- ✅ 직접 숫자로 위치 지정
- ✅ 초보자도 쉽게 이해
- ✅ Unity의 기본 기능만 사용
복잡한 방식 (사용 안 함):
- ❌ GridToWorld() 같은 변환 함수
- ❌ boardOrigin 같은 기준점
- ❌ 복잡한 계산
간단한 방식 (웹사이트 방식):
- ✅ Mathf.RoundToInt()로 반올림
- ✅ 직접 숫자 사용: (5, 17)
- ✅ 그냥 위치를 정수로 만들기
🎮 실제 예시
Spawner 위치 설정
방법 1: Inspector에서 직접 설정
- Spawner GameObject 선택
- Inspector에서 Position: (5, 17, 0) 입력
- 끝!
방법 2: 코드에서 설정
transform.position = new Vector3(5, 17, 0);
왜 (5, 17)인가요?
- 5 = 보드 가로 중앙 (10칸의 중간)
- 17 = 보드 상단 근처 (블록 생성 위치)
- 그냥 숫자로 위치를 지정하면 됩니다!
블록 위치 확인
ValidMove 함수:
// 블록 위치를 정수로 반올림
int x = Mathf.RoundToInt(블록위치.x);
int y = Mathf.RoundToInt(블록위치.y);
// 보드 범위 확인
if (x < 0 || x >= 10 || y < 0 || y >= 20)
{
return false; // 범위 밖!
}
간단하게 생각:
- 위치를 정수로 만들기
- 범위 확인 (0~9, 0~19)
- 끝!
🔧 셀 정렬 (중요!)
블록을 만들 때 셀 위치를 정수로 맞춰야 합니다!
BlockSnapper 사용법
- BlockSnapper 컴포넌트 추가
- 블록 선택 (I_Block, O_Block, T_Block 등)
- Inspector에서 Add Component → BlockSnapper 추가
- 셀 정렬 실행
- Inspector에서 우클릭 → “Snap to Grid” 클릭
- 모든 자식 Square가 정수 좌표로 정렬됨
- 정렬 확인
- Inspector에서 우클릭 → “Validate Block” 클릭
- “✅ 블록이 올바르게 배치되었습니다!” 확인
왜 중요한가요?
- 소수점 좌표가 있으면 블록이 정확히 배치되지 않음
- 게임보드 그리드와 맞지 않아 충돌 감지가 어긋남
- 반드시 정수 좌표로 맞춰야 합니다!
✅ 체크리스트
좌표 처리가 올바른지 확인:
- 부모 오브젝트 위치가 (0, 0, 0)인가?
- 모든 Square의 Local Position이 정수인가? (소수점 없이!)
- BlockSnapper로 “Snap to Grid” 실행했는가?
- “Validate Block”으로 확인했는가?
- ValidMove에서 Mathf.RoundToInt 사용
- AddToGrid에서 Mathf.RoundToInt 사용
- Spawner 위치가 (5, 17, 0)으로 설정
- 보드 범위 확인: x는 0~9, y는 0~19
🎯 핵심 정리
- 게임 보드는 격자: (0, 0)부터 (10, 20)까지
- 위치를 정수로: Mathf.RoundToInt() 사용
- 직접 숫자 사용: (5, 17)처럼 그냥 숫자로
- 복잡하게 생각하지 마세요!
웹사이트 방식 = 간단하게! 🎮