[Unity] T-rex Run (크롬 공룡 게임) 만들기 (5) - 점수

Kim Yuhyeon·2023년 4월 21일
0

게임개발

목록 보기
94/135
post-thumbnail

점수


UI

DinoGameManager.cs

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

public class DinoGameManager : MonoBehaviour
{
    
    #region instance
    public static DinoGameManager instance;
    private void Awake()
    {
        if (instance != null)
        {
            Destroy(gameObject);
            return;
        }

        instance = this;
    }
    #endregion

    public float gameSpeed = 1;
    public bool isPlay = false;
    public delegate void OnPlay(bool isPlay);
    public OnPlay onPlay;

    [@SerializeField] private GameObject startText;
    [@SerializeField] private GameObject retryUI;
    [@SerializeField] private GameObject scoreUI;
    [@SerializeField] private Text scoreText;
    [@SerializeField] private Text highScoreText;

    private int score = 0;

    private void Start()
    {
        int highScore = PlayerPrefs.GetInt("HighScore", 0);
        highScoreText.text = ConvertScore(highScore);

    }
    private void Update()
    {
        if (!isPlay && Input.GetKeyDown(KeyCode.Space)) // spacebar 누르면 
        {
            Play();
        }
    }
    public void Play()
    {
        
        // 게임 시작 안내 문구 비활성화
        if (startText.activeSelf) 
            startText.SetActive(false);
        
        // 다시하기 UI 비활성화
        if (retryUI.activeSelf)
            retryUI.SetActive(false);
        
        // 점수 UI 활성화
        if (!scoreUI.activeSelf)
            scoreUI.SetActive(true);
        
        isPlay = true;
        onPlay.Invoke(isPlay);

        score = 0;
        scoreText.text = ConvertScore(score);
        StartCoroutine(AddScore());
    }

    public void GameOver()
    {
        retryUI.SetActive(true);
        isPlay = false;
        onPlay.Invoke(isPlay);
        
        StopCoroutine(AddScore());
        
        int highScore = PlayerPrefs.GetInt("HighScore", 0);
        
        // 최고 점수 갱신
        if (highScore < score)
        {
            PlayerPrefs.SetInt("HighScore", score);
            highScoreText.text = ConvertScore(score);
        }
    }

    IEnumerator AddScore()
    {
        while (isPlay)
        {
            score++;
            scoreText.text = ConvertScore(score);
            yield return new WaitForSeconds(0.1f);
        }
    }

    string ConvertScore(int num)
    {
        // 5자리 형태 
        return string.Format("{0:D5}", num);
    }
}
  • 변경된 부분
    • Start()
      • 게임 시작 시 최고 점수를 읽어옵니다.
    • Play()
      • 게임 진행 중인 동안 AddScore() 코루틴을 실행하여 게임 점수를 계속 증가시킵니다.
    • GameOver()
      • AddScore() 코루틴을 정지하고, 최고 점수를 갱신합니다.
    • AddScore()
      • 게임 진행 중인 동안 0.1초마다 score 변수를 증가시키고, scoreText에 반영합니다.
    • ConvertScore()
      • 점수를 5자리 문자열 형태로 변환합니다.

결과

0개의 댓글