본문 바로가기
프로젝트/알부수기

2023. 09. 12 x 데이터 삭제 로직

by 화릿불 2023. 10. 10.

 

데이터를 삭제하는 기능을 넣던 중 오류가 발생했다.

 

// 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);
}

 

이후부터는 데이터파일 삭제 시 그대로 게임을 종료해도 아무 문제 없이 작동한다.