유니티/공통

유니티 - PlayerPrefs를 이용하여 데이터를 저장해보자

근본넘치는개발자 2024. 9. 13. 12:30

유니티에서 데이터를 저장하는 방식에는 크게 두 가지가 있습니다.

PlayerPrefs와 JSON을 활용하는 방식인데요,

그 중 오늘은 PlayerPrefs를 이용하여 데이터를 저장하는 방법에 대해 알아보고자 합니다. 

PlayerPrefs 사용법

 

PlayerPrefs는 유니티에서 제공하는 클래스로서,

Key값과 value값으로 정보를 저장합니다.

 

아래는 이를 사용하는 예시입니다.

playerPrefs.SetInt("key", 1); // "key"에 1 저장;
playerPrefs.SetFloat("key1", 2.0f); // "Key1"에 2 저장;
playerPrefs.SetString("key3", "예시"); // "Key3"에 "예시" 저장 

playerPrefs.GetInt("Key"); // "Key"에 저장된 값이 있을 시 불러옴 -> 1 
playerPrefs.GetFloat("Key2"); // "Key1"에 저장된 값이 있을 시 불러옴 -> 2
playerPrefs.GetString("Key3"); // "Key3"에 저장된 값이 있을 시 불러옴 -> "예시"

playerprefs.Save(); // PlayerPrefs 설정 저장

playerPrefs.DeleteAll(); // 모든 Key 전부 삭제
playerPrefs.DeletKey("Key"); // "Key" 삭제, 만약 존재하지 않을 경우 아무 반응 없음.
playerPrefs.HasKey("key"); // "Key"가 존재한다면 True, 존재하지 않는다면 False 반환. 삭제했으니 False 반환

 

Int, Float, String 타입의 데이터를 저장할 수 있고, 불러 올 수 있습니다.

 

Set을 통해 값을 저장하는데 Save가 굳이 왜 있을까

궁금증이 생겨서 찾아보니 다음과 같은 내용을 찾았습니다.

 

Unity는 OnApplicationQuit() 중에 환경 설정을 자동으로 저장합니다.

Universal Windows Platform에서 Unity는 애플리케이션이 일시 중단되는 동안

환경 설정을 작성합니다.

-> 공식 문서 내용

 

충돌이 발생할 경우 Save 없이 Set으로만 저장한 값들의 경우 손실된다고 하니,

사용 시 이를 참고하시면 좋을 것 같습니다.

간단한 활용 

 

public enum Achive { GameScene, Stage1, Stage2, Stage3, Stage4 }
public Achive[] achives;

 void init()
 {
 
     for (int i = 1; i <= MaxStage_level; i++)
     {
         PlayerPrefs.SetInt(achives[i].ToString(), 0);
     }
     PlayerPrefs.Save();
     
 }


public void UnlockState()
 {
     String ahiveName = achives[NowStage_level].ToString();

     Bool isUnLock = PlayerPrefs.GetInt(ahiveName) == 1;

     if (!isUnLock)
     {
         StageLock.SetActive(true);
         StageLev.SetActive(false);
     }
     else
     {
         StageLock.SetActive(false);
         StageLev.SetActive(true);
     }
 }

 

key 값이 1이면 클리어, 0이면 아직 클리어 안 한 것으로 간주해,  

클리어했을 시 스테이지의 잠금을 해제하는 기능을 간단하게 구현해 봤습니다.

 

PlayerPrefs은 어디에 저장될까?

PlayerPrefs의 저장 경로는 다음과 같습니다.

 

Windows에서 PlayerPrefs는 HKCU\Software\[회사 이름]\[제품 이름] 키 아래의

레지스트리에 저장됩니다.

 

여기서 회사 및 제품 이름은 프로젝트 설정에서 설정한 이름입니다.

-> 공식 문서 내용

 

 


레지스트리 편집기를 켠 후 위와 같은 경로를 찾아보면 

확인하실 수 있습니다.

 

 

Edit - Project Setting - Player에 가시면

위 사진과 같이 기본으로 DefalultCompany라고 설정되어 있습니다.

 

Product Name으로 설정되어 있는 폴더를 찾으면 됩니다.

설명을 위해  PlayerPrefsEx라고 넣었습니다.

 

BuildSetting - Player Setting 설정을 눌러 확인 할 수도 있습니다.

 

 

PlayerPrefs, 문제는 없을까?

1)보안 문제

데이터를 로컬 환경에 저장하다 보니 보안 문제에 취약한 상황이 발생하게 됩니다. 

암호화를 진행하더라도 결국 접근이 가능하기에 문제가 발생할 수 있습니다.

 

2)환경 변화 문제

프로그램을 삭제 혹은 환경이 변하는 경우(기기를 바꾼다지 등)

문제가 발생 할 수 있습니다.

 

3) 용량의 제약

웹 플레이어 URL당 하나의 환경 설정 파일이 있으며

파일 크기는 1메가바이트로 제한됩니다.

이 제한을 초과하면 SetInt, SetFloat 및 SetString은 값을 저장하지 않고

PlayerPrefsException을 throw 합니다.

-> 공식 문서 내용

 

 

이러한 이유 등으로 간단한 설정을 할 때나 PlayerPrefs를 사용하고,

그 외 데이터들은 서버와 JSON을 사용하여 처리하는 듯합니다.

 

조만간 JSON에 대해서도 공부해 보고 다뤄보도록 하겠습니다.

 

 

+ 09.21 내용추가 - 팁

PlayerPrefs에 저장된 값을 지우는 방법

해당 유니티 프로젝트 - 좌측 상단 -Edit - clear All PlayerPrefs에서 손쉽게 초기화 가능합니다.

 

 

 

참고한 자료 

 

https://docs.unity3d.com/kr/530/ScriptReference/PlayerPrefs.html

 

UnityEngine.PlayerPrefs - Unity 스크립팅 API

Stores and accesses player preferences between game sessions.

docs.unity3d.com

 

 

https://docs.unity3d.com/ScriptReference/PlayerPrefs.Save.html

 

Unity - Scripting API: PlayerPrefs.Save

Unity saves preferences automatically during OnApplicationQuit(). On the Universal Windows Platform, Unity writes preferences during application suspend. For information on the storage location, see PlayerPrefs. Note: Since writing the PlayerPrefs can caus

docs.unity3d.com

 

 

 

https://youtu.be/QxsH5fE0iAo?si=lf3XQNecFuYa9J44&t=185