본문 바로가기
Unity

Unity에서 JSON을 이용해 게임 데이터 유지하기 (골드 저장하고 유지하기)

by 오근성 2023. 8. 1.
728x90

https://geunseongwebdev.tistory.com/entry/Unity%EC%97%90%EC%84%9C-JSON%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%B4-%EA%B2%8C%EC%9E%84-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%9C%A0%EC%A7%80%ED%95%98%EA%B8%B0-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%80%EC%9E%A5

이전글에서 작성 했던 내용을 조금더 보강하여 작성하려 합니다.

이전글을 안보셨어도 해당 글을 보는 것에 문제는 없습니다.

PlayerData

는 데이터를 전달하기 위한 오브젝트 입니다.

플레이어 데이터 중 일단 gold (돈)을 가지고 있습니다.

[System.Serializable]
//System.Serializable 어트리뷰트는 이 클래스가 직렬화 가능하다는 것을 나타냅니다. 직렬화는 데이터를 스트림이나 파일 등에 저장하거나 네트워크로 전송하는 데 사용할 수 있는 형식으로 변환하는 과정입니다. 이렇게 함으로써, 클래스의 인스턴스는 디스크에 저장되거나 네트워크를 통해 전송될 수 있습니다.
public class PlayerData
{
    public int gold;
}

SaveManager

는 저장을 직접적으로 수행합니다.

Save

함수에 PlayerData 를 전달하면
JSON 형태로 변경하여 지정된 경로에 저장하게 됩니다.
만약 지정된 경로에 JSON 이 없다면
File.WriteAllText(SAVE_PATH, json); 에 의해 생성되고
지정된 경로에 JSON 이 있다면 내용을 덮어씌웁니다.

Load

는 지정된 경로의 JSON 파일을 읽어와 PlayerData를 반환해줍니다.

요약하면 SaveManager 의 save 와 load 를 잘 이용하면 원하는 타이밍에 PlayerData를 JSON으로 저장하고 JSON 으로 부터 PlayerData를 불러올 수 있게 되었습니다.

using System.IO;
using UnityEngine;

public static class SaveManager
{
    // 파일 저장 경로를 설정합니다. 유니티의 persistentDataPath는 사용자의 장치에서 데이터를 영구적으로 저장할 수 있는 위치를 반환합니다.
    private static readonly string SAVE_PATH = Application.persistentDataPath + "/save.json";

    // PlayerData 객체를 받아 JSON 형태로 변환하고, 이를 파일에 저장하는 메소드입니다.
    public static void Save(PlayerData data)
    {
        // JsonUtility.ToJson 메소드를 사용하여 PlayerData 객체를 JSON 문자열로 변환합니다.
        string json = JsonUtility.ToJson(data);

        // File.WriteAllText 메소드를 사용하여 JSON 문자열을 파일에 저장합니다.
        // 이 메소드는 파일이 이미 존재하면 덮어쓰고, 그렇지 않으면 새 파일을 생성합니다.
        File.WriteAllText(SAVE_PATH, json);
    }

    // JSON 파일을 불러와 PlayerData 객체로 변환하는 메소드입니다.
    public static PlayerData Load()
    {
        // File.Exists 메소드를 사용하여 파일이 존재하는지 확인합니다.
        if (File.Exists(SAVE_PATH))
        {
            string json = File.ReadAllText(SAVE_PATH);


            // JsonUtility.FromJson 메소드를 사용하여 JSON 문자열을 PlayerData 객체로 변환합니다.
            PlayerData data = JsonUtility.FromJson<PlayerData>(json);

            // 변환된 PlayerData 객체를 반환합니다.
            return data;
        }
        else
        {
            // 파일이 존재하지 않으면, 새 PlayerData 객체를 생성하여 반환합니다.
            return new PlayerData();
        }
    }
}

Player

Start

SaveManager로부터 load 해온 PlayerData 를 data에 저장해줍니다.

AddGold

인자로 받은 값 만큼 data 의 gold에 값을 추가하고 추가된 데이터를 SaveManager save 함수로 저장해줍니다.

using UnityEngine;

public class Player : MonoBehaviour
{
    // PlayerData 타입의 private 변수를 선언합니다.
    // 이 변수는 플레이어의 상태를 저장합니다.
    private PlayerData data;

    // 게임 오브젝트가 활성화되고 Start 메소드 호출 전에 호출되는 Unity의 생명 주기 메소드입니다.
    void Start()
    {
        // SaveManager의 Load 메소드를 호출하여 JSON 파일에서 플레이어 데이터를 불러옵니다.
        // 불러온 데이터를 PlayerData 변수에 저장합니다.
        data = SaveManager.Load();

        // 불러온 골드의 양을 콘솔에 출력합니다.
        Debug.Log("Loaded gold: " + data.gold);
    }

    // 골드를 추가하는 메소드입니다. 이 메소드는 골드의 양을 인자로 받습니다.
    public void AddGold(int amount)
    {
        // 플레이어 데이터의 골드 양에 인자로 받은 양을 더합니다.
        data.gold += amount;

        // SaveManager의 Save 메소드를 호출하여 변경된 플레이어 데이터를 JSON 파일에 저장합니다.
        SaveManager.Save(data);
    }
}

GoldDisplay

골드를 표시해주기 위한 오브젝트입니다.

Start

GameManager의 인스턴스에서 playerData를 가져와서 이 클래스의 playerData에 할당합니다

Update

이 메서드는 매 프레임에서 호출됩니다
플레이어의 현재 gold 량을 표시하는 텍스트 컴포넌트의 내용을 업데이트합니다.

using TMPro; // TextMeshPro를 사용하기 위해 필요한 네임스페이스를 불러옵니다. TextMeshPro는 고급 텍스트 렌더링을 제공하는 Unity의 확장 기능입니다.
using UnityEngine; // Unity 엔진의 기본 기능들을 사용하기 위해 필요한 네임스페이스를 불러옵니다.

public class GoldDisplay : MonoBehaviour // GoldDisplay라는 이름의 클래스를 MonoBehaviour를 상속받아 정의합니다. 이 클래스는 플레이어의 금 개수를 화면에 표시하는 역할을 합니다.
{
    public TextMeshProUGUI goldText; // Unity UI에 있는 TextMeshProUGUI 컴포넌트를 참조하는 public 변수입니다. 이 변수를 통해 금의 개수를 표시하는 텍스트를 설정하고 업데이트할 수 있습니다.
    public PlayerData playerData; // 플레이어의 데이터를 참조하는 public 변수입니다.

    void Start() // 이 메서드는 이 오브젝트가 시작될 때(즉, 씬이 시작되거나 오브젝트가 처음 활성화될 때) 호출됩니다.
    {
        playerData = GameManager.Instance.playerData; // GameManager의 인스턴스에서 playerData를 가져와서 이 클래스의 playerData에 할당합니다.
    }

    void Update() // 이 메서드는 매 프레임에서 호출됩니다. 주로 게임 로직의 업데이트를 처리하는 데 사용됩니다.
    {

        Debug.Log("Gold: " + GameManager.Instance.playerData.gold); // Console 창에 플레이어의 현재 금 개수를 로그로 출력합니다.
        goldText.text = "Gold: " + GameManager.Instance.playerData.gold; // 플레이어의 현재  gold 량을 표시하는 텍스트 컴포넌트의 내용을 업데이트합니다.

    }
}

728x90

댓글