게임개발/스터디

[스터디] 데이터 로드 & 저장 방법 (Json형식 사용)

감물 2024. 4. 9. 12:29

개발하는 것은 재미가 있는데 블로그 작성하는 것은 쉽지가 않다 ㅠㅠ 우선순위를 개발을 먼저 두게 되고 자꾸만 미루게 된다 (앉는 자세부터 흐트러진다.. ) 하지만 오늘부터 하루에 하나씩 혹은 이틀에 하나씩은 꼭 내용 꽉꽉 채워서 작성해보려고 한다!! (습관들이기)

 

유니티에는 여러가지 저장 방법이 있다. 간편하게 자주 사용하는 방법인 PlayPrefs가 있는데 이는 데이터를 하드에 저장하기 때문에 변조의 위험이 있어 출시하여 수익을 얻으려고 하는 게임에는 사용하기가 쉽지 않다. 

 

데이터의 변조를 막고 저장하기 위해서는 서버에 데이터를 저장해야 하는데 이 때 서버에서는 데이터를 Json형식으로 가지고 있다. 따라서 이번에는 유니티에서 저장할 데이터들을 어떻게 가공해서 Json형식으로 변환하는지 그 방법을 작성하고자 한다.

 

Json형식은 데이터들을 직렬화 하여 저장하는 방법이다. 그럼 게임에 쓰이는 데이터들도 참 여러가지 종류가 많은데 어떤 데이터들을 한데 묶어서 저장하는 것이 좋을까? 먼저 같은 종류의 재료, 장비 등 속성이 비슷한 재료끼리 묶어서 데이터를 가공해야 한다. 이는 게임 데이터 뿐만 아니라 일상생활 속에서도 살아갈 때 비슷한 것들 끼리 묶어서 정리를 해야하는 이치와 일맥상통한다. 같은 것들끼리 묶어야 보기가 편하다. 

 

또한 유저가 보이는 그 장면 하나를 통째로 하나로 묶어서 데이터 하나로 치는 것이 편하다(그 하나를 제이슨 파일 하나로)

 

그러면 코드로 들어가서 어떻게 구현해야 할지 한번 알아보자!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
using Newtonsoft.Json;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
 
public class GameData
{
    public int Gold;
    public int Dia;
    public int Core;
}
 
public class DataManager: MonoBehaviour
{
    public GameData _gameData = new GameData();
 
    private void Awake()
    {
        _path = Application.persistentDataPath + "/SaveData.json";
    }
 
    string _path;
    public void SaveGame()
    {
        // 클래스 데이터를 string값으로 직렬화하여 저장
        string jsonStr = JsonConvert.SerializeObject(_gameData);
        File.WriteAllText(_path, jsonStr);
    }
 
    public bool LoadGame()
    {
        string fileStr = File.ReadAllText(_path);
        // 직렬화된 데이터를 역직렬화하여 클래스에 저장
        GameData data = JsonConvert.DeserializeObject<GameData>(fileStr);
        if (data != null)
            _gameData = data;
 
        return true;
    }
}
 
cs

 

간단하게 재화를 저장하는 데이터셋을 만들고 직렬화하여 Json 형식으로 저장해 보았다.

 

이런식으로 개별적으로 데이터 단위를 만들어서 클래스로 변형 후 저장을 해도 되고 Json형식이 트리구조이기 때문에

비슷한 것들끼리 Key값으로 묶고 하위에 또 비슷한 것들끼리 묶어서 트리 형식으로 데이터를 만들어서 저장할 수도 있다.

이렇게 하려면 클래스 안에 클래스를 저장하는 이중구조가 될 것이다.