-
Notifications
You must be signed in to change notification settings - Fork 2
develop SaveLoad
- Json은"dataName": value 형태로 이루어져있고 문자열은 ""으로 감싸주어야합니다.
- Json가 지원하는 자료형으로는 number(int, float), string, bool, object, array, null 등이 있습니다.
TODO:
Resources/GameData/DefaultUserData.json 파일
public class UserData
{
public int Gold;
public int[] Options;
public int[] PowerUps;
public bool[] Achievements;
public bool[] Collection;
public bool[] UnlockStages;
}
Json에서 사용한 변수의 이름과 같이 이름들을 설정해주어야 뒤에 나올 JsonUtility.FromJson(...)으로 파싱이 가능
Awake()에서 싱글톤 패턴 적용, DontDestroyOnLoad적용 , SavePath = Application.persistentDataPath + "/";으로 할당.
Start()에서 저장 파일이 있는지 확인, 없으면 위의 DefaultUserData를 불러와 새로 저장 파일 생성(DataReset), 있다면 기존 파일 불러오기
public void SaveData()
{
string data = JsonUtility.ToJson(UserInfo.instance.UserDataSet);
File.WriteAllText(SavePath + "UserSaveData.json", data);
}
public void LoadData()
{
string data = File.ReadAllText(SavePath + "UserSaveData");
UserInfo.instance.UserDataSet = JsonUtility.FromJson<UserData>(data);
}
public void DataReset()
{
TextAsset textData = Resources.Load("GameData/DefaultUserData") as TextAsset;
UserInfo.instance.UserDataSet = JsonUtility.FromJson<UserData>(textData.text);
SaveData();
}
여기서 UserInfo.instance.UserDataSet은 위의 UserData타입임
public bool LoadData(string dataPath)
{
string data = File.ReadAllText(dataPath);
UserData tempData;
try
{
tempData = JsonUtility.FromJson<UserData>(data);
}
catch (ArgumentException e)
{
return false;
}
UserInfo.instance.UserDataSet = tempData;
SaveData();
return true;
}
LoadData함수에 인자로 파일의 경로를 넣어줄 경우 해당 파일을 읽어와서 현재 저장 파일에 덮어쓴다.
파싱 실패시(잘못된 파일일 경우) false, 성공시 true 반환
Awake()에서 싱글톤 패턴 적용
void UpdateColldection(int collectionIndex)
{
UserDataSet.Collection[collectionIndex] = true;
UserDataManager.instance.SaveData();
}
collection, Achievement, Character는 위와 같이 해당 index를 넣어주면 유저 데이터가 바뀌도록 구현함, collection의 경우 무기와 악세서리 index를 넘겨주는 편이 더 쉬운 경우가 있을 거라 생각해서 아래의 함수를 추가해놓음.
void UnlockWeapon(int weaponIndex)
{
UserDataSet.Collection[(weaponIndex << 1) | 1] = true;
UserDataManager.instance.SaveData();
}
void UnlockAccessory(int accessoryIndex)
{
UserDataSet.Collection[accessoryIndex + jumpAccessory] = true;
UserDataManager.instance.SaveData();
}
배열 안의 수식은 해당 장비의 index로 collection 상에서의 index에 찾아가는 공식임
(순서가 궁금하다면 Script/Menu/CollectionItemInfo.cs 참고)
bool IsWeaponUnlock(int weaponIndex)
{
return UserDataSet.Collection[(weaponIndex << 1) | 1];
}
bool IsAccessoryUnlock(int accessoryIndex)
{
return UserDataSet.Collection[accessoryIndex + jumpAccessory];
}
반대로 해당 index의 장비가 해금 되었는지 쉽게 찾을 수 있도록 수식을 적용한 함수를 만들어줌.
character나 stage의 해금 유무는 index로 바로 접근해도 되기에 따로 함수를 만들어주지 않음