유니티로 Pong 게임 만들기

7) 유니티로 Pong 게임 만들기 - 게임 종료 처리, 타이머 추가, 게임종료ui 추가

잡동사니123 2024. 1. 24. 14:13

목표

  • 이제 게임 끝을 처리할 것이다.
  • 점수를 10점 먼저 먹은 쪽이 나타나면 게임을 종료시킬 것이다.
  • 10점을 못먹어도 3분이 지났다면 게임을 종료시킬 것이다.

ui 추가

  • text 추가 : Result부분 텍스트에서 누가 이겼다 혹은 무승부했다는 정보를 출력 할 것이다
  • 버튼 추가 : Replay버튼을 누르면 다시 게임하게 할 것이다.

  • 버튼과 텍스트 모드 게임 종료후에만 사용할 것이다. 따라서 오브젝트 이름 옆에 있는 체크박스를 해제해서 오브젝트를 비활성화 시켜야 한다.

타이머 만들기 (Timer.cs 스크립트)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Timer : MonoBehaviour
{
    public Text timerText;
    private float time;
    private int min;
    private int sec;
    private bool isTimeOver;
    void Start()
    {
        timerText.text = "03 : 00";
        time = 180;
        isTimeOver = false;
    }

    // Update is called once per frame
    void Update()
    {
        time -= Time.deltaTime;

        min = (int)time / 60;
        sec = ((int)time - min * 60) % 60;

        if (min <= 0 && sec <= 0)
        {
            if (isTimeOver==false)
            {
                isTimeOver = true;
                timerText.text = 0.ToString() + " : " + 0.ToString();
                GameManager.instance.EndGame();
            }

        }
        else
        {
            if (sec >= 60)
            {
                min += 1;
                sec -= 60;
            }
            else
            {
                timerText.text = min.ToString() + " : " + sec.ToString();

            }
        }
    }
}
  • 스크립트 추가
    void Start()
    {
        timerText.text = "03 : 00";
        time = 180;
        isTimeOver = false;
    }
  • 처음에 3분이라 나오게 텍스트 설정 및 time을 180(3*60초)으로 설정
  • 첫시작이므로 isTimeOver의 경우 false로 설정
    void Update()
    {
        time -= Time.deltaTime;

        min = (int)time / 60;
        sec = ((int)time - min * 60) % 60;

        if (min <= 0 && sec <= 0)
        {
            if (isTimeOver==false)
            {
                isTimeOver = true;
                timerText.text = 0.ToString() + " : " + 0.ToString();
                GameManager.instance.EndGame();
            }

        }
        else
        {
            if (sec >= 60)
            {
                min += 1;
                sec -= 60;
            }
            else
            {
                timerText.text = min.ToString() + " : " + sec.ToString();

            }
        }
    }
  • 시간 계산 및 ui에 표시
  • 시간이 0분0초가 된다면 EndGame호출(자세한 함수 설명은 GameManger 참조), 이때 isTimeOver을 검사하게 하여 EndGame을 여러번 말고 1번만 호출하게 함.(여러번 호출하게 될 경우 재시작 버튼 눌러도 정상적으로 동작 안함)

  • 다음과같이 Empty 오브젝트 생성 후 스크립트를 붙임

GameManger.cs 수정

    public Text resultText;
    public Button replayButton;
  • 결과 ui를 여기 받을 예정이다.
    void Start()
    {
        leftScore = 0;
        rightScore = 0;
        replayButton.onClick.AddListener(delegate { RestartGame(); });
    }
  • 클릭 이벤트를 할당한다. RestartGame()함수를 클릭시 실행하도록 하였다.
    public void AddScore(bool isLeftwin)
    {
        if(isLeftwin)
        {
            leftScore++;
            leftScoreText.text = leftScore.ToString();
        }
        else
        {
            rightScore++;
            rightScoreText.text = rightScore.ToString();
        }

        if (leftScore >= 10 || rightScore >= 10)
            EndGame();
    }
  • 점수를 얻은 후 if문을 통해 두 점수중 하나가 10점 넘었는지 검사 -> 10점 넘으면 EndGame으로 이동
    public void EndGame()
    {
        Time.timeScale = 0;
        resultText.gameObject.SetActive(true);
        replayButton.gameObject.SetActive(true);
        if (leftScore>rightScore)
        {
            resultText.text = "Player1 Win!";
        }
        else if(rightScore>leftScore)
        {
            resultText.text = "Player2 Win!";
        }
        else
        {
            resultText.text = "Draw";
        }
    }
  • Time.timeScale을 통해 게임을 멈춘다. 이를 통해 결과화면동안은 플레이어 조작 등을 못하도록 막는다.
  • if문 처리를 통해 우승 및 무승부 결과를 화면에 표시한다.
    public void RestartGame()
    {
        Time.timeScale = 1;
        SceneManager.LoadScene("SampleScene");
    }
  • 버튼을 눌렀을 때 사용될 함수
  • timescale을 이용해 게임조작을 다시 할 수 있게 미리 준비한다.
  • LoadScene을 이용해 게임 씬을 다시 불러온다. (씬 이름은 본인이 설정한 이름으로 조정하기)

  • 게임 매니저 새로 설정

 

결과

  • 먼저 10점 먹어서 이김

  • 시간이 다 끝났지만 점수가 더 높은 쪽이 이김

  • 시간이 다 끝났지만 점수가 둘 다 같아서 무승부
  • 재시작 버튼을 누르면 다시 게임 가능