/ UNITY

미니게임 제작 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개를 추가했었다.

game_79

canvas 안에 Text 객체 2개를 생성했다.

BestScoreText 오브젝트는 게임 종료시에 같이 나타나야 하므로 GameOverText 오브젝트의 자식으로 두어 같이 활성화/비활성화 되도록 했다.

Score 오브젝트는 실시간으로 게임에 나타나야하기 때문에 그냥 생성했다.

game_80

game_81

각각의 오브젝트에 대한 인스펙터 창이다.

game_82

Scene 창에서의 모습은 다음과 같다.

game_83

최고기록 저장과, 실시간 스코어 변동, 다시시작시 초기화가 잘 이루어지는 모습이다.

현재는 그냥 텍스트만 띄운 상태이지만, 후반부에 UI 스프라이트를 이용하여 꾸며보도록하겠다.