와와

[ Unity 슈팅게임 ] 4. 게임 오버, 스코어 기록, 랭킹 본문

개발/Unity 3D

[ Unity 슈팅게임 ] 4. 게임 오버, 스코어 기록, 랭킹

정으주 2022. 8. 20. 13:33

 

 

 

 

적이 바닥에 닿거나 플레이어가 적과 닿게 된다면 게임 오버다.

게임 오버가 되면 첫번째 장면과 같이 본인의 점수와 랭킹 화면이 나오게 된다.

 

1위부터 5위까지 출력하고 본인의 점수는 아래 나타난다.

화살표 버튼을 누르면 메뉴가 있는 처음 씬으로 돌아가게 된다.

 

 

 

1. 게임 오버

 

게임 속 시간을 조절하여 게임을 실행하고 중단 시킬 수 있다.

Time.timeScale = 1;  >> 게임 실행

Time.timeScale = 0;  >> 게임 중단

 

void Awake()에 timeScale을 1로 설정하여 게임을 시작하고

게임이 종료되어야 할 때 GameOver() 함수 안에 timeScale = 0;을 넣어 호출해주었다.

 

화살표 버튼을 누르면 MenuBtnClick()  으로 인해 처음 메뉴 씬이 다시 로드되고

해당 씬으로 다시 돌아올 때 Awake()로 인해 게임 속 시간이 다시 흐르게 된다.

        void Awake()
    {
        Time.timeScale = 1;
        if (!instance)
            instance = this;
        scoreText.text = score.ToString();
        
    }
    
    public void GameOver()
    {
        string name = PlayerPrefs.GetString("CurrentPlayerName");
        myrank.text = name + " " + score;

        Button MenuB = MenuBtn.GetComponent<Button>();
        MenuB.onClick.AddListener(MenuBtnClick);
		//게임 중지
        Time.timeScale = 0;
        //랭킹호출
        ScoreSet(score, name);
        //랭킹 화면 활성화
        rankPrint.SetActive(true);
    }

 

 

2. 점수 더하기

    public void AddScore(int num)
    {
        score += num;
        scoreText.text = score.ToString();
        //Debug.Log(score);
    }

 

이렇게 해놓고

Enemy 스크립트에서 적이 총알과 충돌할 때 AddScore(1); 를 넣어준다.

 

 

3. 랭킹

 void ScoreSet(int currentScore, string currentName)
    {
        PlayerPrefs.SetString("CurrentPlayerName", currentName);
        PlayerPrefs.SetInt("CurrentPlayerScore", currentScore);

        int tmpScore = 0;
        string tmpName = "";

        for (int i = 0; i < 5; i++)
        {
            bestScore[i] = PlayerPrefs.GetInt(i + "BestScore");
            bestName[i] = PlayerPrefs.GetString(i + "BestName");

            while (bestScore[i] < currentScore)
            {
                tmpScore = bestScore[i];
                tmpName = bestName[i];
                bestScore[i] = currentScore;
                bestName[i] = currentName;

                //랭킹 저장
                PlayerPrefs.SetInt(i + "BestScore", currentScore);
                PlayerPrefs.SetString(i + "BestName", currentName);
                currentScore = tmpScore;
                currentName = tmpName;
            }
        }
        //랭킹 출력
        for (int i = 0; i < 5; i++)
        {
            PlayerPrefs.SetInt(i + "BestScore", bestScore[i]);
            PlayerPrefs.SetString(i + "BestName", bestName[i]);
            Debug.Log("[랭킹] "+ PlayerPrefs.GetString(i + "BestName") + PlayerPrefs.GetInt(i+"BestScore"));
            rank[i].text = bestName[i] + " " + bestScore[i].ToString();
        }
    }

 

게임을 실행했을 때 메뉴에서 본인 닉네임을 적고 시작 버튼을 누르면 게임을 시작하도록 했다.

PlayerPrefs 를 이용해 사용자 닉네임과 랭킹에 오른 점수, 닉네임을 저장한다.

 

 

랭킹 참고

https://drybone-developer.tistory.com/93

 

