DataController.cs 6.34 KB
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using System;


public class DataController : MonoBehaviour
{
    /*
    container (객체) > instance(스크립트를 인스턴트화!) > gamedata (실제 들어있는 데이터 스크립트) !!! 
    DataController.Instance.gameData 로 데이터 안에 있는 변수들 부를수있고, 
    DataController.Instance.SaveGameData(); 로 저장가능~! (DataController_test참고)
    */
    static GameObject _container;
    static GameObject Container
    {
        get {
            return _container;
        }

    }
   
    static DataController _instance;
    public static DataController Instance
    {
        // 싱글톤! 데이터 컨트롤러를 인스턴스화 하여 스크립트를 찾지않아도 바로 접근가능해진다.
        // 모든씬에서 이 스크립트를 공유가능 (겜 재생시 데이터 컨트롤러 게임오브젝트 생성됨)
        get 
        {
            if (!_instance)
            {
                _container = new GameObject(); //컨테이너 라는 임시 게임오브젝트 생성
                _container.name = "DataController";
                _instance = _container.AddComponent(typeof(DataController)) as DataController; //해당 겜오브젝트에 이 스크립트 넣기~ Add component
                DontDestroyOnLoad(_container); // 딴 씬이 로드되어도 이 오브젝트 삭제하지 말것! 
            }
            return _instance;
        }
    }

    public string GameDataFileName = "userdata.json";
    public GameData _gameData;

    public GameData gameData{
        get {
            if (_gameData == null) {
                LoadGameData();
                //SaveGameData(); 여기서 데이터 왜 세이브하는거?
            }
            return _gameData;  //얘도 결국 _gameData를 리턴함!! 이게 싱글톤 용법인듯
        }
    }


    public void LoadGameData() {

        // filepath 가져오기~ 사용자 디렉토리/AppData/...어딘가! + 파일이름!
        string filePath = Application.persistentDataPath + GameDataFileName;

        if (File.Exists(filePath)) {
            Debug.Log("유저데이터 불러오기 성공!");
            string FromJsonData = File.ReadAllText(filePath);
            _gameData = JsonUtility.FromJson<GameData>(FromJsonData);

            //Array로 저장된거 다시 리스트로 불러오기! 
            gameData.Item_list.Clear(); //리스트..저장되는지 몰랐다..ㅠㅠㅠ 리스트도 저장되므로 리스트 일단 삭제해줌. 지금 중복저장하고있음 ㅠㅠ
            gameData.Item_list.AddRange(gameData.Item_wrapobject.items_in_array);
        }
        else {
            Debug.Log("새로운 파일 생성");

            _gameData = new GameData();

        }

        for (int i = 0; i < gameData.Item_list.Count; i++)
        {
            Debug.Log("읽기 : 유저데이터에 "+ gameData.Item_list[i].id+"가 "+gameData.Item_list[i].num+"개 있습니다");

        }
    }

    public void SaveGameData()
    {
        // 리스트는 저장이 안되니까.. array로 바꿔서 저장!
        if (gameData.Item_list.Count != 0)
        {
            // 저장하기전에 어레이 다 삭제하긴 좀????
            for (int i = 0; i < gameData.Item_list.Count; i++)
            {
                Debug.Log("저장 : 유저데이터에 " + gameData.Item_list[i].id + "가 " + gameData.Item_list[i].num + "개 있습니다");

            }
            Debug.Log("이제 json으로 저장합니다 "); //여기서 문제생기는데 이밑에서..Toarray에서..왜지..?
            gameData.Item_wrapobject.items_in_array = gameData.Item_list.ToArray();

            for (int i = 0; i < gameData.Item_wrapobject.items_in_array.Length; i++)
            {
                Debug.Log("저장 : ITEMLIST (Wrapper)에 " + gameData.Item_wrapobject.items_in_array[i].id + "가 " + gameData.Item_wrapobject.items_in_array[i].num + "개 있습니다");
            }
        }

        string ToJsonData = JsonUtility.ToJson(gameData);
        string filePath = Application.persistentDataPath + GameDataFileName;
        File.WriteAllText(filePath, ToJsonData);

        Debug.Log("유저데이터 저장완료!");
    }


    private void OnApplicationQuit() {
        SaveGameData();
    }

    public void Add_item_to_PlayerData(int id, int num) {
        //게임데이터 리스트에 id있으면 해당 key에 value 추가 -> 이케하면 새로 얻고 할때마다 추가,삭제하고 if문들어가긴함... 그래도 이게나을듯. 밑에거하면 갯수많아지면 항상 다검색해야하니까...
        //없으면 id,value추가

        bool haveitem = false;
        for (int i = 0; i < gameData.Item_list.Count; i++)
        {
            if (gameData.Item_list[i].id == id)
            {
                gameData.Item_list[i].num += num;
                haveitem = true;
                Debug.Log("유저데이터에 아이템 추가했어요! 추가한 ID = " + id);
                break;

            }
        }
        if(!haveitem)
        {
            havingitem newitem = new havingitem();
            newitem.id = id;
            newitem.num = num;
            gameData.Item_list.Add(newitem);
            Debug.Log("유저데이터에 아이템 추가했어요! 추가한 ID = " + id);

        }
    }

    public void Remove_item_from_PlayerData(int id, int num) {

        bool haveitem = false;
        for (int i = 0; i < gameData.Item_list.Count; i++)
        {
            if (gameData.Item_list[i].id == id)
            {
                if (num > gameData.Item_list[i].num)
                { Debug.LogError("유저데이터 : 사용하려는 아이템의 갯수가 보유하고있는것보다 많습니다"); }
                else if (num == gameData.Item_list[i].num)
                { gameData.Item_list.Remove(gameData.Item_list[i]); Debug.Log("유저데이터 : " + id + "번호의 아이템을 전부 사용하셨습니다"); }
                else
                { gameData.Item_list[i].num -= num; Debug.Log("유저데이터 : 남은 " + id + " 번호 아이템 갯수 = " + gameData.Item_list[i].num + "개"); }

            }
        }

        if (!haveitem)
        {
            Debug.LogError("유저데이터 : 해당 아이템을 유저DB에 보유하고있지 않은데 삭제시도를 하셨습니다");
            
        }

    }

}