Quick Reference
PlayerPrefs는 앱 실행 사이에 남는 platform-local key-value store입니다. 직접 저장하는 타입은 int, float, string뿐이며, Unity는 이를 암호화하지 않습니다. volume·language·튜토리얼 표시 여부처럼 작은 사용자 preference에는 좋지만, 신뢰해야 하는 game progress·비밀·구조화된 save에는 맞지 않습니다.
| 작업 | API | 값이 없거나 실패할 때 | 주의 |
|---|---|---|---|
| int 저장/읽기 | SetInt / GetInt(key, default) | default 사용 | key typo가 다른 값처럼 보일 수 있음 |
| float 저장/읽기 | SetFloat / GetFloat(key, default) | default 사용 | slider 변경마다 Save하지 않음 |
| string 저장/읽기 | SetString / GetString(key, default) | default 사용 | JSON 문자열을 넣어도 schema·보안 한계는 그대로 |
| 키 존재 확인 | HasKey | 없음이면 false | default 값과 "미설정"을 구분할 때만 필요 |
| 변경 flush | Save | storage write 수행 | 중요한 경계에서만 호출 |
private const string MusicVolumeKey = "settings.musicVolume.v1";
float volume = PlayerPrefs.GetFloat(MusicVolumeKey, 0.8f);
PlayerPrefs.SetFloat(MusicVolumeKey, volume);
PlayerPrefs.Save();key와 기본값 설계
key는 데이터 schema의 일부입니다. "music"처럼 모호한 이름 대신 "settings.musicVolume.v1"처럼 domain·의미·필요 시 version을 포함합니다. 같은 key를 여러 class에서 string literal로 복사하지 않고, settings store 또는 static key class에 모읍니다.
GetFloat(key, defaultValue)의 default는 첫 실행과 삭제된 preference의 사용자 경험을 정합니다. default가 0이면 mute인지 "값이 아직 없음"인지 구별하기 어려울 수 있습니다. 값 범위도 load 직후 clamp해 오래된 build·수동 변경·잘못된 key 결과가 audio/UI에 그대로 전달되지 않게 합니다.
public void LoadMusicVolume(AudioSource music)
{
float saved = PlayerPrefs.GetFloat(MusicVolumeKey, 0.8f);
music.volume = Mathf.Clamp01(saved);
}Save 시점과 플랫폼 경계
Set...은 in-memory preference를 바꾸고, Save()는 변경된 preference를 platform storage에 기록합니다. UI slider의 value changed callback마다 Save()를 호출하면 불필요한 sync write가 생길 수 있습니다. options panel을 닫을 때, 적용 button을 눌렀을 때, app pause/quit 정책에서 flush처럼 사용자 의도가 있는 경계에 모읍니다.
PlayerPrefs 저장 위치는 platform과 Company/Product/Bundle Identifier에 따라 다릅니다. local registry/file storage이며 암호화되지 않으므로 사용자가 읽거나 수정할 수 있습니다. 난이도 preference가 바뀌는 것은 허용할 수 있어도, 현금 재화·rank·서버 권한 결과를 PlayerPrefs만으로 신뢰해서는 안 됩니다.
DeleteKey는 한 preference migration을 초기화할 때, DeleteAll은 개발용 reset처럼 범위가 명확할 때만 사용합니다. live build에서 DeleteAll을 settings repair처럼 쓰면 accessibility·language 등 사용자가 설정한 모든 값을 잃습니다.
자주 틀리는 부분
| 증상 | 원인 | 수정 |
|---|---|---|
| 앱을 강제 종료한 뒤 마지막 값이 없음 | 필요한 경계 전에 저장 flush가 없었음 | 변경마다가 아니라 apply/checkpoint 시 Save 정책 적용 |
| 같은 옵션이 build마다 초기화됨 | Company/Product/Bundle Identifier 또는 key version 변경 | identity·key migration 정책 확인 |
| 설정값이 이상한 범위로 로드됨 | default/validation 없음 또는 local data 변조 | load 뒤 clamp·enum validation 적용 |
| PlayerPrefs JSON으로 인벤토리를 저장 | string 하나로 구조·migration·보안 문제가 사라진다고 오해 | versioned file/database schema 사용 |
| score가 쉽게 바뀜 | unencrypted local storage를 신뢰 | 서버 authoritative validation 또는 신뢰 경계 재설계 |
참고 링크
2 sources