MonoBehaivour 클래스는 직렬화가 안돼서 JsonUtility.ToJson()로는 저장이 되지 않는다..
-> BlockSaveData를 따로 만들어서 id, name만 저장하도록 했다.
[System.Serializable]
public class BlockSaveData
{
public int id;
public string blockName;
}
public void SaveGame()
{
SaveData data = new SaveData();
data.stageId = StageManager.Instance.StageResult.id;
data.playTime = StageManager.Instance.PlayTime;
data.blocks = TimelineManager.Instance.PlacedBlocks.Where(b => b != null).Select(b=> new BlockSaveData
{
id = b.id,
blockName = b.BlockName
}).ToList();
data.musicId = GameManager.Instance.SelectedBGM.name;
string json = JsonUtility.ToJson(data, true);
File.WriteAllText(SavePath, json);
Debug.Log($"게임 저장 완료 - {SavePath}");
}
-> 로드할 때는 json으로 id만 넘겨준 뒤, 데이터 로드는 원래의 블럭에서 하는 것으로 했다.
씬전환할 때는 신경써야되는 부분이 많은 것 같다..
public void Replay()
{
if (!File.Exists(SavePath))
{
Debug.Log("세이브 파일 x");
return;
}
string json = File.ReadAllText(SavePath);
SaveData data = JsonUtility.FromJson<SaveData>(json);
if(ResourceManager.Instance.BgmList.TryGetValue(data.musicId, out var clip))
{
GameManager.Instance.SetSelectedBGM(clip);
}
StageManager.Instance.SetStage(data.stageId);
foreach (var b in data.blocks)
{
blockIds.Add(b.id);
}
SceneManager.sceneLoaded += OnStageSceneLoaded;
SceneManager.LoadScene("Stage_Scene");
}
private void OnStageSceneLoaded(Scene scene, LoadSceneMode mode)
{
if (scene.name == "Stage_Scene")
{
TimelineManager.Instance.LoadBlocks(blockIds);
for (int i = 0; i < TimelineManager.Instance.PlacedBlocks.Count; i++)
{
RhythmManager.Instance.rhythmActions.Add(TimelineManager.Instance.PlacedBlocks[i].GetComponent<IRhythmActions>());
}
RhythmManager.Instance.StartMusic();
SceneManager.sceneLoaded -= OnStageSceneLoaded;
}
}
public void LoadBlocks(List<int> blockIds)
{
Block[] allBlocks = FindObjectsOfType<Block>();
foreach(var id in blockIds)
{
var block = allBlocks.FirstOrDefault(b => b.id == id);
if (block != null)
{
if (!PlacedBlocks.Contains(block)) PlacedBlocks.Add(block);
}
else Debug.Log($"{id} block not found");
}
foreach(var block in PlacedBlocks)
{
block.SetGhost();
}
}