본문 바로가기
TIL

PlayerPrefs로 최고 점수 저장하기

by vvin39 2025. 4. 30.

내일배움캠프 18일차 TIL

오늘은 The Stack이라는 게임을 만들며 Unity의 다양한 기능을 익혔고, 그중에서도 PlayerPrefs를 이용한 최고 점수 저장 기능 구현에 대해서 더 알아 보았다. PlayerPrefs는 아주 간단하지만, 점수 저장이나 설정 유지 등에서 매우 유용하게 쓰이는 기능이다. 이번 기회에 개념부터 사용법, 주의할 점까지 정리해두기로 했다.

📌 PlayerPrefs란?

PlayerPrefs는 Unity에서 제공하는 간단한 로컬 저장소 시스템이다.

간단한 데이터를 영구적으로 저장하고 로드할 수 있는 기능을 제공한다. 일반적으로 설정값이나 작은 크기의 데이터(예: 점수, 옵션 설정 등)를 저장할 때 사용된다. 
기본적으로 키-값(Key-Value) 구조로 데이터를 저장하며, 저장할 수 있는 값의 종류는 다음과 같다:

  • int (정수)
  • float (실수)
  • string (문자열)

운영체제별로 실제로 저장되는 위치는 다르지만, 일반적으로는 앱 종료 후에도 유지되며, 간단한 데이터 보존에 적합하다.
Windows는  HKEY_CURRENT_USER/Software/[CompanyName]/[ProductName] 에 저장 된다.

주의
PlayerPrefs는 보안이 필요한 데이터(예: 로그인 정보) 저장에는 절대 적합하지 않다. 사용자가 파일을 열어 직접 수정할 수 있기 때문이다.

 

사용법 정리

값 저장

PlayerPrefs.SetInt("HighScore", 100);
PlayerPrefs.SetFloat("Volume", 0.8f);
PlayerPrefs.SetString("UserName", "Lutan");

값 불러오기

int highScore = PlayerPrefs.GetInt("HighScore");
float volume = PlayerPrefs.GetFloat("Volume");
string userName = PlayerPrefs.GetString("UserName");

기본값 설정 (저장된 값이 없을 경우)

int highScore = PlayerPrefs.GetInt("HighScore", 0);  // 없으면 0 반환

모든 저장 데이터 삭제

PlayerPrefs.DeleteAll();

특정 키 삭제

PlayerPrefs.DeleteKey("HighScore");

저장 강제 적용

PlayerPrefs.Save();

보통 Unity는 SetInt, SetString 등을 호출하면 자동으로 저장하지만, 에디터에서는 Save()를 명시적으로 호출하는 습관이 좋다.

 

The Stack 게임에 적용한 방식

1. 점수 계산

블록을 스택에 정확히 쌓을수록 점수가 올라간다. currentScore 변수를 사용해 현재 점수를 계산했다.

2. 최고 점수 저장/갱신 로직

(기존코드)

int bestScore = 0;
public int BestScore { get => bestScore; }

int bestCombo = 0;
public int BestCombo { get => bestCombo; }

private const string BestScoreKey = "BestScore";
private const string BestComboKey = "BestCombo";

void Start()
{
    if(originBlock == null)
    {
        Debug.Log("OriginBlock is NULL");
        return;
    }
    
    bestScore = PlayerPrefs.GetInt(BestScoreKey, 0);
    bestCombo = PlayerPrefs.GetInt(BestComboKey, 0);
    
		(기존코드)
}

void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        if(PlaceBlock())
        {
            Spawn_Block();
        }
        else
        {
            // 게임 오버
            Debug.Log("GameOver");
            UpdateScore();
        }
    }
    
    MoveBlock();
    transform.position = Vector3.Lerp(transform.position, desiredPosition, StackMovingSpeed * Time.deltaTime);
}
    
(기존코드)

void UpdateScore()
{
    if(bestScore < stackCount)
    {
		Debug.Log("최고 점수 갱신");
        bestScore = stackCount;
        bestCombo = maxCombo;

        PlayerPrefs.SetInt(BestScoreKey, bestScore);
        PlayerPrefs.SetInt(BestComboKey, bestCombo);
    }
}

 

 

PlayerPrefs가 적절한 경우와 그렇지 않은 경우

사용해도 좋은 경우 ✅ 사용하지 말아야 할 경우 ❌
최고 점수 저장 사용자 로그인 정보
볼륨 설정, 게임 설정 인앱 결제 정보
간단한 튜토리얼 여부 대용량 데이터

PlayerPrefs는 간단하고 빠르지만 안전하지 않고 용량 제한이 있다. 고급 저장이 필요할 경우 JSON 파일, SQLite, 혹은 ScriptableObject 등을 고려해야 한다.

💡 느낀 점

layerPrefs는 처음에 공부했을 땐 그냥 “데이터 저장하는 기능” 정도로만 이해했는데, 오늘 직접 최고 점수 저장 기능을 구현하고 추가 학습하면서 구조와 사용법을 확실히 익힐 수 있었다. 특히 Set, Get, Save의 흐름이 명확해서 다시 사용할 때도 복잡하지 않을 것 같다.

다만 항상 보안 이슈가 있을 수 있다는 점과, 에디터 테스트할 때는 Save() 호출이 필요하다는 점을 기억해야겠다. 앞으로는 설정 값 저장이나 플레이어 진척도 저장 등에도 확장해서 적용해볼 계획이다.

 

 

 

최근댓글

최근글

skin by © 2024 ttuttak