728x90
이전글에서 작성 했던 내용을 조금더 보강하여 작성하려 합니다.
이전글을 안보셨어도 해당 글을 보는 것에 문제는 없습니다.
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
'Unity' 카테고리의 다른 글
Unity에서 UI 렌더링 순서 변경하기 (겹쳐진 요소 위, 아래 위치 변경) (0) | 2023.08.06 |
---|---|
Unity 에서 VScode 사용하기 (0) | 2023.08.02 |
Unity Scene(씬) 전환 구현하기 (0) | 2023.07.27 |
Game 에서 해상도 선택하기 (0) | 2023.07.27 |
스마트폰 해상도로 게임 개발하기 (0) | 2023.07.26 |
댓글