오늘 Json에서 발견한 점
메서드 위에 [ContextMenu("To Json Data")]를 붙이는 것은
컴포넌트 옵션에 To Json Data가 추가된 것이다.
[ContextMenu("To Json Data")]
public void SaveData()
{
var json = JsonUtility.ToJson(data);
Debug.Log(Application.persistentDataPath);
File.WriteAllText(Application.persistentDataPath + "/UserData.txt", json);
}
이 스크립트를 작성하고 컴포넌트에 붙이면
컴포넌트 메뉴에 나왔다. 이 기능은 Json파일을 유니티 에셋에 수동으로 저장하게 된다.
에디터를 실행한 상태에서 Json으로 저장하는 함수로 들어갔을 때 에셋창에 파일이 보이지 않는다면 To Json Data로 저장한 파일을 보여주게 한다. 활용도는 크지 않지만 에디터 창에 안보인다면, 그냥 Json파일만 생성하고 meta파일이 같이 생성되지 않아서 그런 것이다.
결론적으로 To Json Data가 meta파일 생성으로 인해 에셋에서 보여지는 것이다. (저장경로를 에셋 내에서 지정할 경우)
그리고 JSON형태로 SO파일을 생성하고 불러오고 싶다면 어떻게 할까?
Data클래스 안에 SO변수를 public으로 걸어준 뒤에 저장한 SO를 가져와서 안에 아무 데이터를 접근할 수 있다.
글로 설명하기 힘드니 코드로 보여주자면
using UnityEngine;
using System.IO;
using System.Collections.Generic;
using System;
using UnityEngine.SceneManagement;
public class DataManager : Singleton<DataManager>
{
public UserData saveData;
private string savePath = Path.Combine(Application.dataPath, "Data.json"); //저장경로
public EquippableItemData[] equipItems; //데이터를 로드할때
private void Awake()
{
if (_componentInstance == null)
_componentInstance = DataManager.Instance;
else
Destroy(gameObject);
DontDestroyOnLoad(gameObject);
}
private void Start()
{
...
CheckLoadData();
}
private void CheckLoadData()
{
if (GameManager.Instance.IsLoadData)
{
Debug.Log("데이터 로드");
LoadData();
}
}
private void SavePlayerProperties()
{
//플레이어
...
//인벤토리
saveData.Inventory.Clear();
foreach (EquippableItemData data in _inventory.GetItems())
{
if(data != null)
saveData.Inventory.Add(new UserItemData(data.itemName, (int)data.type));
}
}
private void LoadPlayerProperties()
{
//플레이어
...
//인벤토리
foreach(UserItemData data in saveData.Inventory)
{
//불러온 데이터가 조건문에 일치하면 equipItem을 추가
if(data.Name == "고추")
{
_inventory.AddItem(equipItems[1]);
}
else if(data.Name == "버섯")
{
_inventory.AddItem(equipItems[0]);
}
}
}
public void SaveData()
{
SavePlayerProperties();
var json = JsonUtility.ToJson(saveData, true);
File.WriteAllText(savePath, json);
}
public void LoadData()
{
try
{
var json = File.ReadAllText(savePath);
saveData = JsonUtility.FromJson<UserData>(json);
LoadPlayerProperties();
}
catch
{
...
}
OnDataLoad?.Invoke();
}
}
[System.Serializable]
public class UserData
{
//위치
...
//플레이어 속성
...
//인벤토리
[Header("Player Inventory")]
public List<UserItemData> Inventory;
}
[System.Serializable]
public class UserItemData
{
public string Name;
public int ItemType; //0:Jump, 1:Speed
public UserItemData(string name, int itemType)
{
Name = name;
ItemType = itemType;
}
}
마지막 클래스에서 Name과 ItemType을 지정하고 생성자로 전달하여 UserData의 Inventory로 저장하게 하였다.
컴포넌트에 적용하고 Equip Items에 해당 SO를 넣으면 LoadPlayerProperties()함수 안에서 지정한 SO데이터를 플레이어의 인벤토리로 넣을 수 있다.
전체 스크립트
by 스파르타 코딩클럽
'개발 TIL' 카테고리의 다른 글
6/12 부트캠프 개발 TIL (Switch식) (0) | 2024.06.13 |
---|---|
6/11 부트캠프 개발 TIL (파티클) (1) | 2024.06.12 |
6/7 부트캠프 개발 TIL (자료구조) (1) | 2024.06.07 |
6/5 부트캠프 개발 TIL (발판 이동 구현) (1) | 2024.06.05 |
6/4 부트캠프 개발 TIL (플레이어와 발판 상호작용) (0) | 2024.06.04 |