일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- unity 공부
- 유니티 체스
- 크래프톤 게임 정글 랩
- unity 게임
- 유니티 스토리
- ETRI 연구연수
- 크래프톤 정글랩
- Unity Chess
- unity
- 크래프톤
- 유니티
- 게임 독학
- 오픽 im1
- 유니티 대화
- 크래프톤 정글 게임랩
- 오픽 im1 5일
- unity 강의
- protobuf 란?
- unity 개발
- 게임 개발 독학
- node.js
- unity 설치
- 게임 개발
- unity 게임 개발
- 유니티 미연시
- Unity 독학
- 유니티 독학
- 유니티 퀘스트
- protobuf란
- 크래프톤 정글 게임 랩
- Today
- Total
하참이의 아이디어노트
Unity 강의 8일차 (5) - 음식 맞히기 본문
본 강의는 다음 문서를 참고하여 제작하였습니다. 자세한 내용은 하단 링크를 참조하시거나 댓글로 질문 남겨주시면 성심성의껏 답변 드리겠습니다.
과제 5 - 음식 맞히기 - Unity Learn
과제 개요: 두더지 잡기 게임처럼, 해골을 피해 가며 그리드에서 생성되는 모든 음식을 맞히는 과제를 통해 사용자 인터페이스 기술을 연습해 보세요. 버튼, 마우스 클릭, 점수 추적, 재시작 시
learn.unity.com
다음 링크의 패키지를 다운 받고 이전 프로젝트에 임포트 합니다.
챌린지에서 제공하는 씬으로 이동합니다.

게임의 개요를 살펴봅니다.
두더지 잡기 게임처럼, 해골을 피해 가며 그리드에서 생성되는 모든 음식을 맞히는 과제를 통해 사용자 인터페이스 기술을 연습해 보세요.
버튼, 마우스 클릭, 점수 추적, 재시작 시퀀스, 난이도 설정을 디버그하여 문제의 원인을 밝혀야 합니다.
과제 결과:
1. 모든 버튼이 올바르게 표시되고 텍스트가 적절하게 정렬되어 있음
2. 난이도를 선택하면 생성 속도가 그에 맞게 변경됨
3. 음식을 클릭하면 음식이 파괴되고 왼쪽 상단의 점수가 업데이트됨
4. 게임에서 패배하면 다시 플레이할 수 있는 Restart 버튼이 나타남
코루틴을 사용해서 무작위로 생성되는 해골을 피해가며 그리드에서 생성되는 음식을 맞추는 게임 같습니다. 인터페이스에 대한 문제를 해결해야 하는 것이 큰 관건인 것 같습니다.
첫 번째 문제부터 살펴봅시다.

UI를 잘 다뤄봤는지 확인하는 문제 같습니다. 보면 Easy는 우측에, Medium은 상단에, Hard는 좌측에 쏠려있는 것을 확인 할 수 있습니다.

Canvas -> Title Screen 하단에 각 버튼들이 있고, 해당 오류를 확인 할 수 있는 부분은 아무래도 버튼 하단의 Text가 가지고 있는 정렬 문제일 것 입니다.

Easy 버튼을 대표로 살펴보니 Alignment 즉 조정이 우측 하단으로 되어있는 것을 볼 수 있습니다.
다른 버튼들도 비슷 할 것 입니다. 전부 중앙으로 정렬합니다.


1번 문제는 쉽게 풀었습니다.

음식이 마우스로 건드렸을 때 파괴된다고 친절히 알려줍니다. 이 경우에는 음식이 가지고 있는 스크립트에서 OnMouseDown이 아닌 OnMouseEnter를 다루고 있을 확률이 높습니다.

확실하네요. 이를 OnMouseDown으로 변경한 뒤 게임을 실행해보면 클릭해야 파괴가 되는 것을 확인 할 수 있습니다.

점수가 표기되지 않는 것 같습니다. 아무래도 Score 업데이트의 문제인 것 같네요. GameManager 스크립트를 확인 할 수 있겠습니다.
UpdateScore() 함수를 살펴봅시다.

저런 score로만 업데이트가 되고 변수가 작성되지 않네요. + score를 사용해서 점수가 출력되는 문자열로 변경합시다.

게임을 실행해보면 점수가 잘 표기되는 것을 확인할 수 있습니다.


Restart 버튼이 생성되지 않는다고 합니다. GameManager에서 GameOver 함수를 찾아봅시다.

GameOver가 되었을 때 restart 버튼의 SetActivce가 false로 되어있으니 restart버튼이 안나오는 것을 알 수 있습니다.
true로 변경해줍시다.


