인프런 커뮤니티 질문&답변

tmdgur0147님의 프로필 이미지

작성한 질문수

[유니티 레벨 업!] 모듈식으로 개발하는 스킬 시스템

이런 스킬시스템을 저장하는 방법

해결된 질문

24.07.26 20:32 작성

·

76

0

 

강의 모두 잘들었습니다.

공부한 내용을 바탕으로 스킬시스템을 넣은 게임을 만드려고 합니다. 추가로 파이어베이스의 리얼타임 데이터베이스까지 사용해서 세이브/로드 기능도 구현하려고 하는데, 이때 Json으로 저장하는 부분에서 어려움을 느끼고 있습니다.

 

우선 제가 알고있는 수준은

string json = JsonUtility.ToJson(player); 같이 ToJson으로 변환해서 저장하는 정도입니다. 다만 이 방법으로는 int,string,float 같은 기본 자료형만 저장이 가능한데, 이때 Entity가 들고있는 저장해야하는 데이터들. 여기서는 SkillSystem과 Stats도 저장에 포함되어야겠죠 스탯과 스킬이니깐. 이런 것들은 어떤식으로 저장을 구현하는지 마땅히 떠오르지 않습니다..

멀티 게임은 아니고 싱글게임에 서버만 입혀주는 정도기 때문에 Player(강의의 Entity)의 다양한 데이터를 저장하는 방법을 알아야 하는데, 이 강의에서 나오는 현재 플레이어가 보유한 스탯,스킬의 정보는 어떤식으로 저장을 해야하나요? 최대한 쉽게.. 알려주시면 정말 너무 감사하겠습니다 ㅠㅠ 어려워요..

답변 1

0

Developer G님의 프로필 이미지
Developer G
지식공유자

2024. 07. 26. 21:23

수강해주셔서 감사합니다.

Entity를 통채로 저장하고 싶다면 JsonUtility가 아닌 NewtonJson으로 Entity에 대한 JsonConverter를 직접 작성해주시는게 편하구요, 좀 더 쉽게는 IdentifiedObject가 자신의 정보를 담은 JObject를 만들어서 return해주고(Save), 나중에 그 JObject를 다시 받아서 Load해주시면 됩니다.

가장 쉽게는 아예 Save용 struct를 따로 만드는 것입니다.
예시 Code는 아래와 같습니다.

Stat.cs
[System.Serializable]
public struct StatSaveData
{
public int id;
public int defaultValue;
}

public StatSaveData ToSaveData()
=> new StatSaveData { id = ID, defaultValue = defaultValue };

public void FromSaveData(StatSaveData saveData)

=> defaultValue = saveData.defaultValue;

Entity.cs
[System.Serializable]
public struct EntitySaveData
{
public StatSaveData[] statSaveDatas;
// 그 외 다른 SaveData들
}

public string ToSaveData()

{
var saveData = new EntitySaveData();
saveData .statSaveDatas = Stats.All.Select(x => x.ToSaveData()).ToArray();
// 나머지도 Save

return JsonUtility.ToJson(saveData);
}

public void void FromSaveData(string json)
{
var saveData = JsonUtility.FromJson<EntitySaveData>(json);
foreach (var statSaveData in saveData.statSaveDatas)
stats.GetStat(statSaveData.id).FromSaveData(statSaveData);
// 나머지 작업들
}

이럼 이제 다음과 같이 Database에 Save하고 Load 할 수 있습니다.

Save
var saveData = entity.ToSaveData();
mDatabaseRef.Child("users").Child(userId).SetRawJsonValueAsync(saveData);

Load
// Firebase Load
entity.FromSaveData(loadedJson);

감사합니다.

tmdgur0147님의 프로필 이미지
tmdgur0147
질문자

2024. 07. 27. 11:33

와 진짜 너무 감사합니다.. 일단 제시해주신 가장 쉬운 방법으로 구현부터 해보고 천천히 업그레이드 해보겠습니다.

수업 외의 내용인데도 예시 코드까지 너무 상세하게 알려주셔서 감사합니다.