유니티에서 데이터를 저장하는 방식에는 크게 두 가지가 있습니다.
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
'유니티 > 공통' 카테고리의 다른 글
유니티 - Resources를 활용해 에셋을 로드해보자 (0) | 2024.10.18 |
---|---|
유니티 - InputSystem에 대해 알아보자#2(내용 보충) (2) | 2024.10.17 |
유니티 - InputSystem에 대해 알아보자#1(기본) (0) | 2024.10.15 |
유니티 - JSON을 이용하여 데이터를 저장해보자. #2 응용 - 구글 스프레드 시트 활용 (feat. 구글 앱스 스크립트) (2) | 2024.10.05 |
유니티 - JSON을 이용하여 데이터를 저장해보자. #1 저장과 암호화 (0) | 2024.10.01 |