[Unity C#] PlayerPrefs로 기기에 저장되는 랭킹 만들기

학교다닐때 과제로 냈던 유니티 프로젝트에 썼던 코드 얼렁뚱땅 PalyerPrefs로만 구현했습니다. 오직! 플레이어프립스로만! 플레이어프립스 특징 상, 기기에 저장되는 랭킹입니다. 그때 이걸 만들

drybone-developer.tistory.com

 

 

 

 

< gameManager.cs >

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

public class gameManager : MonoBehaviour
{
    public static gameManager instance;
    public Text scoreText, myrank;
    public Text[] rank = new Text[5];
    public int score = 0;
    private int[] bestScore = new int[5];
    private string[] bestName = new string[5];
    public GameObject rankPrint;
    public Button MenuBtn;

    void Awake()
    {
        Time.timeScale = 1;
        if (!instance)
            instance = this;
        scoreText.text = score.ToString();
        
    }
    
    // Start is called before the first frame update
    void Start()
    {
    }

    // Update is called once per frame
    void Update()
    {
        
    }


	//점수 더하기
    public void AddScore(int num)
    {
        score += num;
        scoreText.text = score.ToString();
        //Debug.Log(score);
    }

	//게임 오버
    public void GameOver()
    {
        string name = PlayerPrefs.GetString("CurrentPlayerName");
        myrank.text = name + " " + score;

        Button MenuB = MenuBtn.GetComponent<Button>();
        MenuB.onClick.AddListener(MenuBtnClick);

        Time.timeScale = 0;
        //랭킹호출
        //Debug.Log("호출할이름: " + name);
        ScoreSet(score, name);
        rankPrint.SetActive(true);
    }

    //랭킹계산
    void ScoreSet(int currentScore, string currentName)
    {
        //Debug.Log("currentName: " + currentName);
        //일단 현재에 저장하고 시작
        PlayerPrefs.SetString("CurrentPlayerName", currentName);
        PlayerPrefs.SetInt("CurrentPlayerScore", currentScore);
        //Debug.Log("계산"+ PlayerPrefs.GetInt("CurrentPlayerScore").ToString());

        int tmpScore = 0;
        string tmpName = "";

        for (int i = 0; i < 5; i++)
        {
            //저장된 최고점수와 이름을 가져오기
            bestScore[i] = PlayerPrefs.GetInt(i + "BestScore");
            bestName[i] = PlayerPrefs.GetString(i + "BestName");
            //Debug.Log("[랭킹출력] 이름: " + bestName[i]+ "점수: " + bestScore[i]);

            //현재 점수가 랭킹에 오를 수 있을 때
            while (bestScore[i] < currentScore)
            {
                //자리바꾸기!
                tmpScore = bestScore[i];
                tmpName = bestName[i];
                bestScore[i] = currentScore;
                bestName[i] = currentName;

                //랭킹에 저장
                PlayerPrefs.SetInt(i + "BestScore", currentScore);
                //PlayerPrefs.SetString(i.ToString() + "BestName", currentName);
                PlayerPrefs.SetString(i + "BestName", currentName);

                //다음 반복을 위한 준비
                currentScore = tmpScore;
                currentName = tmpName;
            }
        }
        //랭킹에 맞춰 점수와 이름 저장과 출력
        for (int i = 0; i < 5; i++)
        {
            PlayerPrefs.SetInt(i + "BestScore", bestScore[i]);
            PlayerPrefs.SetString(i + "BestName", bestName[i]);
            //PlayerPrefs.SetString(i.ToString() + "BestName", bestName[i]);
            Debug.Log("[랭킹] "+ PlayerPrefs.GetString(i + "BestName") + PlayerPrefs.GetInt(i+"BestScore"));
            rank[i].text = bestName[i] + " " + bestScore[i].ToString();
        }
    }

	// 메뉴로 돌아가기
    void MenuBtnClick()
    {
        Debug.Log("You have clicked the menubutton!");
        SceneManager.LoadScene("Menu");
    }


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

public class gameManager : MonoBehaviour
{
    public static gameManager instance;
    public Text scoreText, myrank;
    public Text[] rank = new Text[5];
    public int score = 0;
    private int[] bestScore = new int[5];
    private string[] bestName = new string[5];
    public GameObject rankPrint;
    public Button MenuBtn;

    void Awake()
    {
        Time.timeScale = 1;
        if (!instance)
            instance = this;
        scoreText.text = score.ToString();
        
    }
    
    // Start is called before the first frame update
    void Start()
    {
    }

    // Update is called once per frame
    void Update()
    {
        
    }


	//점수 합산
    public void AddScore(int num)
    {
        score += num;
        scoreText.text = score.ToString();
        //Debug.Log(score);
    }

	//게임 오버
    public void GameOver()
    {
        string name = PlayerPrefs.GetString("CurrentPlayerName");
        myrank.text = name + " " + score;

        Button MenuB = MenuBtn.GetComponent<Button>();
        MenuB.onClick.AddListener(MenuBtnClick);

        Time.timeScale = 0;
        //랭킹호출
        //Debug.Log("호출할이름: " + name);
        ScoreSet(score, name);
        rankPrint.SetActive(true);
    }

    //랭킹계산
    void ScoreSet(int currentScore, string currentName)
    {
        //Debug.Log("currentName: " + currentName);
        PlayerPrefs.SetString("CurrentPlayerName", currentName);
        PlayerPrefs.SetInt("CurrentPlayerScore", currentScore);

        int tmpScore = 0;
        string tmpName = "";

        for (int i = 0; i < 5; i++)
        {
            //저장된 최고점수와 이름을 가져오기
            bestScore[i] = PlayerPrefs.GetInt(i + "BestScore");
            bestName[i] = PlayerPrefs.GetString(i + "BestName");
            //Debug.Log("[랭킹출력] 이름: " + bestName[i]+ "점수: " + bestScore[i]);

            //랭킹 올리기
            while (bestScore[i] < currentScore)
            {
                tmpScore = bestScore[i];
                tmpName = bestName[i];
                bestScore[i] = currentScore;
                bestName[i] = currentName;

                //저장
                PlayerPrefs.SetInt(i + "BestScore", currentScore);
                //PlayerPrefs.SetString(i.ToString() + "BestName", currentName);
                PlayerPrefs.SetString(i + "BestName", currentName);

                currentScore = tmpScore;
                currentName = tmpName;
            }
        }
        //랭킹 출력
        for (int i = 0; i < 5; i++)
        {
            PlayerPrefs.SetInt(i + "BestScore", bestScore[i]);
            PlayerPrefs.SetString(i + "BestName", bestName[i]);
            //PlayerPrefs.SetString(i.ToString() + "BestName", bestName[i]);
            Debug.Log("[랭킹] "+ PlayerPrefs.GetString(i + "BestName") + PlayerPrefs.GetInt(i+"BestScore"));
            rank[i].text = bestName[i] + " " + bestScore[i].ToString();
        }
    }

	// 메뉴
    void MenuBtnClick()
    {
        Debug.Log("You have clicked the menubutton!");
        SceneManager.LoadScene("Menu");
    }


}