미니게임 제작 10
앞으로는 간단한 게임들을 만들어보며 추가적인 기능에 대해 공부를 해보려한다. 간단한 것부터 만들기 시작하여 만든 결과물을 레퍼런스 하여 덩치를 조금씩 키워나가는 과정을 밟아보자. 지식이 많지 않아 부족할 수 있지만, 하는데까지 해보겠다.
현재 구상 하고 있는 것은 예전에 잠깐 화제가 되었던 모바일 게임 매직 서바이벌 과 스팀에서 최근 붐이 일었던 게임 뱀파이어 서바이벌 의 장르를 본딴 생존 서바이벌 슈팅 게임이다.
이번에는 점수를 실시간으로 증가시키고, 게임이 종료되었을 때 점수를 표시해보도록 하겠다.
먼저 게임 매니저 스크립트에서 변경될 부분이다.
// 실시간 점수 표시 텍스트
public Text scoreText;
// 점수
float score;
// 최고 점수 표시 텍스트
public Text bestScoreText;
먼저 이 3개의 변수를 생성했다. 점수는 시간에 따라 증가하며, 그 증가하는 점수가 Text로 표시될 것이다. 그리고 게임 오버 화면에 최고 점이 표시될 것이다.
public void hpDown()
{
if (health > 1)
{
// Hp 감소 및 hpBar 갱신
hpBar.setHp(--health);
}
else
{
// Hp 감소 및 hpBar 갱신
hpBar.setHp(--health);
endGame();
}
}
그리고, Hpdown 메서드와 endGame 메서드를 구분지었다. Hp가 줄어들어 0이 되었을 경우 endGame 메서드가 수행되게끔 설정했다.
public void endGame()
{
// 플레이어의 사망 스크립트 수행(애니메이션 재생)
playerControl.die();
// EnemySpawner 정지
enemySpawner.gameover();
// 게임오버, 점수 UI 적용
gameoverText.gameObject.SetActive(true);
// 게임오버 체크 변수설정
gameover = true;
//"BestScore" 키로 저장되어있는 최고기록을 가져오기
float bestScore = PlayerPrefs.GetFloat("BestScore");
// 최고기록을 갱신했을 경우
if (score > bestScore)
{
// 최고기록 값을 현재 기록으로 변경
bestScore = score;
// "BestScore" 키로 최고기록을 저장
PlayerPrefs.SetFloat("BestScore", bestScore);
}
// 최고기록 표시
bestScoreText.text = "Best Score: " + (int)bestScore;
}
endGame 메서드를 만들었다. 추가된 부분은 아래 최고기록을 추가하여 텍스트로 표시하는 부분이다.
void Update()
{
if (gameover && Input.GetKeyDown(KeyCode.R))
{
restart();
}
else if (!gameover)
{
scoreUpdate();
}
}
Update 부분의 변경사항이다. gameover가 아닌 상황에서 ScoreUpdate 메서드가 지속적으로 수행될 수 있게 코드를 추가해주었다.
void scoreUpdate()
{
score += Time.deltaTime;
scoreText.text = "Score: " + (int)score;
}
scoreUpdate 메서드의 구현사항이다. 이 메서드 내부는 이전에는 비어있었다.
Time.daltaTime을 score에 계속해서 더해주고, Score 값을 Text에 int값으로 변환해서 출력한다.
GameManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class GameManager : MonoBehaviour
{
// 플레이어 Hp
int health = 4;
// 점수
float score;
// 게임 오버 체크 변수
bool gameover = false;
// hp Bar 객체
public HpBar hpBar;
// 플레이어 컨트롤 변수
public PlayerControl playerControl;
// EnemySpawner 변수
public EnemySpawner enemySpawner;
// 게임오버 텍스트 변수
public Text gameoverText;
// 실시간 점수 표시 텍스트
public Text scoreText;
// 최고 점수 표시 텍스트
public Text bestScoreText;
// Private 기본생성자 : sigleton
private GameManager() { }
// 인스턴스 변수 생성 : sigleton
private static GameManager instance = null;
void Awake()
{
// 게임 오브젝트 생성 시 객체생성.
if (instance == null)
{
instance = this;
}
}
void Start()
{
score = 0;
}
public static GameManager Instance
{
get
{
if (instance == null)
{
return null;
}
return instance;
}
}
void Update()
{
if (gameover && Input.GetKeyDown(KeyCode.R))
{
restart();
}
else if (!gameover)
{
scoreUpdate();
}
}
public void hpDown()
{
if (health > 1)
{
// Hp 감소 및 hpBar 갱신
hpBar.setHp(--health);
}
else
{
// Hp 감소 및 hpBar 갱신
hpBar.setHp(--health);
endGame();
}
}
public void endGame()
{
// 플레이어의 사망 스크립트 수행(애니메이션 재생)
playerControl.die();
// EnemySpawner 정지
enemySpawner.gameover();
// 게임오버, 점수 UI 적용
gameoverText.gameObject.SetActive(true);
// 게임오버 체크 변수설정
gameover = true;
//"BestScore" 키로 저장되어있는 최고기록을 가져오기
float bestScore = PlayerPrefs.GetFloat("BestScore");
// 최고기록을 갱신했을 경우
if (score > bestScore)
{
// 최고기록 값을 현재 기록으로 변경
bestScore = score;
// "BestScore" 키로 최고기록을 저장
PlayerPrefs.SetFloat("BestScore", bestScore);
}
// 최고기록 표시
bestScoreText.text = "Best Score: " + (int)bestScore;
}
// 점수 갱신 메서드 : 시간에 따라 점수 증가 및 UI 표시
void scoreUpdate()
{
score += Time.deltaTime;
scoreText.text = "Score: " + (int)score;
}
// 게임 재시작 메서드 : 플레이어 사망 후 특정 조작을 통해 게임 재시작 : R키
void restart()
{
// Scene1 씬을 로드
SceneManager.LoadScene("Scene1");
}
}
변경된 게임매니저 스크립트 전문이다. 이제 오브젝트 설정을 하러 가보자. 스크립트에서는 텍스트 객체 2개를 추가했었다.
canvas 안에 Text 객체 2개를 생성했다.
BestScoreText 오브젝트는 게임 종료시에 같이 나타나야 하므로 GameOverText 오브젝트의 자식으로 두어 같이 활성화/비활성화 되도록 했다.
Score 오브젝트는 실시간으로 게임에 나타나야하기 때문에 그냥 생성했다.
각각의 오브젝트에 대한 인스펙터 창이다.
Scene 창에서의 모습은 다음과 같다.
최고기록 저장과, 실시간 스코어 변동, 다시시작시 초기화가 잘 이루어지는 모습이다.
현재는 그냥 텍스트만 띄운 상태이지만, 후반부에 UI 스프라이트를 이용하여 꾸며보도록하겠다.