본문 바로가기
유니티 Unity/유니티 기능 구현

[유니티] Json으로 저장 불러오기 구현하기 3 - Unity Save And Load

by TODAYCODE 2022. 2. 15.
반응형

해당 내용은 유튜브로도 볼 수 있습니다.

 


 

 

[유니티] Json으로 저장 불러오기 구현하기 2 - Unity Save And Load

해당 내용은 유튜브로도 볼 수 있습니다. [유니티] 저장 불러오기 구현하기 1 - Unity Save And Load 해당 내용은 유튜브 영상으로도 보실 수 있습니다. 오늘 해볼 것은 Json을 활용해서 저장 불러오기를

coding-of-today.tistory.com

이전 글들을 다 보고왔다면 이번글은 마지막 3단계이다.

 

추가적으로 설명이 필요한 어려운 부분은 없다고 생각되고,

기존에 했던 방식의 연속이므로

만약 이해가 안되는 부분이 있다면 유튜브 영상을 참고하면 충분히 이해할 수 있을 것이다.

 

아래는 최종적으로 완성된 3가지 스크립의 전문이다.

만약 놓친 부분이 있거나한다면 아래의 스크립트를 참고하여 학습하도록 하자.

이해를 돕기 위하여 주석도 자세하게 달았으니 도움이 되었으면 좋겠다.

 

 

Select 스크립트 전문

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using System.IO;

public class Select : MonoBehaviour
{
    public GameObject creat;	// 플레이어 닉네임 입력UI
    public Text[] slotText;		// 슬롯버튼 아래에 존재하는 Text들
    public Text newPlayerName;	// 새로 입력된 플레이어의 닉네임

    bool[] savefile = new bool[3];	// 세이브파일 존재유무 저장

    void Start()
    {
        // 슬롯별로 저장된 데이터가 존재하는지 판단.
        for (int i = 0; i < 3; i++)
        {
            if (File.Exists(DataManager.instance.path + $"{i}"))	// 데이터가 있는 경우
            {
                savefile[i] = true;			// 해당 슬롯 번호의 bool배열 true로 변환
                DataManager.instance.nowSlot = i;	// 선택한 슬롯 번호 저장
                DataManager.instance.LoadData();	// 해당 슬롯 데이터 불러옴
                slotText[i].text = DataManager.instance.nowPlayer.name;	// 버튼에 닉네임 표시
            }
            else	// 데이터가 없는 경우
            {
                slotText[i].text = "비어있음";
            }
        }
        // 불러온 데이터를 초기화시킴.(버튼에 닉네임을 표현하기위함이었기 때문)
        DataManager.instance.DataClear();	
    }

    public void Slot(int number)	// 슬롯의 기능 구현
    {
        DataManager.instance.nowSlot = number;	// 슬롯의 번호를 슬롯번호로 입력함.

        if (savefile[number])	// bool 배열에서 현재 슬롯번호가 true라면 = 데이터 존재한다는 뜻
        {
            DataManager.instance.LoadData();	// 데이터를 로드하고
            GoGame();	// 게임씬으로 이동
        }
        else	// bool 배열에서 현재 슬롯번호가 false라면 데이터가 없다는 뜻
        {
            Creat();	// 플레이어 닉네임 입력 UI 활성화
        }
    }

    public void Creat()	// 플레이어 닉네임 입력 UI를 활성화하는 메소드
    {
        creat.gameObject.SetActive(true);
    }

    public void GoGame()	// 게임씬으로 이동
    {
        if (!savefile[DataManager.instance.nowSlot])	// 현재 슬롯번호의 데이터가 없다면
        {
            DataManager.instance.nowPlayer.name = newPlayerName.text; // 입력한 이름을 복사해옴
            DataManager.instance.SaveData(); // 현재 정보를 저장함.
        }
        SceneManager.LoadScene(1); // 게임씬으로 이동
    }
}

 

DataManager 스크립트 전문

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;

public class PlayerData
{
    // 이름, 레벨, 코인, 착용중인 무기
    public string name;
    public int level = 1;
    public int coin = 100;
    public int item = -1;
}

public class DataManager : MonoBehaviour
{
    public static DataManager instance; // 싱글톤패턴

    public PlayerData nowPlayer = new PlayerData(); // 플레이어 데이터 생성

    public string path; // 경로
    public int nowSlot; // 현재 슬롯번호

    private void Awake()
    {
        #region 싱글톤
        if (instance == null)
        {
            instance = this;
        }
        else if (instance != this)
        {
            Destroy(instance.gameObject);
        }
        DontDestroyOnLoad(this.gameObject);
        #endregion

        path = Application.persistentDataPath + "/save";	// 경로 지정
        print(path);
    }

    public void SaveData()
    {
        string data = JsonUtility.ToJson(nowPlayer);
        File.WriteAllText(path+ nowSlot.ToString(), data);
    }

    public void LoadData()
    {
        string data = File.ReadAllText(path + nowSlot.ToString());
        nowPlayer = JsonUtility.FromJson<PlayerData>(data);
    }

    public void DataClear()
    {
        nowSlot = -1;
        nowPlayer = new PlayerData();
    }
}

 

Game 스크립트 전문

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Game : MonoBehaviour
{
	public Text name;
    public Text level;
    public Text coin;
    
    public GameObject[] item;
    
    void Start()
    {
    	name.text += DataManager.instance.nowPlayer.name;
        level.text += DataManager.instance.nowPlayer.level.ToString();
        coin.text += DataManager.instance.nowPlayer.coin.ToString();
        ItemSetting(DataManager.instance.nowPlayer.item);
    }
    
    public void LevelUp()
    {
    	DataManager.instance.nowPlayer.level++;
        level.text = "레벨 : " + DataManager.instance.nowPlayer.level.ToString();
    }
    
    public void CoinUp()
    {
    	DataManager.instance.nowPlayer.coin++;
    	coin.text = "코인 : " + DataManager.instance.nowPlayer.coin.ToString();
    }
    
    public void Save()
    {
    	DataManager.instance.SaveData();
    }
    
    public void ItemSetting(int number)
    {
    	for(int i = 0; i < item.Length; i++)
        {
        	if(number == i)
            {
            	item[i].SetActive(true);
                DataManager.instance.nowPlayer.item = number;
            }
            else
            {
            	item[i].SetActive(false);
            }
        }
    }

}
반응형

댓글