데이터를 삭제하는 기능을 넣던 중 오류가 발생했다.
// DataController Script
public void DeleteGameData()
{
while(File.Exists(FilePath))
{
File.Delete(FilePath);
}
GameObject.Find("GameController").GetComponent<GameController>().ExitGame();
}
삭제 시 해당 루트에 존재하는 파일을 삭제하고 게임을 종료시키는 로직인데
로그를 찍어봐도 내 생각대로 잘 작동하고 있었다.
하지만, 정작 다시 게임을 실행시키면 이전 데이터를 로드해서 잘만 돌아간다.
분명히 데이터를 삭제했는데 삭제가 안 된 것이다.
게임을 종료하는 코드를 지우고 실행해 보니 문제없이 원하는 대로 돌아갔다.
따라서 데이터 삭제 시 게임을 굳이 종료하지 않고 새로운 데이터를 바로 만들고 씬을 초기화해 주기로 하였다.
// DataController Script
public void DeleteGameData()
{
if(File.Exists(FilePath)) File.Delete(FilePath);
LoadGameData();
SceneManager.LoadScene("Game");
}
이때, 설정해 둔 데이터가 날아가면 번거로워지기 때문에
Game Controller와 Data는 삭제되지 않고 그대로 유지되도록 Singleton 기법을 사용해 보았다.
// GameController Script
private void Awake()
{
// 싱글톤
if (Instance)
{
DestroyImmediate(gameObject);
return;
}
Instance = this;
DontDestroyOnLoad(gameObject);
}
이번에도 데이터는 분명히 정리되었는데 이전 값으로 게임이 계속해서 돌아가는 문제가 발생했다.
분명히 게임이 동작하는 동안에는 데이터파일이 삭제되었음을 확인했다.
코드를 천천히 따라가면서 확인해 보니 게임을 종료할 때 생기는 문제였다.
//DataController Script
private void OnApplicationQuit()
{
SaveGameData();
}
public void SaveGameData()
{
string jsonData = JsonUtility.ToJson(GameData);
File.WriteAllText(FilePath, jsonData);
}
위 코드는 게임을 종료할 때 실행되는 함수이다.
게임 종료 시 자동으로 게임데이터를 세이브하기 때문에
이미 지운 뒤에도 같은 데이터를 한 번 더 저장하고 있었던 것이다.
따라서 데이터를 삭제할 때는 이 자동세이브 로직이 작동하지 않도록 고쳤다.
//DataController Script
private void OnApplicationQuit()
{
if (!IsEnd) SaveGameData();
}
public void SaveGameData()
{
string jsonData = JsonUtility.ToJson(GameData);
File.WriteAllText(FilePath, jsonData);
}
이후부터는 데이터파일 삭제 시 그대로 게임을 종료해도 아무 문제 없이 작동한다.
'프로젝트 > 알부수기' 카테고리의 다른 글
알부수기 결과 (3) | 2023.10.10 |
---|---|
2023. 09. 13 x Delegate, ZoomIn (0) | 2023.10.10 |
2023. 09. 06 x ZoomIn 실패 (0) | 2023.10.10 |
2023. 09. 05 x 부자연스러운 캐릭터 이동 및 데이터 관리 (0) | 2023.10.10 |
2023. 08. 30 x One Scene & Two Camera (0) | 2023.10.10 |