1. PlayerPrefs
프로그램의 개발에 있어서, 데이터는 가장 중요한 요소이다. 데이터는 지속적으로 저장되어, 캐릭터의 레벨과 같은 상태, 획득한 아이템 등은 영구적인 보관이 요구된다.
온라인 게임의 경우 대부분의 데이터는 서버에 저장된다. 이는 위조, 변조를 방지하는데 유리하며, 관리하기에 용이하다. 하지만 모든 데이터를 서버에 저장하는 것은, 지속적으로 클라이언트와 서버 간의 통신이 발생한다는 것을 의미하며, 이는 서버의 부담을 가중시킨다.
따라서, 중요하지 않은 데이터는 직접 클라이언트에 저장하고 관리한다. 중요하지 않은 데이터로는 음량 조절 값 같은 옵션 설정에 사용되는 데이터들을 예로 들 수 있다.
유니티는 데이터를 저장하기 위한 ScriptableObject, PlayerPrefs, Json과 같은 다양한 방법들을 제공한다.
ScriptableObject 및 Json은 카테고리 중급에서 다룬다.
본 글에서는 PlayerPrefs에 대하여 설명한다.
PlayerPrefs은 <Key Value>로 데이터를 저장하는 클래스이다.
PlayerPrefs은 int, float, string 타입의 데이터를 저장한다.
Key값은 string이며, Key는 Value를 찾기 위한 식별자를 의미한다.
2. PlayerPrefs 제공 함수
PlayerPrefs은 데이터를 메모리 상에 저장하고, 이를 하드 드라이브에 저장한다. 메모리 상의 저장은 임시적인 저장으로, 갑작스러운 프로그램의 정지와 같은 문제가 발생하였을 때, 저장이 이루어지지 않는 경우가 생길 수 있다. PlayerPrefs의 Save() 함수는 메모리 상에 저장된 데이터를 하드 드라이브에 저장한다.
DeleteAll() : 모든 데이터를 삭제한다. 이 함수를 사용할 경우 경고 메시지가 출력된다.
DeleteKey(String Key) : Key와 대응하는 값을 삭제한다.
HasKey(String Key) : Key가 존재하는지 확인한다.
Save() : 수정된 모든 preferences를 파일에 저장한다.
PlayerPrefs은 int, float, string 타입의 데이터를 저장하도록 Set 함수를 제공한다.
SetInt(string Key, int value) : Key 값으로 int 형 데이터를 저장한다.
SetFloat(string Key, float value) : Key 값으로 float 형 데이터를 저장한다.
SetString(string Key, string value) : Key 값으로 string 형 데이터를 저장한다.
PlayerPrefs은 int, float, string 타입의 저장된 데이터를 불러오도록 Get 함수를 제공한다.
GetInt(string Key) : Key 값으로 저장된 int 형 데이터를 불러온다.
GetFloat(string Key) : Key 값으로 저장된 float 형 데이터를 불러온다.
GetString(string Key) : Key 값으로 저장된 string 형 데이터를 불러온다.
3. PlayerPrefs 저장 위치
Playerprefs은 데이터를 Window에서는 Registery에 저장한다.
Window -> 실행 -> regedit
HKEY_CURRENT_USER/Software/Unity/UnityEditor/CompanyName/projectName
안드로이드는 안드로이드 api에서 제공하는 SharerPreferences에 저장한다.
※추가적인 사항은 유니티 문서 PlayerPrefs를 참조.
4. PlayerPrefs 예제
간단한 UI를 구성한다.
Slider와 Text로 이루어진 옵션 UI 예제이다.
슬라이더에 리스너를 등록하고, 슬라이더의 값이 변경되면, 값을 PlayerPrefs을 사용해 저장한다.
Awake() 함수에서는 해당 키 값으로 저장된 데이터가 있는지 확인하기 위해 HasKey() 함수를 사용한다. 처음 실행 시에는 키 값이 없기 때문에 이에 대한 처리를 한다.
슬라이더의 값은 float을 사용하였기 때문에, SetFloat() 함수를 사용하여 데이터를 저장한다.
ToString("F")는 "F" 형식 지정자로, 소수점 2자리까지 Text에 출력한다.
using UnityEngine;
using UnityEngine.UI;
public class PlayerPrefsExample : MonoBehaviour
{
public Slider slider;
public Text textValue;
private void Awake()
{
if (PlayerPrefs.HasKey("Volume"))
{
slider.value = PlayerPrefs.GetFloat("Volume");
}
else
{
slider.value = 0.5f;
}
textValue.text = slider.value.ToString("F");
}
// Start is called before the first frame update
void Start()
{
slider.onValueChanged.AddListener(OnValueChanged);
}
// Update is called once per frame
void Update()
{
}
public void OnValueChanged(float _value)
{
textValue.text = _value.ToString("F");
// Save
PlayerPrefs.SetFloat("Volume", _value);
}
}
참조
Unity dacuments
docs.unity3d.com/kr/530/ScriptReference/PlayerPrefs.html
PlayerPrefs.Save()
answers.unity.com/questions/753649/is-playerprefssave-necessary-my-game-saves-without.html
'유니티 > 기초' 카테고리의 다른 글
유니티 Invoke (0) | 2020.12.01 |
---|---|
유니티 코루틴(Coroutine) 과 IEnumerator (0) | 2020.11.30 |
유니티 파티클 시스템(Particle System) - 활용 (0) | 2020.11.28 |
유니티 파티클 시스템 (Particle System)- 속성 (1) | 2020.11.27 |
유니티 애니메이션(Animation) (0) | 2020.11.26 |