유니티에서는 데이터를 보관하는 기능을 제공한다.
데이터 보관 개념
- 데이터를 보관하는 방법: 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초가 정상적으로 들어가는 것을 확인할 수 있다.
'GameDevelop > Unity기초쌓기' 카테고리의 다른 글
[Unity] 화면밖 네모들 Destroy (0) | 2025.04.06 |
---|---|
[Unity] 풍선 터지는 애니메이션 추가 (0) | 2025.04.06 |
[Unity] 게임종료 로직 (0) | 2025.04.06 |
[Unity] 게임 종료 판넬 만들기 (1) | 2025.04.06 |
[Unity] 시간 구현하기 (0) | 2025.04.06 |