using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using System.IO;



[System.Serializable]

public class StageType

{


}


[System.Serializable]

public class GameData

{

    [Header("스테이지 클리어 여부")]


    public bool[] bClearStage = new bool[20]; //클리어 할 때 마다 저장

    public bool[] bStar1Stage = new bool[20];

    public bool[] bStar2Stage = new bool[20];

    public bool[] bStar3Stage = new bool[20];

}


[System.Serializable]

public class ItemData

{

    public List<int> invenArrayNumber = new List<int>();

    public List<string> invenItemName = new List<string>();

    public List<int> invenItemNumber = new List<int>();

}


[System.Serializable]

public class PlayerData

{

    [Header("플레이어 데이터")]

    public int iLevel;

    public int iReqLevelExp;

    public int iDollar; //일반 재화

    public int iBitCoin; //특수 재화

    public int iExp; //경험치


    //아이템 추가해 둘 것

}


[System.Serializable]

public class OptionData

{

    [Header("옵션 저장")]

    public float MasterValue;

    public float MasterPrevValue;

    public float BGMValue;

    public float BGMPrevValue;

    public float BGEValue;

    public float BGEPrevValue;

    public float EffectValue;

    public float EffectPrevValue;

    public bool MasterMute;

    public bool BGMMute;

    public bool BGEMute;

    public bool EffectMute;

}



public class DataController : MonoBehaviour

{

    public SoundMaster m_SM;

    public GameInfo m_GI;


    public GameData m_GameData;

    public ItemData m_ItemData;

    public PlayerData m_PlayerData;

    public OptionData m_OptionData;


    private static DataController instance = null;


    private void Awake()

    {

        if(null == instance)

        {

            //이 클래스 인스턴스가 탄생할 때 전역변수 instance에 인스턴스가 담기지 않으면 자기를 넣는다.

            instance = this;


            //씬 전환되도 파괴되지 않게 막는다.

            DontDestroyOnLoad(this.gameObject);

        }

        else

        {

            //씬 이동 후에도 그 씬의 헤이라키에 존재할 경우엔 삭제시켜 줄인다.

            Destroy(this.gameObject);

        }


        LoadGameDataFromJson();

        LoadPlayerDataFromJson();

        LoadOptionDataFromJson();

    }


    public static DataController Instance

    {

        get

        {

            if(null==instance)

            {

                return null;

            }

            return instance;

        }

    }


    [ContextMenu("To Json GameData")]

    public void SaveGameDataToJson() //게임 데이터 세이브 지점

    {


        string jsonData = JsonUtility.ToJson(m_GameData, true);

#if UNITY_EDITOR

        string path = Path.Combine(Application.dataPath, "GameData.json");

#elif UNITY_ANDROID

        string path = Path.Combine(Application.dataPath, "GameData.json");

#endif

        File.WriteAllText(path, jsonData);

    }



    [ContextMenu("From Json GameData")]

    public void LoadGameDataFromJson() //게임데이터 로드

    {

#if UNITY_EDITOR

        string path = Path.Combine(Application.dataPath, "GameData.json");

#elif UNITY_ANDROID

        string path = Path.Combine(Application.dataPath, "GameData.json");

#endif

        if (File.Exists(path))

        {

            Debug.Log("gamedata Load");

            string jsonData = File.ReadAllText(path);

            m_GameData = JsonUtility.FromJson<GameData>(jsonData);

        }

        else

        {

            Debug.Log("new gamedata");

            m_GameData = new GameData();

        }

    }


    [ContextMenu("To Json ItemData")]

    public void SaveItemDataToJson()

    {

        string jsonData = JsonUtility.ToJson(m_ItemData, true);

#if UNITY_EDITOR

        string path = Path.Combine(Application.dataPath, "ItemData.json");

#elif UNITY_ANDROID

        string path = Path.Combine(Application.dataPath, "ItemData.json");

#endif

        File.WriteAllText(path, jsonData);

    }


    [ContextMenu("From Json GameData")]

    public void LoadItemDataFromJson() //게임데이터 로드

    {

#if UNITY_EDITOR

        string path = Path.Combine(Application.dataPath, "ItemData.json");

#elif UNITY_ANDROID

        string path = Path.Combine(Application.dataPath, "ItemData.json");

#endif

        if (File.Exists(path))

        {

            Debug.Log("itemdata Load");

            string jsonData = File.ReadAllText(path);

            m_ItemData = JsonUtility.FromJson<ItemData>(jsonData);

        }

        else

        {

            Debug.Log("new gamedata");

            m_ItemData = new ItemData();

        }

    }


    [ContextMenu("To Json PlayerData")]

    public void SavePlayerDataToJson()

    {

        string jsonData = JsonUtility.ToJson(m_PlayerData, true);

#if UNITY_EDITOR

        string path = Path.Combine(Application.dataPath, "PlayerData.json");

#elif UNITY_ANDROID

        string path = Path.Combine(Application.dataPath, "PlayerData.json");

#endif

        File.WriteAllText(path, jsonData);

    }


    [ContextMenu("From Json PlayerData")]

    public void LoadPlayerDataFromJson()

    {

#if UNITY_EDITOR

        string path = Path.Combine(Application.dataPath, "PlayerData.json");

#elif UNITY_ANDROID

        string path = Path.Combine(Application.dataPath, "PlayerData.json");

#endif

        if (File.Exists(path))

        {

            Debug.Log("playerdata Load");

            string jsonData = File.ReadAllText(path);

            m_PlayerData = JsonUtility.FromJson<PlayerData>(jsonData);

        }

        else

        {

            Debug.Log("new playerdata");

            m_PlayerData = new PlayerData();

        }


    }


    [ContextMenu("To Json OptionData")]

    public void SaveOptionDataToJson()

    {

        string jsonData = JsonUtility.ToJson(m_OptionData, true);

#if UNITY_EDITOR

        string path = Path.Combine(Application.dataPath, "OptionData.json");

#elif UNITY_ANDROID

        string path = Path.Combine(Application.dataPath, "OptionData.json");

#endif

        File.WriteAllText(path, jsonData);

    }


    [ContextMenu("From Json OptionData")]

    public void LoadOptionDataFromJson()

    {

#if UNITY_EDITOR

        string path = Path.Combine(Application.dataPath, "OptionData.json");

#elif UNITY_ANDROID

        string path = Path.Combine(Application.dataPath, "OptionData.json");

#endif

        if (File.Exists(path))

        {

            Debug.Log("optiondata Load");

            string jsonData = File.ReadAllText(path);

            m_OptionData = JsonUtility.FromJson<OptionData>(jsonData);

        }

        else

        {

            Debug.Log("new optionData");

            m_OptionData = new OptionData();

        }

    }

}


이게 에디터에서는 잘 작동되는게 확인됐거든? 게임이 에러 없이 잘 작동했는데 apk로 패키징 해서 실행해서 세이브 지점에서 실행하면 계속 게임이 멈춰버리는 현상이 발견되서, 어떻게 해야할지 알려줄 수 있니?