스파르타 게임개발종합반(Unity)/사전캠프 공부 기록

[Unity] 앱을 껐다 켜도 데이터 유지 및 보관하기, 데이터 저장하기 - PlayerPrefs

테크러너 2024. 4. 1.

데이터 저장하기

PlayerPrefs.SetFloat("bestScore", 어떤숫자값);
PlayerPrefs.SetString("bestScore", 어떤문자열);

괄호 안에는 2개의 변수가 들어갑니다.

PlayerPrefs.SetFloat(키값, 어떤변수);

'키값이라는 이름으로 어떤변수저장할게요.' 라는 뜻입니다.

 

데이터 불러오기

어떤숫자값 = PlayerPrefs.GetFloat("bestScore");
어떤문자열 = PlayerPrefs.GetString("bestScore");

괄호 안에는 역시나 키값이 들어갑니다.

'키값이라는 이름으로 저장한 어떤값찾으러 왔어요.' 라는 뜻입니다.

그래서 하나의 매개변수 즉, 키값만 괄호에 넣어주시면 됩니다.

 

데이터를 저장했었는지 확인

→있으면 true 없으면 false

PlayerPrefs.HasKey("bestScore");

키값이 있는지 없는지 확인하는 기능이 HasKey입니다.

확인 후 생각할건?▼

찾는 키값으로 저장된 값이 있다면 저장된 값과 현재 값을 비교해보고, 저장할지 말지 결정합니다.

없다면 데이터를 저장합니다.

 

데이터를 모두 지우기

PlayerPrefs.DeleteAll();

저장한 모든 데이터를 지우는 기능입니다. → 초기화 기능

 

 

"bestScore"을 변수에 저장하고 사용하기 - 오타방지

PlayerPrefs.HasKey("bestScore");

"bestScore" 과 "BestScore"은 다른 문자열로 취급합니다.

그래서 오타 방지를 위해 문자열을 'key'라는 변수에 넣고 사용합니다.

 

string key = "bestScore"; // 오타방지

PlayerPrefs.HasKey(key);

이렇게 사용하시면 됩니다.

 

적용 예시 - 최고 점수 로직

먼저 생각해볼 것은 '최고 점수가 있다면' or '최고 점수가 없다면'으로 나눠볼 수 있다는 것입니다.

최고 점수가 없다면 최고 점수를 Set 해주면 됩니다.(저장해주면 됩니다.)

반면에 최고 점수가 있다면최고 점수와 현재의 점수를 비교해봅니다. 그래서 최고 점수가 현재 점수보다 작다면 다시 현재 점수를 최고 점수로 저장해주어야 하고요, 최고 점수가 현재 점수보다 크다면 별도의 조치를 취해주지 않아도 됩니다.

 

말이 복잡하죠? 아래처럼 주석을 먼저 달고 코드를 작성하면 쉽습니다.

    public void GameOver()
    {
        isPlay = false; 
        Time.timeScale = 0.0f; // 타임의 크기 = 0 -> 멈춘것과 같음
        nowScore.text = time.ToString("N2");

        // 최고점수가 있다면
            // 최고 점수 < 현재 점수
            // 현재 점수를 최고 점수에 저장한다.
        // 최고점수가 없다면
            // 현재 점수를 저장한다.

        endPanel.SetActive(true);
    }

최고 점수 > 현재 점수 일 때는 여전히 최고 점수이니까 저장할 필요가 없겠죠?

그래서 PlayerPrefs에는 저장하지 않습니다.

 

이제 주석을 코드로 채워보겠습니다.

    string key = "bestScore"; // 오타방지
    
    public void GameOver()
    {
        isPlay = false; 
        Time.timeScale = 0.0f; // 타임의 크기 = 0 -> 멈춘것과 같음
        nowScore.text = time.ToString("N2");

        // 최고 점수가 있다면
        if (PlayerPrefs.HasKey(key))
        {
            // 최고 점수 가져오기
            float best = PlayerPrefs.GetFloat(key);
            // 최고 점수 < 현재 점수
            if(best < time)
            {
                // 현재 점수를 최고 점수에 저장한다.
                PlayerPrefs.SetFloat(key, time);
                bestScore.text = time.ToString("N2"); // 현재 점수가 최고 점수이니까 time 값을 넣어도 됨
            }
            else // 최고 점수 > 현재 점수
            {
                bestScore.text = best.ToString("N2"); // best가 여전히 최고 점수니까
            }
        }
        else // 최고 점수가 없다면
        {
            // 현재 점수를 저장한다.
            PlayerPrefs.SetFloat(key, time);
            bestScore.text = time.ToString("N2");
        }        

        endPanel.SetActive(true);
    }

 

 

 

결과

반응형

댓글