250429 TIL

박소희·2025년 4월 29일

Unity_7기

목록 보기
80/94

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

0개의 댓글