유니티 Dictionary를 활용한 저장기능 정리

2021. 11. 10. 15:27개발/유니티

sqlite를 이용해서 게임 데이터를 저장하거나 불러올 수 있지만,

간단하게 dictionary기능을 사용해 데이터를 관리할 수도 있다.

 

public class GameDataManager : MonoBehaviour {
    
    //게임에서 사용할 데이터 클래스
    [Serializable()]
    public class GameData
    {
        public int seq;
        public string name;
        public int hp;
        public int mp;
        public int stat;
    }
    
    //저장용 데이터를 Dictionary로 선언
    public Dictionary<long, GameData> gameDataSave;
    
    //메모리에 올려놓을 데이터를 List로 선언
    public List<GameData> gameDataLoad;
    
    private void Start()
    {
        //Dictionary에 메모리를 할당해준다.
        gameDataSave = new Dictionary<long, GameData>();
        //게임에서 사용할 데이터의 메모리를 할당해준다.
        gameDataLoad = new List<GameData>();
    }
    
    //Dictionary에서 실제 사용할 메모리 영역으로 불러온다.
    private void SelectData()
    {
        //데이터를 원하는 형태로 정렬한다.
        //(현재 기준은 seq이며 descending은 큰 수부터, ascending은 작은 수부터 정렬한다)
        IOrderedEnumerable<KeyValuePair<long, gameDataSave>> items;
        items = from pair in gameDataSave orderby pair.Value.seq descending select pair;
        
        gameDataLoad.Clear();
        
        //데이터를 파싱해서 사용하자.
        foreach (var data in items)
        {
            GameData gd = new GameData();
            gd.seq = data.Value.seq;
            gd.name = data.Value.name;
            gd.hp = data.Value.hp;
            gd.mp = data.Value.mp;
            gd.stat = data.Value.stat;
            gameDataLoad.Add(gd);
        }
    }
    
    //게임 데이터를 저장한다.
    private void SaveData()
    {
        var binaryFormatter = new BinaryFormatter();
        var memoryStream = new MemoryStream();

        binaryFormatter.Serialize(memoryStream, gameDataSave);

        PlayerPrefs.SetString("gameDataSave", Convert.ToBase64String(memoryStream.GetBuffer())); 
    }
    
    //게임 데이터를 불러온다.
    private void LoadData()
    {
        var data = PlayerPrefs.GetString("gameDataSave");

        if (!string.IsNullOrEmpty(data))
        {
            var binaryFormatter = new BinaryFormatter();
            var memoryStream = new MemoryStream(Convert.FromBase64String(data));

            gameDataSave = (Dictionary<long,GameData>)binaryFormatter.Deserialize(memoryStream);
        }
    }
}

 

 

PlayerPrefs의 저장 기능을 활용한다.

다만 보안적인 부분은 생각한다면 여러 암호화 알고리즘을 적용해야한다.

물론 서버를 이용한다면 해결되지만 그럴거면 이런 코드를 쓸 필요도 없다.

 

장점은 매우 간단하게 데이터를 관리할 수 있다.

sqlite를 적용하느라 시간을 낭비할 필요도 없고, 데이터 수정도 C#에서 관리하기때문에 빠르게 적용할 수 있다.

유니티 자체 기능을 활용하기때문에 안드로이드나 iOS에 별도로 컨버팅할 필요도 없다.

또한 sql처럼 정렬기능도 있어서 리스트관리하기 편한 기분이 든다.

 

단점은 보안이 중요하면 사용할 일이 없고, 데이터가 너무 많으면 감당이 안된다.