본문 바로가기
Unity 기초

르탄이 빗방울 게임 - 게임 끝내기

by 맛밤도토리 2023. 12. 28.

★ 학습 목표 ★

1. 제한 시간이 감소하는 기능 만들기

2. 제한 시간 종료 시 다시 시작하는 기능 만들기

 

 

 

1. 게임 오버 UI 만들기

: Hierarchy → MainScene 오른쪽 버튼 클릭 → GameObject → UI → Canvas 생성 (파일명 : Panel)

 

1) Image UI 와 Text UI 만들기

: Panel 오른쪽 버튼 클릭 → UI → Image 생성 (UI 색상 추가를 위해 만듬)

: Panel 오른쪽 버튼 클릭 → UI → Text 생성 (UI 텍스트 추가를 위해 만듬)

 

 

2) Panel 을 Inactive 상태로 변경하기

: Panel을 Inactive 상태로 변경하는 이유는 게임 오버 되었을 때에만 해당 UI 를 출력할 것이기 때문이다.

: Panel Inspector 에서 체크 표시를 해제하면 Inactive 상태가 된다.

 

 

 

2. 제한 시간 흐르게 만들기

: 제한 시간(초) 를 관리하기 위해 GameManager Script 에서 timeText 라는 변수를 선언 하고,

  gameManager Inspector 에 Time Text UI 를 드래그하여 추가한다.

 

[GameManager C# Script]

public Text timeText;
float limit = 60;
 
void Update( )
{
    limit -= Time.deltaTime;
    timeText.text = limit.ToString("N2");
}

[설명]
  public Text timeText;  
: timeText 를 GameManager 에서 관리하겠다는 선언을 의미한다.

  float limit = 60;  
: limit 를 60초로 설정한다.

  limit -= Time.deltaTime;  
: limit 변수에 저장된 시간을 차감시킨다는 의미이다.

  timeText.text = limit.ToString("N2");  
: 숫자(float) 로 되어 있는 limit 변수를 게임상에 출력해주기 위해 ToString 문자형으로 형변환을 시켜준다.
: ToString 에 "N2" 를 넣을 경우, 소수점 둘째 자리까지만 출력한다는 의미이다. 

 

 

 

3. 시간 멈추게 하기

: 제한 시간 60초가 모두 흘렀을 경우, 시간을 마이너스(-) 로 계속 흐르지 않고 0으로 고정되도록 코드를 진행한다.

 

[GameManager C# Script]

void Update( )
{
    if (limit < 0)
    {
        Time.timeScale = 0.0f;
        limit = 0.0f;

    }
}

[설명]
  if (limit < 0)  
: limit 의 값이 0보다 작을 경우

  Time.timeScale = 0.0f;  
: timeScale 값을 0으로 설정한다.

  limit = 0.0f;  
: limit 값을 0으로 설정한다.


※ timeScale 이란?
  : timeScale 은 시간을 빠르게 흐르게 할지, 느리게 흐르게 할지, 멈추게 할지를 결정하는 함수이다.
    (timeScale 값은 0이면 시간이 멈추게 되고 값이 높을 수록 시간이 빠르게 흘러 간다. 기본값은 1이다.)

 

 

 

4. 게임 오버 시 UI 창 띄우기

: limit (제한 시간) 이 0초로 되었을 때, Panel UI 를 출력시킨다.

: GameManager Script 에서 panel 변수를 선언하고, gameManager Inspector 에서 Panel 에 Panel Canvas 를 드래그해서 넣는다.

 

[GameManager C# Script]

public GameObject panel;

void Update( )
{
    if (limit < 0)
    {
        panel.SetActive(true);
    }
}

[설명]
  public GameObject panel;  
: panel 을 GameManager 에서 관리하겠다는 선언을 의미한다.

  panel.SetActive(true);  
: Panel Inspector 의 상태를 Inactive 에서 Active 로 변경한다.

 

 

 

5. 게임 다시 실행하는 기능 만들기

1) 게임 오버 UI 에 버튼 기능 추가하기

: Canvas UI Panel → Add Component → Button 생성

 

 

2) 게임 다시 시작 함수 코드 작성하기

: 게임을 다시 실행하기 위해서는 MainScene 을 다시 불러와서 처음부터 실행시킬 수 있다.

 

[GameManager C# Script]

public void retry( )
{
    SceneManager.LoadScene("MainScene");
}

[설명]
  SceneManager.LoadScene("MainScene");  
: MainScene 을 다시 불러와서 처음부터 시작한다는 의미이다. (새로고침)

 

※ GameManager 에서는 retry 함수를 출력할 수 없기 때문에 Panel Script 를 만들어서 그 곳에서 출력 시키도록 한다.

 

Why? 왜 retry 함수를 출력도 할 수 없는 GameManager Script 에서 관리를 할까?

  : retry 는 Scene 을 새로고침하는 기능으로 많은 부분에서 이 기능을 자주 사용한다.

    자주 사용하는 기능을 panel 이라는 개인 요소에서 관리하기에는 너무나 큰 기능이기 때문에 GameManager 에서 관리를 하는 것이다.

 

 

3) 다시 시작 기능을 출력 시키기

: Project → Script 오른쪽 버튼 클릭 → Create → C# Script 생성 (파일명 : panel)

: Hierarchy 에 있는 Panel Scene 에 panel Script 드래그 하여 넣기

 

[panel C# Script]

public void retry()
{
    GameManager.I.retry();
}

[설명]
  GameManager.I.retry();  
: GameManager 에 있는 retry 함수를 실행 시킨다.

 

 

4) 게임 오버 Button 에 기능 추가하기

: Panel Inspector 에 있는 Button Component 에 On Click () 에 (+) 키를 눌러 추가한다.

: Hierarchy 에 있는 Panel Canvas UI 를 드래그해서 추가하고 panel.retry 를 추가한다.

 

 

6. 게임 데이터 초기화 하기

: 게임을 다시 시작할 때, 빗방울 점수와 남은시간을 초기화 시켜 준다.

 

[GameManager C# Script]

void initGame()
{
    Time.timeScale = 1.0f;
    totalScore = 0;
    limit = 60f;
}

[설명]
  Time.timeScale = 1.0f;  
: 시간을 정상으로 흐르게 한다는 의미이다. (1 = 기본 배속)

  totalScore = 0;  
: Score 의 값을 0으로 설정한다.

  limit = 60f;  
: limit 의 값을 60초로 설정한다.