해당 내용은 유튜브로도 볼 수 있습니다.
이전 글에서 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();
}
}
여기까지 따라왔다면 이제 단순히 저장하고 불러오는 기능이 아니라
슬롯에 따라서 각각 데이터가 저장되고 알맞게 불러오는 기능까지 구현되었을 것이다.
이제 마지막으로 게임씬을 간단하게 만들어보고
게임 중에 변경사항이 발생할때 그 내용들이 제대로 저장되고 나중에 정상적으로 불러와지는 것도 만들어 볼 것이다.
'유니티 Unity > 유니티 기능 구현' 카테고리의 다른 글
[유니티] Json으로 저장 불러오기 구현하기 3 - Unity Save And Load (0) | 2022.03.09 |
---|---|
[유니티] Json으로 저장 불러오기 구현하기 3 - Unity Save And Load (0) | 2022.02.15 |
[유니티] Json으로 저장 불러오기 구현하기 1 - Unity Save And Load (1) | 2022.01.27 |
[유니티] 파일을 저장하거나 불러오는 방법 - System.IO.File (0) | 2022.01.25 |
[유니티] 초보자를 위한 제이슨을 사용하는 방법 (3) | 2022.01.15 |
댓글