서론
게임을 제작하다보면 저장해야할 것이 많은 데, 유니티에서 사용되는 방법으로, 파일(Json) 저장, 직렬화, 서버 등 여러 방법이 있지만, 유니티에서 제공하는 PlayerPrefs으로 쉽게 저장하는 방법을 알아보자. 예시로 이전 사운드 조절한 값을 저장해보자.
PlayerPrefs
PlayerPrefs는 유니티 게임에서 간단한 플레이어 데이터를 저장하고 관리하기 위한 기능을 제공하는 클래스이다. 주로 게임 설정, 랭킹, 사용자 프로필과 같이 작은 규모의 데이터를 저장하고 불러오는 데 사용된다. 데이터는 "키-값" 쌍으로 저장되며, 데이터를 휘발성으로 유지하기 때문에 게임을 종료하거나 다시 시작해도 데이터가 유지된다. 다만, 기기나 사용자 간 데이터 공유는 제한적이다.
// 데이터 저장
PlayerPrefs.SetInt("Score", 100);
PlayerPrefs.SetString("PlayerName", "John");
PlayerPrefs.Save(); // 변경사항 저장 (일반적으로 자동 저장되지만 명시적으로 호출 가능)
// 데이터 불러오기
int score = PlayerPrefs.GetInt("Score");
string playerName = PlayerPrefs.GetString("PlayerName");
// 데이터 삭제
PlayerPrefs.DeleteKey("Score"); // 특정 키의 데이터 삭제
PlayerPrefs.DeleteAll(); // 모든 데이터 삭제
위와 같이 PlayerPrefs는 간단한 게임 데이터를 저장하고 불러오는 데 편리한 방법이지만, 보안, 용량, 플랫폼 호환성 등의 제한 사항을 고려해야 다. 데이터의 종류와 요구 사항에 따라 다른 저장 방법을 고려하는 것이 중요하다.
장점
- 간단한 사용: PlayerPrefs는 사용하기 매우 간단하며, 몇 줄의 코드로 데이터를 저장하고 불러올 수 있다.
- 휘발성 데이터: 게임을 종료하거나 다시 시작해도 데이터가 유지되기 때문에 세션 기반 정보를 저장하기에 유용하다.
- 빠른 속도: PlayerPrefs는 내부적으로 효율적으로 데이터를 저장하므로 작은 규모의 데이터에 대해 빠른 속도를 제공한다.
- 유니티 엔진 통합: PlayerPrefs는 유니티 엔진에 내장되어 있어 추가적인 설정 없이 바로 사용할 수 있다.
단점
- 보안: PlayerPrefs에 저장된 데이터는 기본적으로 평문으로 저장되기 때문에 민감한 정보를 저장하는 데 적합하지 않다. 해킹 등의 위험이 있을 수 있다.
- 용량 제한: PlayerPrefs의 저장 용량은 제한적이기 때문에 대량의 데이터를 저장하거나 게임 상태를 복잡하게 관리하기에는 부적합할 수 있다.
- 플랫폼 간 호환성: 모든 플랫폼에서 동일한 방식으로 동작하지 않을 수 있다. 일부 플랫폼에서는 PlayerPrefs를 지원하지 않을 수도 있다.
- 데이터 공유 제한: PlayerPrefs는 기기나 사용자 간 데이터 공유가 제한적이다. 다른 기기나 사용자 간에 데이터를 동기화하기 어려울 수 있다.
- 성능 문제: 저장된 데이터가 많을수록 PlayerPrefs의 성능이 저하될 수 있습니다. 큰 규모의 데이터를 다루는 데는 적합하지 않다.
옵션 값 저장
"슬라이드 바로 사운드 조절하기"의 코드를 이용하여, 옵션의 사운드 크기 조절한 것을 저장해보자. SoundManager의 LoadSettings에서 처음 게임 시작 시 디폴트 값으로 1로 설정하여 임시로 저장해두고, OptionController의 Start함수에서 매번 값을 가져온다. OptionController의 모든 변화하고 저장이 필요한 값에 SaveSettings함수를 넣어 값이 변할 때마다 저장한다.
using UnityEngine;
public class SoundManager : MonoBehaviour
{
...
#region 저장
// 설정 값 불러오기
private void LoadSettings()
{
// BGM 볼륨 로드
BgmVolume = PlayerPrefs.GetFloat("SoundManager_MasterVolume", 1.0f);
// BGM 볼륨 로드
BgmVolume = PlayerPrefs.GetFloat("SoundManager_BgmVolume", 1.0f);
// 사운드 이펙트 볼륨 로드
SoundEffectVolume = PlayerPrefs.GetFloat("SoundManager_SoundEffectVolume", 1.0f);
}
// 설정 값 저장하기
public void SaveSettings()
{
// BGM 볼륨 저장
PlayerPrefs.SetFloat("SoundManager_MasterVolume", MasterVolume);
// BGM 볼륨 저장
PlayerPrefs.SetFloat("SoundManager_BgmVolume", BgmVolume);
// 사운드 이펙트 볼륨 저장
PlayerPrefs.SetFloat("SoundManager_SoundEffectVolume", SoundEffectVolume);
// PlayerPrefs 데이터를 디스크에 저장
PlayerPrefs.Save();
}
#endregion
...
}
using UnityEngine;
...
public class OptionController : MonoBehaviour
{
...
private SoundManager _soundManager;
...
private void Start()
{
_soundManager = SoundManager.instance;
LoadSettings();
...
}
// 볼륨 크기 가져오기
private void LoadSettings()
{
// 마스터 볼륨 로드
float masterVolum = _soundManager.MasterVolume;
_masterVolumSlider.value = masterVolum;
// BGM 볼륨 로드
float bgmVolume = _soundManager.BgmVolume;
_bgmSlider.value = bgmVolume;
// 사운드 이펙트 볼륨 로드
float soundEffectVolume = _soundManager.SoundEffectVolume;
_soundEffectSlider.value = soundEffectVolume;
}
#region 사운드
// 마스터 볼륨 변경
private void OnMasterVolumeChanged(float value)
{
_soundManager.MasterVolume = value;
_soundManager.SaveSettings();
}
// BGM 볼륨 변경
private void OnBgmVolumeChanged(float value)
{
_soundManager.BgmVolume = value;
_soundManager.SaveSettings();
}
// 사운드 이팩트 변경
private void OnSoundEffectVolumeChanged(float value)
{
_soundManager.SoundEffectVolume = value;
_soundManager.SaveSettings();
}
#endregion
...
}
위와 같은 예시 외에도 토글, 드롭다운 등을 통해 언어, 창모드 등 여러 옵션 기능들을 저장할 수 있다.
주섬주섬
활용도 어렵지 않고, 옵션은 간단한 게임에서 필수적이기 때문에 간단한 프로젝트를 만드는 데 위 내용을 알면 편하고 좋은 게임을 만드는 데 도움이 될 기능이다.
참고
'Unity > 사운드' 카테고리의 다른 글
슬라이드 바로 사운드 조절하기 (0) | 2023.06.01 |
---|---|
Audio Source 설정 (0) | 2023.05.30 |
댓글