해당 내용은 내가 담당했던 부분 중 데이터 저장 후 점수 표출하기 부분에 대한 내용을 다뤄보고자 한다.
PlayerPrefs를 이용해서 간단하게 접근이 가능했었겠지만 많이 사용해봤던 PlayerPrefs가 아닌 Json을 사용하고싶은 욕심으로.. 한번 시도 해보게 되었다.
데이터를 관리하는 부분은 담당한 적이 없어 Json을 사용한 적이 없어 이해하는데 어려움을 느꼈었는데 이번 계기로 정리하면서 많은 부분을 알 수 있어서 좋았다.
Json 어떻게 하는건데..!
Json (JavaScript Object Notation)
🔸 데이터를 저장하거나 전송할 때 많이 사용하는 경량의 DATA 교환 형식
🔸 정보를 저장할 수 있는 파일 형식으로 용량이 작음 XML의 느린 속도를 개선하기 위해 만들어짐.
🔸 서버와 연결되거나 할땐 Json으로 저장하는 것이 서버와 연결할 때 좋다.
🔸 서버와 클라이언트간의 교류에서 일반적으로 많이 사용
💡 경량의 DATA 교환 형식
속성 - 값 || 키 - 값 쌍으로 이루어진 데이터 오브젝트를 전달하기 위해 인간이 읽을 수 있는 텍스트를 사용하는 개방형 표준 포맷
네임스페이스
: 파일과 디렉터리 관련 네임스페이스
using System.IO;
Data의 구조
[Serializable]
public class GameData
{
public int stageLevel;
public float maxScore;
public bool HardOn = false;
}
직렬화된 데이터 스크립트
Json Load
public GameData gameData;
public void LoadGameData()
{
string filePath = Path.Combine(Application.dataPath, gameDataFileName);
if (File.Exists(filePath)) //파일 존재 여부 확인
{
string fromJsonData = File.ReadAllText(filePath);
gameData = JsonUtility.FromJson<GameDataInfor>(fromJsonData);
Debug.Log("Data Load Complete");
}
}
▪Path.Combine (string, string) : 두개의 경로 문자열을 연결
▪ File.Exists("파일경로") : 지정된 파일이 존재하는지 확인
▪ File.ReadAllText : 텍스트 파일을 열고 파일의 모든 텍스트를 문자열로 읽은 후 파일을 닫음
▪ JsonUtility.FromJson<T>(string json) : Json 포맷의 문자열을 T타입의 인스턴스로 리턴, 객체로 역질렬화
- GameDataInfor의 멤버들은 반드시 public 하거나 [ SerializeField ]으로 해야지 저장이 가능
Json Save
public void SaveGameData()
{
string toJsonData = JsonUtility.ToJson(gameData, true);
string filePath = Path.Combine(Application.dataPath, gameDataFileName);
File.WriteAllText(filePath, toJsonData); // 이미 저장된 파일이 있는 경우 덮어쓰기
Debug.Log("Data Save Complete");
}
▪ JsonUtility.ToJson(object , bool) : 인수로 넘긴 객체를 직렬화된 Json 포맷의 String 텍스트으로 리턴
⭐ Json은 직렬화하여 저장되는 포맷 ➨ 인수로 넘긴 객체는 직렬화 가능한 객체여야함
▪ File.WriteAllText(경로, json) : 새파일을 만들고 파일에 내용을 쓴 다음 파일을 닫음. 대상 파일이 있는 경우 덮어써버림
나중에 알게된 사실이지만 해당 방법을 이용하면 하나의 데이터의 정보만 저장하기 때문에 2개의 스테이지가 있는 현재 게임해서는 해당이 다른 저장 후 로드 하는 방식을 사용해야하는것을 알게 되었다.
Joson을 담을 배열 추가
[Serializable]
public class GameDataInfor
{
public GameData[] StageInfor;
}
GameData를 배열로 선언하기 위해 GameDataInfor의 직렬화한 클래스를 추가한 후 Json 파일을 파싱 할 때 GameData로 파싱했다면 GameDataInfor로 클래스를 변경해주었다.
public GameDataInfor gameData;
참고 사이트
'Unity > 개념 공부' 카테고리의 다른 글
[ 내일배움캠프 ] WIL.05 - 프로젝트 발표 & 회고록 (0) | 2024.04.19 |
---|---|
[ 내일배움캠프 ] TIL.04 - Unity 생명 주기 (0) | 2024.04.18 |
[ 내일배움캠프 ] TIL.03 - 카드 선택 횟수 제한하기 _ 해결 방안 생각하기 (0) | 2024.04.17 |
[ 내일배움캠프 ] TIL.03 - 와이어프레임(Wireframe) 제작하기 (0) | 2024.04.17 |
[ 내일배움캠프 ] TIL.02 - Dotween을 이용한 카드 뒤집기 (0) | 2024.04.16 |