PlayerPrefs를 이용해서 간단한 유저 데이터 관리하기

Tom·2024년 9월 10일
0
post-custom-banner

어떤 프로그램을 만들던 유저 데이터를 보관하는 것은 중요하다. 특히 게임이라면 두말 할 필요도 없겠다. 게임이 꺼지면 벌어놓은 골드나 획득한 아이템이 다 사라지는 게임을 대체 누가해?
유저 데이터는 여러 방법을 통해 저장할 수 있다. 일반적으로 프로젝트와 연결된 DB에서 필요에 따라 필요한 데이터를 불러오면 된다. 데이터나 데이터 구조체를 DB에 알맞은 형식으로 파싱해서 저장하고 불러오는 방식. 그런데 나같은 초보자에게 DB에 연결하고 불러오는 코드를 작성하는 일이 여간 귀찮고 어려운 일이지 않을 수 없다. 그래서 유니티는 간단한 데이터를 단 몇 줄의 코드를 통해 키-밸류 형식으로 저장이 가능한 PlayerPrefs 시스템을 제공한다. 물론 작은 크기의 데이터에만 적합하고 대량의 데이터를 처리하기 어렵다는 문제가 있지만, 간단한 저장이라면 문제없다고!

PlayerPrefs

PlayerPrefs에서 기본적으로 제공하는 메서드는 다음과 같다.

public class SaveTest
{
    public void Save()
    {
        // 각 형식의 데이터를 키 - 밸류 형식으로 저장한다.
        PlayerPrefs.SetString("stringKey", "stringValue");
        PlayerPrefs.SetFloat("floatKey", 0.25f);
        PlayerPrefs.SetInt("intKey", 1);
        
        //저장하기
        PlayerPrefs.Save();
    }

    public void Load()
    {
        // 키값에 들어있는 데이터를 불러온다.
        string stringValue = PlayerPrefs.GetString("stringKey");
        float floatValue = PlayerPrefs.GetFloat("floatKey");
        int intValue = PlayerPrefs.GetInt("intKey");
    }
}

유니티에서 로그로 찍어보면 대충 이렇게 됨.

로컬 저장소에 데이터를 저장하기 때문에 프로그램이 종료되어도 저장된 값은 지워지지 않는다. 다만 일부 플랫폼에선 데이터가 영구적으로 저장되지 않고 꺼지거나 종료될 때 초기화 될 가능성이 있으므로 PlayerPrefs.Save() 메서드를 사용해서 명시적으로 저장해주는 것이 좋다고 한다.
이런 특징이 있는 PlayerPrefs를 이용해서 유저의 데이터를 저장해보자@

유저 데이터 저장하기

public interface IUserData
{
	public void SetDefaultData();
    public bool LoadData();
    public bool SaveData();
}

데이터들을 저장할 때 공통적으로 사용할 인터페이스를 먼저 구현했다. SetDefaultData는 데이터를 기본값을 초기화하는 메서드, 나머지는 리턴값 bool을 사용하는 메서드로 구현해 세이브와 로드의 성공 여부를 판별할 수 있도록 했다.

public class UserSettingData : IUserData
{
    public bool sound { get; set; }

    public void SetDefaultData()
    {
        sound = true; // 기본값은 트루
    }

    public bool LoadData()
    {
      try
      {
          sound = PlayerPrefs.GetInt("Sound", 1) == 1; // 1이면 트루, 아니면 false로 받아오기
          return true;
      }
      catch (System.Exception e)
      {
          UnityEngine.Debug.Log(e.Message); // 에러 로그 찍기
          return false;
      }
    }

    public bool SaveData()
    {
        try
        {
            PlayerPrefs.SetInt("Sound", sound ? 1 : 0); //사운드가 true면 1, 아니면 0 저장
            PlayerPrefs.Save();
            return true;
        }
        catch (System.Exception e)
        {
            UnityEngine.Debug.Log(e.Message);
            return false;
        }
    }
}

사운드 세팅을 저장할 수 있게 되었다. 외부에서 변수 soundtrue / false 값을 적절히 변경해준 뒤 SaveData()를 하게 되면 현재 저장된 값에 따라 PlayerPrefs의 Key "Sound"의 값이 1 혹은 0으로 저장되고, LoadData()를 하게 되면 현재 저장소에 저장된 "Sound"의 값에 따라 변수 sound의 값을 true / false로 적절히 변환해준다. try / catch문을 사용해 어느 시점에서 오류가 났는지 명확하게 판단할 수 있게 되는것은 덤.

이런식으로 여러 유저 데이터를 생성해냈다면, 나중에 외부에서 List<iUserData>iUserData[]를 통해 일괄적으로 불러오기, 저장하기, 기본값으로 설정하기를 해줄 수 있다.

public class UserDataManager
{
	private List<iUserData> userDatas = new List<iUserData>();
    
    private void Init()
    {
    	// 위에서 만든 세팅데이터를 초기화 단계에서 리스트에 담아놓는다.
    	userDatas.Add(new UserSettingData());
        // ~~ 이후에도 생기는 데이터 형식들을 리스트에 담아놓으면 됨.
	}
    
    public void SetAllDataDefault()
    {
    	// 순회문을 돌며 모든 데이터를 기본값으로 설정해준다.
    	foreach (var userData in userDatas)
        {
        	userData.SetDefaultData();
        }
	}
}

로드나 세이브도 같은 방식으로 하면 훨씬 간편한 방식으로 다량에 데이터를 핸들링할 수 있겠다.

profile
여기 글은 보통 틀린 경우가 많음
post-custom-banner

0개의 댓글