빠른 흐름
PlayerPrefs.SetFloat("music_volume", 0.8f);
float volume = PlayerPrefs.GetFloat("music_volume", 1f);
PlayerPrefs.Save();기본 흐름
PlayerPrefs의 역할과 적합한 용도
PlayerPrefs는 작은 설정값을 저장하고 다시 불러올 때 가장 손쉬운 내장 저장 방식입니다. 정수, 실수, 문자열만 직접 저장할 수 있어서 볼륨, 난이도, 마지막 해금 여부 같은 간단한 값에 잘 맞습니다. 별도 파일이나 직렬화 코드 없이 키-값 한 줄로 저장과 불러오기가 되기 때문에 프로토타입이나 설정 화면에서 빠르게 쓰기 좋습니다.
기본값과 Save 호출
GetInt, GetFloat, GetString에 두 번째 인자로 기본값을 함께 주면 저장된 값이 없을 때도 안전하게 처리할 수 있습니다. PlayerPrefs.Save()는 수정된 값을 디스크에 기록하도록 강제합니다. Unity는 기본적으로 종료 시점에 저장하지만, 강제 종료나 크래시 전에 보존해야 하는 값은 체크포인트에서 직접 Save()를 호출하는 편이 안전합니다. 다만 디스크 기록 비용 때문에 실제 게임플레이 중 자주 호출하는 패턴은 피하는 편이 좋습니다.
[SerializeField] private AudioSource bgm;
private void Start()
{
float volume = PlayerPrefs.GetFloat("bgm_volume", 0.5f);
bgm.volume = volume;
}
public void SaveVolume(float value)
{
PlayerPrefs.SetFloat("bgm_volume", value);
PlayerPrefs.Save();
}한계와 대안
복잡한 세이브 파일 구조나 보안이 중요한 데이터에는 PlayerPrefs만으로는 한계가 있습니다. 인벤토리, 대규모 게임 진행 상태, 민감한 수치처럼 구조가 복잡해지는 데이터는 JSON 직렬화나 별도 파일 저장 방식을 고려해야 합니다. PlayerPrefs 값은 일반 텍스트에 가깝게 저장되므로 치팅 방지가 필요한 경우에도 적합하지 않습니다.
체크포인트
| 상황 | 적합한 선택 |
|---|---|
| 볼륨, 난이도 같은 단순 설정값 | PlayerPrefs.SetFloat/SetInt/SetString |
| 저장된 값이 없을 때 기본값 사용 | GetFloat("key", defaultValue) |
| 체크포인트 저장을 강제로 반영해야 함 | PlayerPrefs.Save() 명시 호출 |
| 인벤토리, 대규모 세이브 데이터 | JSON 직렬화 + 파일 저장 |
| 치팅 방지가 필요한 민감한 수치 | 암호화 파일 저장 |
| 비교 | 더 잘 맞는 쪽 | 이유 |
|---|---|---|
| 단순 설정값 vs 구조화된 세이브 데이터 | PlayerPrefs / JSON 파일 | 저장 형식과 마이그레이션 난이도가 다름 |
| 가벼운 사용자 편의값 vs 민감한 진행 데이터 | PlayerPrefs / 별도 저장소 | 노출성과 변조 위험이 다름 |
| 값 하나 저장 vs 저장 슬롯 관리 | PlayerPrefs / 파일 기반 세이브 | 슬롯, 버전, 백업 정책이 달라짐 |
주의할 점
PlayerPrefs는 인코딩 없이 저장되므로 민감한 값이나 구조가 복잡한 데이터에는 사용하지 마세요.
// ❌ 복잡한 데이터를 PlayerPrefs에 억지로 구겨 넣기
PlayerPrefs.SetString("inventory", "sword,100,shield,200,potion,50");
// 파싱 복잡, 구조 변경 시 레거시 처리 어려움
// ❌ 크래시 대비 없이 중요한 진행 상태 저장
PlayerPrefs.SetInt("boss_cleared", 1);
// Save() 없이 종료 → 강제 종료 시 저장 안 될 수 있음
// ✅ 단순 설정값만 PlayerPrefs 사용
PlayerPrefs.SetFloat("bgm_volume", 0.8f);
PlayerPrefs.Save(); // 중요한 값은 명시적 Save 호출
// ✅ 구조가 있는 데이터는 JSON + 파일 저장
string json = JsonUtility.ToJson(saveData);
File.WriteAllText(savePath, json);
// ❌ 키 이름을 코드 여기저기서 문자열로 직접 사용
PlayerPrefs.SetFloat("music", 0.8f);
PlayerPrefs.GetFloat("bgm_volume", 1f);
// → 키 불일치 버그를 찾기 어려움참고 링크
1 sources