개발일지/TIL

[Unity Devcamp] 0201 개발일지

JangKroed 2023. 3. 21. 20:27
728x90
반응형

Grid save / load 진행상황

// Grid.cs / Start
void Start()
    {
        if (SaveGame.DataExists("Grid1"))
        {
            _lineIndicator = GetComponent<LineIndicator>();
            int square_index = 0;
            for (int i = 1; i <= 81; i++)
            {
                var grid = Instantiate(gridSquare);
                grid.name = "Grid" + i;
                var loadGrid = SaveGame.Load(grid);

                _gridSquares.Add(loadGrid as GameObject);

                _gridSquares[_gridSquares.Count - 1].GetComponent<GridSquare>().SquareIndex = square_index;
                _gridSquares[_gridSquares.Count - 1].transform.SetParent(this.transform);
                _gridSquares[_gridSquares.Count - 1].transform.localScale = new Vector3(squareScale, squareScale, squareScale);
                _gridSquares[_gridSquares.Count - 1].GetComponent<GridSquare>().SetImage(_lineIndicator.GetGridSquareIndex(square_index) % 2 == 0);
                square_index++;

                if (loadGrid.transform.GetChild(2).gameObject.activeSelf)
                {
                    _gridSquares[_gridSquares.Count - 1].GetComponent<BoxCollider2D>().enabled = false;
                }
                
            }
            Debug.Log("데이터로드");
            currentActiveSquareColor_ = squareTextureData.activeSquareTextures[0].squareColor;
            SetGridSquaresPosition();

            return;

        }
        Debug.Log("데이터 없음");
        _lineIndicator = GetComponent<LineIndicator>();
        CreateGrid();
        currentActiveSquareColor_ = squareTextureData.activeSquareTextures[0].squareColor;
    }
// CreateGrid
public void CreateGrid()
    {
        _gridSquares.Clear();
        foreach (Transform child in transform)
        {
            Destroy(child.gameObject);
        }
        SpawnGridSquares();
        SetGridSquaresPosition();
        Shape.SaveGrid();
    }
  • 게임중 Grid 리셋
  • 게임 종료 후 Grid 리셋

SaveGame.cs / Grid Sprite Save / Load

// Save
// 활성화된 게임 오브젝트를 저장
    public static void Save(GameObject obj)
    {
        // 파일 이름
        string fileName = obj.name;
        // 경로
        string path = Application.dataPath + "/Saves/" + fileName + ".json";
        // 객체 생성
        SaveObject saveObject = new SaveObject();

        // 게임 오브젝트 정보 저장
        saveObject.position = obj.transform.position;
        saveObject.rotation = obj.transform.rotation;
        saveObject.scale = obj.transform.localScale;
        saveObject.isActive = obj.activeSelf;
        saveObject.name = obj.name;

        // 자식 오브젝트 정보 저장
        saveObject.childObj.isActive = obj.transform.GetChild(2).gameObject.activeSelf;
        saveObject.childObj.ActiveImage = obj.transform.GetChild(2).GetComponent<Image>().sprite;
        saveObject.childObj.test = obj.transform.GetChild(2).GetComponent<Image>().sprite.name;

        // json 형태로 변환
        string jsonData = JsonUtility.ToJson(saveObject);

        // 파일 스트림 생성
        FileStream fs = new FileStream(path, FileMode.Create);
        // 스트림에 json 데이터 쓰기
        StreamWriter sw = new StreamWriter(fs);
        sw.Write(jsonData);
        sw.Close();
        fs.Close();
    }
// Load
// 게임 오브젝트 불러오기
    public static GameObject Load(GameObject obj)
    {
        // 파일 이름
        string fileName = obj.name;
        // 경로
        string path = Application.dataPath + "/Saves/" + fileName + ".json";

        // 파일 스트림 생성
        FileStream fs = new FileStream(path, FileMode.Open);
        // 스트림에서 json 데이터 읽어오기
        StreamReader sr = new StreamReader(fs);
        string jsonData = sr.ReadToEnd();
        sr.Close();
        fs.Close();

        // json 데이터를 객체로 변환
        SaveObject saveObject = JsonUtility.FromJson<SaveObject>(jsonData);

        // 게임 오브젝트 정보 불러오기
        obj.transform.SetPositionAndRotation(saveObject.position, saveObject.rotation);
        obj.transform.localScale = saveObject.scale;
        obj.SetActive(saveObject.isActive);
        obj.name = saveObject.name;

        // 자식 오브젝트 정보 불러오기
        var childObj = obj.transform.GetChild(2);
        childObj.gameObject.SetActive(saveObject.childObj.isActive);
        childObj.GetComponent<Image>().sprite = saveObject.childObj.ActiveImage;

        return obj;
    }
728x90
반응형