시간처리를 위한 변수를 추가한다.
// +++ 시간 제한 추가 +++
public GameObject timeBar; // 시간 표시 이미지
public GameObject timeText; // 시간 텍스트
TimeController timeCnt; // TimeController 스크립트 참조
점수처를 위한 변수를 추가한다.
// +++ 점수 추가 +++
public GameObject scoreText; // 점수 텍스트
public static int totalScore; // 점수 총합
public int stageScore = 0; // 스테이지 점수
싱글톤정적변수인 gameState를 체크해 게임중이라면 player게임오브젝트의 playerController스크립트의 score변수가 0이 아니라면 stageScore를 추가해주고 0으로 변경한후 점수를 처리하기 위한 UpdateScore()를 호출한다.
else if (PlayerController.gameState == "playing")
{
// 게임 중
GameObject player = GameObject.FindGameObjectWithTag("Player");
// PlayerController 가져오기
PlayerController playerCnt = player.GetComponent<PlayerController>();
// +++ 시간 제한 추가 +++
// 시간 갱신
if(timeCnt != null)
{
~시간 종료 처리
}
// +++ 점수 추가 +++
if (playerCnt.score != 0)
{
stageScore += playerCnt.score;
playerCnt.score = 0;
UpdateScore();
}
}
UpdateScore()에서는 public으로 연결된 scoreText게임오브젝트의 Text컴포넌트를 갱신해준다. 재미있는건 하이라키의 모든건 게임오브젝트라 Text마저도 GameObject이다. Text 내용을 변경하기 위해서는 귀찮아도 다시 GetComponent<Text>를 통해 test에 접근해야 한다
void UpdateScore()
{
int score = stageScore + totalScore;
scoreText.GetComponent<Text>().text = score.ToString();
}
using UnityEngine.UI; 간 선언되어 있기 때문에 Text타입을 이용해 좀더 편하게 사용할 수도 있다.
public Text ScoreText;
ScoreText.text = score.ToString();
시간은 TimeController에서 관리되여 있고 여기서는 시간을 표시하고 게임을 관리하기 위해서 사용한다. 소스를 읽어보면 이해할수 있으리라 믿습니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; // UI を使うのに必要
public class GameManager : MonoBehaviour
{
public GameObject mainImage; // 이미지를 담아두는 GameObject
public Sprite gameOverSpr; // GAME OVER 이미지
public Sprite gameClearSpr; // GAME CLEAR 이미지
public GameObject panel; // 패널
public GameObject restartButton; // RESTART 버튼
public GameObject nextButton; // NEXT 버튼
Image titleImage; // 이미지를 표시하고있는 Image 컴포넌트
// +++ 시간 제한 추가 +++
public GameObject timeBar; // 시간 표시 이미지
public GameObject timeText; // 시간 텍스트
TimeController timeCnt; // TimeController
// +++ 점수 추가 +++
public GameObject scoreText; // 점수 텍스트
public static int totalScore; // 점수 총합
public int stageScore = 0; // 스테이지 점수
// Start is called before the first frame update
void Start()
{
// 이미지 숨기기
Invoke("InactiveImage", 1.0f);
// 버튼(패널)을 숨기기
panel.SetActive(false);
// +++ 시간 제한 추가 +++
// TimeController 가져옴
timeCnt = GetComponent<TimeController>();
if(timeCnt != null)
{
if(timeCnt.gameTime == 0.0f)
{
timeBar.SetActive(false); // 시간 제한이 없으면 숨김
}
}
// +++ 점수 추가 +++
UpdateScore();
}
// Update is called once per frame
void Update()
{
if (PlayerController.gameState == "gameclear")
{
// 게임 클리어
mainImage.SetActive(true); // 이미지 표시
panel.SetActive(true); // 버튼(패널)을 표시
// RESTART 버튼 무효화
Button bt = restartButton.GetComponent<Button>();
bt.interactable = false;
mainImage.GetComponent<Image>().sprite = gameClearSpr;
PlayerController.gameState = "gameend";
// +++ 시간 제한 추가 +++
if (timeCnt != null)
{
timeCnt.isTimeOver = true; // 시간 카운트 중지
// +++ 점수 추가 +++
// 정수에 할당하여 소숫점 버림
int time = (int)timeCnt.displayTime;
totalScore += time * 10; // 남은 시간을 점수에 더한다.
}
// +++ 점수 추가 +++
totalScore += stageScore;
stageScore = 0;
UpdateScore();// 점수 갱신
}
else if (PlayerController.gameState == "gameover")
{
// 게임 오버
mainImage.SetActive(true); // 이미지 표시하기
panel.SetActive(true); // 버튼(패널)표시하기
// NEXT 버튼 비활성
Button bt = nextButton.GetComponent<Button>();
bt.interactable = false;
mainImage.GetComponent<Image>().sprite = gameOverSpr;
PlayerController.gameState = "gameend";
// +++ 시간 제한 추가 +++
if (timeCnt != null)
{
timeCnt.isTimeOver = true; // 시간 카운트 중지
}
}
else if (PlayerController.gameState == "playing")
{
// 게임 중
GameObject player = GameObject.FindGameObjectWithTag("Player");
// PlayerController 가져오기
PlayerController playerCnt = player.GetComponent<PlayerController>();
// +++ 시간 제한 추가 +++
// 시간 갱신
if(timeCnt != null)
{
if (timeCnt.gameTime > 0.0f)
{
// 정수에 할당하여 소수점 이하를 버림
int time = (int)timeCnt.displayTime;
// 시간 갱신
timeText.GetComponent<Text>().text = time.ToString();
// 타임 오버
if (time == 0)
{
playerCnt.GameOver(); // 게임 오버
}
}
}
// +++ 점수 추가 +++
if (playerCnt.score != 0)
{
stageScore += playerCnt.score;
playerCnt.score = 0;
UpdateScore();
}
}
}
// 이미지 숨김
void InactiveImage()
{
mainImage.SetActive(false);
}
// +++ 점수 추가 +++
void UpdateScore()
{
int score = stageScore + totalScore;
scoreText.GetComponent<Text>().text = score.ToString();
}
}
'유니티2D게임 > 게임에 화면과 기능 추가' 카테고리의 다른 글
6.4 시간제한 기능 만들기 (0) | 2023.05.16 |
---|---|
6.3 스크롤 화면 만들기 (0) | 2023.05.16 |
6.2 타이틀 화면 추가하기 (0) | 2023.05.14 |
6.1 버전업 내용 요약 (0) | 2023.05.14 |