▶▷ TheStack
블럭을 이전 블럭과 최대한 동일한 위치에 하나씩 쌓아 올라가면서 기록을 내는 게임으로 3D 프로젝트 환경에서 제작하였다.
아래는 이 프로젝트의 기능들을 작성한 코드이다.
using UnityEngine;
public class TheStack : MonoBehaviour
{
private const float BoundSize = 3.5f; // 전체 블럭 최대 크기
private const float MovingBoundsSize = 3f; // 이동 블럭 이동 범위
private const float StackMovingSpeed = 5.0f;
private const float BlockMovingSpeed = 3.5f;
private const float ErrorMargin = 0.1f;
public GameObject originBlock = null;
private Vector3 prevBlockPosition; // 바로 아래 블럭 위치
private Vector3 desiredPosition; // 스택 이동 목표 위치
private Vector3 stackBounds = new Vector2(BoundSize, BoundSize); // 현재 블럭 크기 범위
Transform lastBlock = null; // 마지막 생성 블럭 Transform
float blockTransition = 0f; // 블럭 이동 애니메이션 시간 변수
float secondaryPosition = 0f; // 두 번째 축 고정 위치 값
int stackCount = -1; // 쌓인 블럭 수 (-1부터 시작, Spawn_Block 시 증가)
public int Score { get { return stackCount; } }
int comboCount = 0;
public int Combo { get { return comboCount; } }
int maxCombo;
public int MaxCombo { get => maxCombo; }
public Color prevColor;
public Color nextColor;
bool isMovingX = true; // 이동 방향: true = X축, false = Z축
int bestScore = 0;
public int BestScore { get => bestScore; }
int bestCombo = 0;
public int BestCombo { get => bestCombo; }
// PlayerPrefs 저장 키
private const string BestScoreKey = "BestScore";
private const string BestComboKey = "BestCombo";
private bool isGameOver = false;
// Start: 초기 설정 및 최초 블럭 2개 생성
void Start()
{
// originBlock 확인, 최고 점수/콤보 불러옴, 색상 설정, 초기 블럭 2개 생성
}
// Update: 입력 처리 및 블럭, 스택 이동 처리
void Update()
{
// 게임 오버 아니면: 마우스 입력 감지, 블럭 고정 및 새 블럭 생성 또는 게임 오버 처리
// 현재 블럭 이동 및 스택 전체 Lerp 이동 처리
}
// Spawn_Block: 새 블럭 생성 및 초기화
bool Spawn_Block()
{
// 이전 블럭 위치 기준 새 블럭 생성, 색상 변경, 스택 카운트/이동 방향/목표 위치 업데이트
return true;
}
// GetRandomColor: 100~250 범위 랜덤 색상 생성
Color GetRandomColor()
{
// 랜덤 색상 생성 후 반환
return Color.white;
}
// ColorChange: 블럭 및 카메라 배경 색상 변경
void ColorChange(GameObject go)
{
// 이전, 다음 색상 보간 후 적용, 필요 시 색상 업데이트
}
// MoveBlock: 현재 블럭 왕복 이동 처리
void MoveBlock()
{
// PingPong 수로 블럭 X 또는 Z축 왕복 이동 처리
}
// PlaceBlock: 블럭 위치 고정, 잘림 및 콤보 처리
bool PlaceBlock()
{
// 이전 블럭과 위치 비교 후 오차에 따라 블럭 잘림 또는 콤보 처리
// 남은 블럭 크기 0 이하면 false 반환
return true;
}
// CreateRubble: 잔해 생성 및 물리 효과 적용
void CreateRubble(Vector3 pos, Vector3 scale)
{
// 현재 블럭 복제해 잔해 오브젝트 생성, Rigidbody 추가
}
// ComboCheck: 콤보 증가 및 5콤보마다 블럭 크기 증가
void ComboCheck()
{
// 콤보 수 증가, 5콤보마다 블럭 크기 증가 (최대 BoundSize 까지)
}
// UpdateScore: 최고 점수/콤보 업데이트 및 저장
void UpdateScore()
{
// 현재 스택 수가 최고 점수보다 높으면 업데이트 후 PlayerPrefs에 저장
}
// GameOverEffect: 게임 오버 시 상위 블럭 물리 효과 적용
void GameOverEffect()
{
// 최근 20개 블럭에 Rigidbody 추가해 물리 효과(떨어짐) 적용
}
// Restart: 게임 초기화, 블럭 제거 및 상태 복원
public void Restart()
{
// 모든 자식 블럭 제거, 변수 초기화, 초기 색상 및 블럭 2개 생성
}
}
강의를 들으면서 제작한 것이기 때문에 공할 수는 없어 세부 내용을 주석으로 정리해보았다.
전체적으로 정리해보자면 게임을 시작하면 x축과 z축에서 번갈아가면서 블럭이 다가오고 해당 블럭을 마우스 클릭을 통해 아래의 블럭과 위치를 비교해 겹치지 않는 부분은 파편으로 만들어 떨어지게 했고 겹치는 부분이 0이 아니라면 점수가 오르도록 했다. 정확히 위치를 맞추어 블럭을 쌓으면 콤보가 쌓이게 되고 콤보를 쌓을 수록 잘려나갔던 블럭의 크기가 점차 다시 커지게 되는 기능이 있고 점수와 콤보를 저장하여 결과 창에서 확인할 수 있다.
▶▷ 트러블 슈팅
막혔던 부분:
1. 처음 시작할 때 맨 처음에 블럭이 깔린 채로 시작해야 하는데 블럭이 없는 채로 시작됨
해결:
1. Start()에서 블럭을 생성하는 Spawn_Block()을 두번을 호출해야 하는데 한번만 호출하도록 작성해서 해당 부분 수정
void Start()
{
// 생략...
Spawn_Block(); // 첫 번째 블록 생성
Spawn_Block(); // 두 번째 블록 생성
}
마주쳤던 대부분의 문제점이 오타로 인해 발생하는 사소한 부분들이어서 그러한 부분들은 생략하려고 한다. 3D로 제작하면서 z축도 추가되고 수학적인 부분도 많이 추가돼서 강의를 보면서 해도 2D로 할 때랑은 확실히 달랐고 어려운 느낌이 있었다. 강의를 들으면서 정신없이 하다 보니 커밋을 신경쓰지 못하는 중인데 일단은 나름 깃허브에 대해서는 익숙해진 것 같기도 하고 강의가 끝난 후 개인 과제까지 하는데 시간이 조금 모자를 것 같으므로 일단 빠르게 훑고 강의 뒤에 있을 프로젝트에서 다시 신경을 써볼 예정이다.
'게임 개발 공부 기록' 카테고리의 다른 글
20일차 - SimpleMetaverse 2 (0) | 2025.02.19 |
---|---|
19일차 - TopDown, SimpleMetaverse (0) | 2025.02.18 |
17일차 - FlappyPlane (0) | 2025.02.14 |
16일차 - TRPG 팀 프로젝트 마무리 + 프로그래머스 기초 트레이닝 (0) | 2025.02.13 |
15일차 - TRPG 팀 프로젝트 5 (0) | 2025.02.12 |