본문 바로가기
유니티 공부/Unity

Unity - 게임 json파일로 저장하고 로드하는 법 (JsonUtility.ToJson, JsonUtility.FromJson)

by 코딩하는 돼징 2023. 6. 17.
반응형

1. Save

01  persistentDataPath

public static string persistentDataPath;

저장 경로

Windows: "C:\Users<사용자이름>\AppData\Local<회사 또는 프로젝트 이름>\"
macOS: "/Users/<사용자이름>/Library/Application Support/<회사 또는 프로젝트 이름>/"

02 JsonUtility.ToJson

public static string ToJson(object obj);

반환

obj의 데이터를 Json으로 변환한 문자열로 반환한다.


03 File.WriteAllText

새 파일을 만들고 지정된 문자열을 해당 파일에 쓴다. 만약 대상 파일이 이미 존재하는 경우 파일에 덮어쓴다.

File.WriteAllText 메서드를 사용하기 위해 using System.IO를 추가해야 한다.

using System.IO;
public static void WriteAllText (string path, string? contents);

04 Save 전체 코드

static readonly string FILEPATH = Application.persistentDataPath + "/Save.json";

public static void Save(GameStateSave save)
{
    string json = JsonUtility.ToJson(save);
    File.WriteAllText(FILEPATH, json);
}

2. Load

01 File.Exists

파일이 존재하는지 확인

using System.IO;
public static bool Exists (string? path);

02 JsonUtility.FromJson

JSON 형식의 문자열을 사용하여 해당 데이터를 객체로 역직렬화한다.

public static T FromJson<T>(string json);

매개변수

T: 역직렬화된 객체의 유형을 나타낸다. 역직렬화된 결과로 반환되는 객체의 유형을 명시적으로 지정해야 한다.
json: Json 형식의 문자열로 직렬화된 데이터이다.

반환

역직렬화된 결과로 반환되는 객체이다.


03 Load 전체 코드

static readonly string FILEPATH = Application.persistentDataPath + "/Save.json";
public static GameStateSave Load()
{
    GameStateSave loadedSave = null;

    if (File.Exists(FILEPATH))
    {
        string json = File.ReadAllText(FILEPATH);
        loadedSave = JsonUtility.FromJson<GameStateSave>(json);
    }
    return loadedSave; // GameStateSave의 객체를 반환
}

3. 간단한 클릭커 게임으로 예시

01 IncreaseClickCount

버튼의 클릭 횟수와 스코어를 관리

public void IncreaseClickCount()
{
    clickCount++;
    score.text = clickCount.ToString();
}

02 클릭 횟수 정보 저장하기

[System.Serializable]
public class ScoreSave
{
    public int clickCount;

    public ScoreSave(int clickCount)
    {
        this.clickCount = clickCount;
    }
}

03 게임 데이터 저장하기

현재 코드에서는 점수 정보만 가지고 있지만 필요에 따라 다른 필요한 데이터도 저장할 수 있다.

[System.Serializable]
public class GameStateSave
{
    public ScoreSave scoreSave;

    public GameStateSave(ScoreSave scoreSave)
    {
        this.scoreSave = scoreSave;
    }
}

04 게임 저장하거나 불러오기

ublic void SaveGameState()
{
    ScoreSave currentScore = new ScoreSave(Manager.Instance.clickCount);
    GameStateSave gameState = new GameStateSave(currentScore);
    SaveManager.Save(gameState);
}

public void LoadGameState()
{
    GameStateSave loadedGameState = SaveManager.Load();

    if (loadedGameState != null)
    {
        ScoreSave loadedScore = loadedGameState.scoreSave;
        Manager.Instance.clickCount = loadedScore.clickCount;
        Manager.Instance.score.text = Manager.Instance.clickCount.ToString();
    }
}

05 SaveManager

위의 Save, Load코드 참조


4. 결과

01 영상 확인


02 파일 확인

GameStateSave.cs파일에서 ScoreSave 멤버 변수를 가지고 있으므로 GameStateSave객체를 직렬화할 때 해당 멤버 변수 이름인 scoreSave와 그 값이 저장된다. 그러므로 아래와 같은 결과가 나온다.

반응형

댓글