그냥 취미로 게임 하나 유니티로 만드는 중인데,
세이브 & 로드 기능 만드는데 고민이 생김
내가 저장해야 할 데이터가
스테이터스(레벨이나 체력 이런 거), 아이템(인벤토리랑 장비창), 스테이지 클리어 여부 이렇게 3개인데,
처음에는 "데이터를 각각의 Json으로 나눠서 저장해야지"
이 마인드로 작업했는데
막상 만들려고 보니까 이게 맞나 싶음...
세이브 & 로드할 때마다 모든 데이터가 경로에 있는지 다 체크하고 넣어줘야 하니
데이터별로 관리해 주는 스크립트도 하나씩 만들어줘야 하고 뭔가 잘못된 길로 가는거 같음...
이게 보기 좋게 나누려다가 오히려 더 복잡해지는 게 아닌가? 싶은데
조금 난잡해 보여도 json 하나에 전부 때려 박는 게 맞을까?
gpt는 데이터 종류마다 나누는 게 좋다카긴 하던데
3줄 요약
1. 데이터를 종류에 따라 나눠 저장했는데
2. 만들고보니 뭔가 더 복잡해지는거 같다
3. 차라리 하나의 Json 데이터로 저장하는게 좋을까?
보통 io 저장을 사용하게 되면 저장함수는 {경로 위치에 파일 있는지 확인; 없으면:파일새로생성; 해당 위치의 파일에 저장;}, 로드 함수는 {경로 위치에 파일이 있는지 확인; 없으면 저장(); 해당 위치의 파일로부터 로드;} 이런 함수 플로우로 가면 저장 파일이 여러개(json 파일이 여러개)라 하더라도 저장하기 편하더라고요. 경로를 파일 이름이나 키값을 기반으로 사용하는 방식을 사용하고요(ex. Path(저장위치,키값) 함수는 "저장위치/키값.json" 경로를 반환, 이를 기반으로 save/load)
아 모바일로 쓰니 가독성이 좀 떨어지네요... 암튼 요지는 파일명을 키값으로 사용해서 경로를 반환하는 시스템만 잘 구축해놓으면 저장/로드 시스템을 키값을 기반으로 실행할 수 있을거같아서 덜 복잡해질거같아요. easySave3라는 저장 에셋도 이런 방식을 쓰고있더라고요
@ㅇㅇ 답변 감사합니다... 모든 세이브 & 로드를 관리하는 매니저로 SaveLoad_Manager를 만들고 여기에 string savePath = Application.persistentDataPath + "/";로 작성해서 기본 경로 설정, 파일 이름은 Path란 이름의 구조체를 만들고 string filename_PlayerData, string filename_stageData 넣어서 만든 뒤, public List fileName; 방식으로 저장했습니다. 리스트의 크기는 세이브 슬롯의 갯수(4개)만큼 만들어뒀습니다.
@ㅇㅇ(124.51) 세이브나 로드할 때 fileName 리스트의 인덱스만 알면 savePath + fileName.파일이름 방식으로 접근하는 구조로 제작했는데 어떨까요? 지정된 경로로 찾아가서 파일 체크 & 데이터 덮어쓰기나 불러오기는 PlayerData_Manager, Chapter_Manager 같이 하위 스크립트가 담당하는 데이터만 처리하는 방식입니다.
하나로 합치면 일부만 읽고 쓰면 되는 상황이어도 전체를 읽고 쓰게 되는데 세이브할 데이터가 많다면 분리하는 게 좋을듯
감사합니다! 플레이타임 20~40분 내외의 3d 액션 게임 하나 만드는 수준이라 나눌 필요가 있나 고민되네요...
해당 댓글은 삭제되었습니다.
감사합니다 간단한 게임이라 조금 더 만들어보고 아니다싶으면 합치던가 해야겠네요
@ㅇㅇ 암호화까지 고려하면 합쳐두는게 더 깔끔하긴 하겠네요 만약 데이터 저장을 로컬이 아니라 서버에 저장한다면 데이터를 base64 같은 걸로 암호화 할 필요까진 없다고 알고 있는데, 이런 경우라면 나눠도 큰 상관이 없을까요?
@ㅇㅇ 감사합니다!
다 합쳐서 JSON 만들어 쓰다가 나중에 버전업하면서 데이터 유효성 체크하는 로직과 함께 파일 나눠주면 되지 않을까? 대부분 인디 게임들은 얼리엑세스때 데이터 구조 바뀌면 그냥 날려버리니깐 너무 신경안써도 될듯
감사합니다! 일단 나눠두긴 했으니 그대로 작업해보고 영 아니다 싶으면 그냥 하나로 합치던가 해야겠네요
이-지-세-이-브 써봐용
이왕 해보는거 직접 구현해보려고요 ㅎㅎ 감사합니다!