목표
- 이제 게임 끝을 처리할 것이다.
- 점수를 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점 먹어서 이김
- 시간이 다 끝났지만 점수가 더 높은 쪽이 이김
- 시간이 다 끝났지만 점수가 둘 다 같아서 무승부
- 재시작 버튼을 누르면 다시 게임 가능
'유니티로 Pong 게임 만들기' 카테고리의 다른 글
6) 유니티로 Pong 게임 만들기 - 점수 ui 표시 (0) | 2024.01.24 |
---|---|
5) 유니티로 Pong 게임 만들기 - 공이 골 역할을 하는 벽에 닿았을 때 처리 (0) | 2024.01.24 |
4) 유니티로 Pong 게임 만들기 - 공이 패달과 벽에 닿았을때 튕겨내기 (0) | 2024.01.24 |
3) 유니티로 Pong 게임 만들기 - 공 발사되게 하기 (0) | 2024.01.24 |
2) 유니티로 Pong 게임 만들기 - 패들 움직이게 하기 (0) | 2024.01.24 |