버튼이 잘 생성되는 것을 확인 할 수 있습니다. 누르면 다시 시작도 가능합니다.

흠 이 경우에는 버튼 별로 할당되어있던 difficulty 변수를 확인해 볼 필요가 있겠습니다.

이런. difficulty를 생성해놓고 쓰지도 않고있군요.
difficulty를 인자로 StartGame 함수를 수행하도록 합시다.


하지만 정작 GameManager의 StartGame은 인자를 받지 않고 spawnRate는 상수인 5로 나누어지는 것을 확인 할 수 있습니다.
함수를 수정해줍시다.

Easy로 실행해서 느려지는지 확인해봅시다.

하품이 날 정도로 잘 느려진 것을 확인 할 수 있습니다.

Count를 생성하라고 합니다. 까짓거 한 번 해보죠
Score UI를 복사 한 뒤 Score 아래에 붙인 뒤, Time으로 변경합니다.

GameManager 스크립트를 다음과 같이 수정합니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class GameManagerX : MonoBehaviour
{
public TextMeshProUGUI scoreText;
public TextMeshProUGUI timeText;
public TextMeshProUGUI gameOverText;
public GameObject titleScreen;
public Button restartButton;
public List<GameObject> targetPrefabs;
private int score;
public int time;
private float spawnRate = 1.5f;
public bool isGameActive;
private float spaceBetweenSquares = 2.5f;
private float minValueX = -3.75f; // x value of the center of the left-most square
private float minValueY = -3.75f; // y value of the center of the bottom-most square
// Start the game, remove title screen, reset score, and adjust spawnRate based on difficulty button clicked
public void StartGame(int difficulty)
{
spawnRate /= difficulty;
isGameActive = true;
score = 0;
time = 60;
StartCoroutine(SpawnTarget());
StartCoroutine(TimeDecrease());
UpdateScore(0);
UpdateTime(0);
titleScreen.SetActive(false);
}
// While game is active spawn a random target
IEnumerator SpawnTarget()
{
while (isGameActive)
{
yield return new WaitForSeconds(spawnRate);
int index = Random.Range(0, targetPrefabs.Count);
if (isGameActive)
{
Instantiate(targetPrefabs[index], RandomSpawnPosition(), targetPrefabs[index].transform.rotation);
}
}
}
IEnumerator TimeDecrease()
{
while (time > 0)
{
yield return new WaitForSeconds(1);
UpdateTime(1);
}
GameOver();
}
// Generate a random spawn position based on a random index from 0 to 3
Vector3 RandomSpawnPosition()
{
float spawnPosX = minValueX + (RandomSquareIndex() * spaceBetweenSquares);
float spawnPosY = minValueY + (RandomSquareIndex() * spaceBetweenSquares);
Vector3 spawnPosition = new Vector3(spawnPosX, spawnPosY, 0);
return spawnPosition;
}
// Generates random square index from 0 to 3, which determines which square the target will appear in
int RandomSquareIndex()
{
return Random.Range(0, 4);
}
// Update score with value from target clicked
public void UpdateScore(int scoreToAdd)
{
score += scoreToAdd;
scoreText.text = "score" + score;
}
public void UpdateTime(int timeToSub)
{
time -= timeToSub;
timeText.text = "time" + time;
}
// Stop game, bring up game over text and restart button
public void GameOver()
{
gameOverText.gameObject.SetActive(true);
restartButton.gameObject.SetActive(true);
isGameActive = false;
}
// Restart game by reloading the scene
public void RestartGame()
{
SceneManager.LoadScene(SceneManager.GetActiveScene().name);
}
}
time text를 GameManager 컴포넌트에 잘 연결하고 게임을 클리어 해봅시다. 버그를 확인하기 위해 본인이 만든 게임을 클리어 하는 것 역시 게임 개발자로써 가져야 할 태도 입니다.
시간이 0이 되고 잘 GameOver가 되는 것을 확인 할 수 있습니다.

'Unity > Unity 기초' 카테고리의 다른 글
Unity 강의 8일차 (4) - 난이도 설정 (0) | 2025.01.31 |
---|---|
Unity 강의 8일차 (3) - 게임 오버와 재시작 (0) | 2025.01.31 |
Unity 강의 8일차 (2) - 점수 기록 (0) | 2025.01.31 |
Unity 강의 8일차 (1) - UI 마우스 클릭 (0) | 2025.01.31 |
Unity 강의 7일차 (3) - 파워업 및 카운트다운 (0) | 2025.01.22 |