GameDevelop/Unity기초쌓기

[Unity] 최고점수구현 - 데이터보관 PlayerPrefs

도도돋치 2025. 4. 6. 19:37
Contents 접기
728x90

 

유니티에서는 데이터를 보관하는 기능을 제공한다.

 

데이터 보관 개념

  • 데이터를 보관하는 방법: PlayerPrefs
앱을 껐다 켜도 데이터가 유지되게 - 유니티에서 데이터를 보관하는 방법

 

  • 데이터 저장하기
PlayerPrefs.SetFloat("bestScore", 어떤숫자값);
PlayerPrefs.SetString("bestScore", 어떤문자열);

 setFloat라고 하면 float자료형을 세팅한다(저장한다) 라는 뜻 

📌 두개의 매개변수가 들어가는데, bestScore은 Key값

예를 들면 은행에 돈을 맡길 때 "장도치 이름으로 얼마를 저금할게요" 라고 하는데, 이때 장도치와 같은 역할즉, bestScore라고 하는 이름으로 어떤값을 저장할게요 

 

  • 데이터 불러오기
어떤숫자값 = PlayerPrefs.GetFloat("bestScore");
어떤문자열 = PlayerPrefs.GetString("bestScore");

저장했다면 값을 가져와야한다. 이때 GetFloat, GetString를 쓴다. (Set, Get 차이)

📌 bestScore라고 하는 키워드로 저장한 값을 찾으러 왔어요

→ 찾아야 할 키값만 입력 

 

  • 데이터 저장했었는지 확인 
PlayerPrefs.HasKey("bestScore")

📌 이 Key값이 있는지 없는지 먼저 확인하는 기능 HasKey

→ 있으면 true, 없으면 false

 

  • 데이터를 모두 지우기
PlayerPrefs.DeleteAll();

📌 저장한 모든 데이터를 지우는 기능 (초기화)

 

최고점수 로직구현

1️⃣ 최고점수가 없다면 → 그냥 최고점수를 set해주면 됨 

2️⃣ 최고점수가 있다면 → 그 최고점수와, 현재 점수를 비교해야함. 

  • 최고점수가 현재점수가 작다면 다시 지금 점수를 최고점수로 저장을 해주어야함.
  • 최고점수가 지금점수보다 크다면 별도조치 X
최고 점수가 있다면
	최고점수 < 현재 점수
		현재점수를 최고 점수에 저장한다.
	최고 점수가 없다면
		현재점수 저장
GameManager Script

위의 로직을 코드에 그대로 반영하였다.

public void GameOver()
{
    isPlay = false;
    Time.timeScale = 0.0f;
    nowScore.text = time.ToString("N2");

    //최고 점수가 있다면
    if(PlayerPrefs.HasKey("bestScore"))
    {
        float best = PlayerPrefs.GetFloat("bestScore"); //최고점수 가져오기, time의 자료형은 float
        //최고점수 < 현재 점수
        if (best < time)
        {
            //현재점수를 최고 점수에 저장한다.
            PlayerPrefs.SetFloat("bestScore", time);
        }
    }
    else //최고 점수가 없다면
    {
        //현재점수 저장
        PlayerPrefs.SetFloat("bestScore", time);
    } 
        
    endPanel.SetActive(true);
}

 

이제 이 최고점수를 BestScoreText에 넣어주자.

bestScore text값을 가져오기 위한 변수선언을 해준다.

 public Text bestScore;

bestScore의 text에 해당 값을 넣어준다(*최고 점수가 현재 점수보다 클경우 그대로 기존의 bestScore값을 text에 넣어준다.)

public void GameOver()
{
    isPlay = false;
    Time.timeScale = 0.0f;
    nowScore.text = time.ToString("N2");

    //최고 점수가 있다면
    if(PlayerPrefs.HasKey("bestScore"))
    {
        float best = PlayerPrefs.GetFloat("bestScore"); //time의 자료형은 float
        //최고점수 < 현재 점수
        if (best < time)
        {
            //현재점수를 최고 점수에 저장한다.
            PlayerPrefs.SetFloat("bestScore", time);
            bestScore.text = time.ToString("N2");
        }
        else //최고점수 > 현재 점수
        {
            bestScore.text = best.ToString("N2");
        }
    }
    else //최고 점수가 없다면
    {
        //현재점수 저장
        PlayerPrefs.SetFloat("bestScore", time);
        bestScore.text = time.ToString("N2");
    } 
        
    endPanel.SetActive(true);
}

 

Unity로 돌아가서 GameManager오브젝트의 BestScore에 BestScore오브젝트를 드래그 앤 드롭해준다.

*여기까지만 해도 플레이상에서 정상 작동한다. 

 

코드개선

현재 GameManager Script를 보면 Key값들이 다 쌍따옴표 안에 들어가있다. ("bestScore")

PlayerPrefs.GetFloat("bestScore");

이렇게 되면 오타가 발생할 경우 완전히 다른 키값이 돼버릴 수 있다. 

 

오타가 발생했을 때 자료들이 잘못 저장되는 것을 방지하기 위해서 bestScore라고 하는 String값을 변수로 변경해준다.

string key = "bestScore";

그리고 기존의 "bestScore"값을 key값으로 대체 해준다. 

 

이렇게 하면 맨 위의 bestScore값이 바뀌지 않는 이상, 다 똑같은 값이 들어가게 될것이다.

이를 통해 조금 더 안전한 코드를 작성할 수 있다. 

 

 

결과화면

이전에 플레이했을때의 점수인 5.22초가 정상적으로 들어가는 것을 확인할 수 있다.

 

 

 

728x90