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

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

by TODAYCODE 2022. 2. 4.
반응형

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

 


 

 

 

[유니티] 저장 불러오기 구현하기 1 - Unity Save And Load

해당 내용은 유튜브 영상으로도 보실 수 있습니다. 오늘 해볼 것은 Json을 활용해서 저장 불러오기를 슬롯방식으로 구현해 볼 것이다. Json이 기본적으로 사용되기 때문에, 만약 아직 유니티에서 J

coding-of-today.tistory.com

이전 글에서 3단계를 통해서 구현하기로 했었다.

  • 1단계 - 데이터매니저 생성 및 구현
  • 2단계 - 저장할 슬롯 선택하는 기능 구현
  • 3단계 - 게임씬에서 불러온 정보 덮어쓰는 기능 구현

고로 이번에는 2단계인 슬롯 선택 기능을 구현해볼 것이다.

 


1. Select씬 구성하기

셀렉트씬을 간단하게 구성해보자.

Text와 Button UI 를 생성해서 위에 처럼 만들어줬다.

만약 저장된 데이터가 존재하는 경우라면

슬롯1, 슬롯2, 슬롯3 라는 문구 대신에 저장했던 플레이어의 이름이 뜨도록 할 것이다.

그리고 저장된 데이터가 없다면 비어있음이라고 뜰것이다.

 

여기서 저장된 데이터가 있는 슬롯을 클릭하면 곧장 로드를 한다음에 게임씬으로 넘어가면 되지만,

비어있는 슬롯을 클릭한다면 플레이어를 생성하는 과정이 필요하다.

고로, 이 기능을 수행할 UI도 만들어준다.

비어있는 슬롯을 클릭하면 위와 같은 UI가 뜨게 하기 위해서 만들어줬다.

해당 오브젝트는 비활성 상태로 변경한 뒤에 필요할때만 활성화 시켜주면 될 것이다.

 

2. 스크립트 작성 및 연결

자세한 코드 작성 과정과 연결 과정이 궁금하다면 맨 위에 링크로 올려둔 유튜브 영상을 참고하도록 하자.

크게 길거나 복잡한 코드는 아니지만, 부분부분 작성하다보니 글로써 설명하기가 조금 난해해졌다.

아래는 스크립트 전문이다.

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

 

 


 

여기까지 따라왔다면 이제 단순히 저장하고 불러오는 기능이 아니라

슬롯에 따라서 각각 데이터가 저장되고 알맞게 불러오는 기능까지 구현되었을 것이다.

이제 마지막으로 게임씬을 간단하게 만들어보고

게임 중에 변경사항이 발생할때 그 내용들이 제대로 저장되고 나중에 정상적으로 불러와지는 것도 만들어 볼 것이다.

 

 

반응형

댓글