Inflearn brand logo image

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

coffeecat0213님의 프로필 이미지
coffeecat0213

작성한 질문수

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

스킬트리 저장 질문입니다

작성

·

93

0

플레이어가 스킬트리로 스킬을 찍은 후 다른 씬에서 다시 로드되면 찍은 스킬이 사라지고 스킬트리가 초기화 되어서
싱글톤 변수에 스킬트리 자체를 저장하고 로드할때 불러오는 방법을 사용할려고 했는데 잘 되지 않았습니다.
씬이 전환되면서 플레이어가 다시 생성될때에도 스킬트리 상태와 찍은 스킬을 유지하는 방법이 있을까요..

답변 2

0

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

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

첫번째 방법은 Entity를 DontDestroyObject로 만들어서 동일한 객체를 쭉 가져가는 것입니다.
Entity를 재설정하는 것이 번거로울 때 많이 쓰는 방식입니다.

두번째 방법은 Skill Tree는 현재 SkillSystem에 등록된 Skill들을 통해 자동으로 복원되므로 결국 SkillSystem을 Save, Load 해주기만 하면 됩니다.

SkillSystem을 저장하는 가장 간단한 방법은 json을 이용하는 것입니다.
1. 현재 등록된 Skill들의 ID, Level을 Json 형태로 만들어서 PlayerPrefs나 ES3 같은 Save Asset을 통해 저장.
2. 저장된 Data가 있을 때 기초 Setup 대신 Load를 진행. Resources.Load로 Skill Database를 불러와 저장했던 Skill들의 id로 Skill들을 찾아오고, Skill들을 SkillSystem에 등록한 뒤, 등록된 Skill들의 Level을 저장했던 Level로 설정해주면 됩니다.

Save는 간략히 다음과 같은 형식으로 만들 수 있을거구요,
var root = new JObect();
var array = new JArray();
foreach (var skill in ownedSkills)
{
// skill의 정보를 Json 형태로 만들어 Json 배열에 기록
var skillData = new JObject();
skillData["id"] = skill.ID;
skillData["level"] = skill.Level;
array.Add(skillData);
}
root["skills"] = array;
PlayerPrefs.SetString("playerSkills", root.ToString());

Load는 간략히 다음과 같이 만들 수 있을겁니다.
string savedData = PlayerPrefs.GetString("playerSkills", null);
if (savedData == null)
// 기초 Setup
else
var root = JObject.Parse(savedData);
var array = root["skills"].Value<JArray>();
var database = Resources.Load<IODatabase>(path);

foreach (JToken token in array)
{
// 저장했던 Json Data를 통해 Database에서 Skill을 찾고, SkillSystem에 등록한 뒤 Level을 복원.
var skillData = token.Value<JObject>();
var id = skillData["id"].Value<int>();
var level = skillData["level"].Value<int>();
var skill = database.datas.Select(x => x.ID == id);
var registeredSkill = Register(skill);
registeredSkill.Level = level;
}

만약 Data를 저장할 필요까지는 없다면, 꼭 Json을 안써도 Skill들의 ID와 Level을 변수로 어딘가에 기록해두고 복원해주기만하면 됩니다.

둘 중 편한 방식을 골라 사용하시면 될 것 같습니다.

(P.S: 오래되서 저도 잊었는데 참고하실만한 비슷한 질문이 있었네요. https://inf.run/4XAay)

감사합니다.

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

감사합니다! 막연하게 스킬트리 자체만 생각했네요

0

안녕하세요, 인프런 AI 인턴입니다.

coffeecat0213님께서 겪고 계신 문제는 스킬트리의 상태가 씬 전환 시 초기화되는 상황으로 보입니다. 이는 흔히 발생하는 문제로, 씬 전환 시 오브젝트나 데이터의 지속성을 유지하지 못할 때 발생합니다. 이러한 문제를 해결하기 위해, 다음과 같은 방법을 사용할 수 있습니다.

  1. Singleton 패턴 사용: 스킬트리 상태를 관리하는 Singleton 오브젝트를 만들어 씬 전환 시에도 파괴되지 않도록 할 수 있습니다. 유니티에서는 DontDestroyOnLoad 메서드를 사용하여 오브젝트가 다른 씬으로 전환될 때도 유지되도록 할 수 있습니다.

  2. 저장 및 로드 시스템: 스킬트리 상태를 JSON이나 다른 형식으로 저장한 후, 씬 전환 시 해당 데이터를 로드하여 상태를 복구하는 방식입니다. 이는 Firebase나 로컬 저장소를 통한 저장 기능을 사용하여 구현할 수 있습니다. 관련 이전 질문을 참조하시면 도움이 될 것입니다.

이런 스킬시스템을 저장하는 방법 - JSON을 사용한 데이터 저장 및 로드

해당 게시물에서 JsonUtility와 NewtonJson을 활용한 데이터 저장 방법과 Example Code가 제공되고 있으니 참고하면 좋겠습니다.

현재 구현하신 부분에서 잘 동작하지 않는다면, 위의 방법을 참고하여 다시 시도해 보시고, 추가적인 정보가 필요하시면 위 게시물을 참고하거나 질문을 남겨 주셔도 좋습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

coffeecat0213님의 프로필 이미지
coffeecat0213

작성한 질문수

질문하기