본문 바로가기
Unity

[Unity3D] 게임 저장은 Json을 쓰기로...

by Aducssini 2019. 5. 22.

게임 제작하는데 큰 난관중에 하나는 게임 데이터의 저장처리다. 

 

처음에는 아예 감조차 안잡혔다.

 

어떻게 저장을 해야하는가! 

알고 있는 지인들에게 가장 많이 물어본 부분이 이부분일듯 싶다. 

 

돌아온 대답은... 

"니가 하면 정답이야!  좋은 정답 있으면 알려줘!"

(....  이게 맞는 것인가. 아니면 엄청 무책임한 것들 밖에 없나...)

 

playerPrefts 를 쓰려고 하다가... 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    int curlevel;
    float curPosX;
    float curPosY;
    float curPosZ;
    string curPlayerName;
 
    public void SaveNLoad()
    {
        //Save
        PlayerPrefs.SetInt("Level", curlevel);
        PlayerPrefs.SetFloat("PosX", curPosX);
        PlayerPrefs.SetFloat("PosY", curPosY);
        PlayerPrefs.SetFloat("PosZ", curPosZ);
        PlayerPrefs.SetString("PlayerName", curPlayerName);
 
        //Load
        PlayerPrefs.GetInt("Level");
        PlayerPrefs.GetFloat("PosX");
        PlayerPrefs.GetFloat("PosY");
        PlayerPrefs.GetFloat("PosZ");
        PlayerPrefs.GetString("PlayerName");
    }
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5; text-decoration:none">Colored by Color Scripter
 

 

이렇게 써야 했다... ;; 

태생 자체가 간단한 정보를 저장하려고 만드는 것 같아서 

PlayerPrefs는 포기...  

 

Class나 Struct를 저장하는거 없나 찾다가.. 

 

없을리가!!!

직렬화(Serialization) 가 있었다!

역시 귀찮은건 만들고 모두 공유하는 프로그래머들 같으니! 

찾다가 좋다~ 바로 도입!. 

 

아... 근데 에러 뱉어낸다. 

이유는 List<T> 때문에... 

이것 또한 구글링을 열심히 해본결과.  

되기는 하는데. 제발 Object를 Serialization을 시도하지 말라더라. 

아...  몰랑..  왜 안되는거야..  아마도 추후에 다시 시도해 볼듯하다. 

 

아 왜인지도 진짜인지도 모르겠지만. 내가 찾는건 없어...  

그래서 결국 포기...  

 

그러다가 찾은게 

ScriptableObject!!

이번에 찾았다!!!

 

...고.. 생각했는데. 

 

유니티에서 제공하는 ScriptableObject를 사용하려고 구글링을 해본 결과! 

유니티에서 동적으로 되도록 저장하지 말라고 해서. 

일단 보류.... 

 

다시 찾다가. 

왠지 어려워보이는 Json을 건드려봤다. 

아... 은연중에 프로그래머들이 자기들은 Json쓴다고 말하던게 생각났다. 

 

근데. Json으로 된다..  

편하다!  쉽다! 

유니티 자체에서 다룰 수 있다.(중요)

(현재는 공부하는 차원으로 작업하는 중이라 유니티 이외의 다른 에셋이나, 플러그인 없이 작업하고 싶어하고 있다)

 

그래서 Json으로 하기로 했다. ㅋㅋㅋ

 

다음은 static으로 제작하려고 뺀 함수. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class DataManager
{
    public static void SaveJsonData(string jsonData ,string filepath)
    {
        FileStream fileStream = new FileStream(filepath, FileMode.Create);
        byte[] data = Encoding.UTF8.GetBytes(jsonData);
        fileStream.Write(data, 0, data.Length);
        fileStream.Close();
    }
 
    public static string LoadJsonData(string filepath)
    {
        FileStream fileStream = new FileStream(filepath, FileMode.Open);
        byte[] data = new byte[fileStream.Length];
        fileStream.Read(data, 0, data.Length);
        fileStream.Close();
        return Encoding.UTF8.GetString(data);
    }
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5; text-decoration:none">Colored by Color Scripter
 

이런식으로 세이브하고 로드한다.

 

그리고 변환은 

 

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
public class UserDataManager : MonoBehaviour
{
    public UserData userData;
 
    public void Init()
    {
        FileInfo fi = new FileInfo(Application.dataPath + StaticData.Path_UserData);
        userData = new UserData();
        if (fi.Exists)
        {
            //Load
            string loadJson = DataManager.LoadJsonData(Application.dataPath + StaticData.Path_UserData);
            JsonUtility.FromJsonOverwrite(loadJson, userData);
        }
        else
        {
            //Save
            string tempJson = JsonUtility.ToJson(userData);
            DataManager.SaveJsonData(tempJson, Application.dataPath + StaticData.Path_UserData);
        }
    }
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5; text-decoration:none">Colored by Color Scripter
 

 

이런식으로 아...  완전 편.... 

 

이곳 저곳 찾아봤는데. 

 

Json도 배열을 받지 못한다는 식으로 이야기 된곳이 많아서 꺼린 부분이 있었는데. 

해보니 된다...  이거 뭐지? 

아직도 좀 꺼림칙한 기운이 있지만....  일단은 패쓰. 

 

돼니까!

'Unity' 카테고리의 다른 글

[Unity3D] 자식 오브젝트 찾기  (0) 2019.06.26
[Unity3D] Random.Range 범위  (0) 2019.06.14
[Unity3D] 싱글톤 (MonoSingleton)  (0) 2019.05.16
[Unity3D] C# CSV 사용법  (0) 2019.05.16
[Unity3D] Pixel Perfect 공식  (0) 2019.05.15