본문 바로가기

취미로 하는 게임코딩_gameCodingAsHobby/유니티unity로 게임 만들기

유니티49_게임 제작 과정 18_저장_PlayerPrefs

데이터 저장

 

이번에는 앞에서 만든 점수(Score)를 저장하는 방법을 알아본다.

여기서 구현해야 하는 내용은 게임에서 최고 점수를 디스크에 파일로 저장(save)하고 게임 종료 후 다시 게임을 시작하면 저장한 파일을 불러오는(load) 기능이다.

 

PlayerPrefs

 

유니티에서 게임의 데이터를 저장하는 방법 중 가장 간단한 방법은 유니티에서 제공하는 데이터 관리 클래스인 PlayerPrefs 를 이용하는 것이다.

 

PlayerPrefs 클래스는 간단한 값을 저장할 때 사용할 수 있다.

저장하고 불러올 수 있는 변수값은 int, float, string 타입의 변수이다.

 

PlayerPrefs는 데이터를 preference에 저장한다.

윈도우즈의 경우 registry(레지스트리)의 HKCU\Software\[company name]\[product name]에 저장한다.

 

레지스트리에 저장되며 저장할 수 있는 크기는 1MB(메가바이트)로 제한된다.

레지스트리는 운영체제의 설정과 관련된 부분을 저장하고 있는 데이터베이스(DB)이다.

유니티의 PlayerPrefs는 이 레지스트리에 약간의 공간을 빌려 저장하는 기능이다.

 

그러므로 레지스트리는 되도록이면 쓰레기(쓸데 없는 데이터)가 쌓이지 않도록 하는 것이 좋고, 덩치가 큰 게임의 경우 저장할 데이터 양이 많으면 PlayerPrefs를 사용할 수 없으므로 PlayerPrefs를 사용하더라도 테스트 등의 임시 저장용으로만 사용하고 사용 후에는 모두 지워버리는 것이 좋을 듯 하다.

 

그래서 여기서는 PlayerPrefs를 사용하지 않고 다음 글에서 객체를 만들어 파일로 저장하는 방법을 선택한다.

그러나 PlayerPrefs를 사용해서 점수와 최고점수가 제대로 작동하는지 테스트해 보면서 어떻게 사용하는지 정도만 확인해 본다.

 

 

먼저 GameManager 스크립트에서 14~25번 줄을 추가한다.

점수를 넣을 score변수와 점수에 글자를 넣는데 사용하는 텍스트 오브젝트 TextScore는 이미 만들었었다.

 

15번 줄에 최고 점수라는 글자를 넣는데 사용할 텍스트 오브젝트를 선언한다.

17번 줄에 PlayerPrefs에서 사용할 키 이름(KeyName)과 최고 점수를 저장할 변수를 만들고 0으로 초기화 한다.

PlayerPrefs는 키(Key)를 이용해서 데이터를 저장하고 불러온다.

 

20번 줄에서 Awake()메서드를 작성한다.

Awake메서드는 프로젝트(게임)가 실행되기 직전에 딱 한번 호출된다.

Start메서드 보다 앞서 실행된다.

게임을 초기화 하기 위해 사용된다.

이 메서드 안에 PlayerPrefs로 저장되어 있는 최고점수를 불러와서 보여주는 코드를 작성한다.

게임을 실행하면 제일 먼저 현재 최고 점수가 얼마인지 알게 된다.

 

22번 줄에서 bestScore(최고점수)라는 변수에 GetInt()메서드로 key를 전달해서 저장되어 있는 값을 가져온다.

뒤에 0은 key 값이 없을 때 기본값으로 사용할 값이다.

즉, 만약 key값이 없으면 0으로 한다는 뜻이다.

 

key값을 전달해서 어떤 값을 불러올 때 int타입이면 GetInt(), float타입은 GetFlout(), string타입이면 GetString()메서드를 사용한다.

 

23번 줄에 가져온 bestScore값을 문자열 타입으로 바꿔서 BestScoreText의 text속성에 나타낼 문자열을 저장한다.

 

 

EnemyDies()메서드에 주석 '추가'부터 '추가 끝'까지 if 조건문을 작성한다.

만약 score값이 bestScore값 보다 크면(즉, 최고 점수보다 높으면)

PlayerPrefs의 SetInt()메서드로 KeyName으로 score값을 저장하라는 뜻이다.

 

key값을 전달해서 어떤 값을 저장할 때 int타입이면 SetInt(), float타입은 SetFlout(), string타입이면 SetString()메서드를 사용한다.

 

코드 작성은 끝났다.

 

유니티에서 GameManager오브젝트의 Inspector에서 추가된 필드의 오브젝트를 지정해준다.

 

게임을 실행한 후 점수를 올린다.

게임을 종료하고 다시 시작하면 Best Score에 최고 점수가 나타나는 것을 확인할 수 있다.

 

확인했으면 key와 값들이 저장되어 있는 preference를 삭제하자.

Awake()메서드에 22번 줄 처럼 'key와 값들을 모두 삭제'하는 DeleteAll()메서드를 추가한다.

스크립트를 저장 후 유니티를 다시 실행하면 제거된다.

 

그리고 PlayerPrefs 테스트를 위해 추가했던 코드를 지우거나 주석으로 바꾸어 원래대로 복구하자.

 

다음 글에서는 저장할 내용을 객체로 만들어 파일로 저장하는 방법을 알아본다.

 

끝.

Wraven...