inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

Quest System 구현

퀘스트 누적 클리어 횟수에 대해 여쭤보고싶습니다.

85

고우진

작성한 질문수 26

0

퀘스트 시스템에 같은 코드네임의 퀘스트의 누적 클리어 횟수를 넣어주려고 하는데 어떻게 해야할까요 저장할때 가져오는 퀘스트는 클론이라 퀘스트에 정수 변수를 만든다음 추가하는 방식이 불가능하고
퀘스트가 저장될때마다
private JArray CreateSaveDatas(IReadOnlyList<Quest> quests, string key)

{

// 기존 데이터 로드

JArray saveDatas = LoadExistingSaveData(key); // 기존 세이브 파일에서 JArray 로드

foreach (var quest in quests)

{

Debug.Log("before " + quest);

if (quest.IsSaveable)

{

Debug.Log("after " +quest);

QuestSaveData saveData = quest.ToSaveData();

// 기존 데이터에서 같은 codeName 찾기

var existingData = saveDatas.FirstOrDefault(item =>

item["codeName"]?.ToString() == saveData.codeName);

// 누적 퀘스트 카운트 계산

saveData.questClearCount = GetQuestClearCount(saveDatas, quest.CodeName);

if (existingData != null)

{

saveData.questClearCount++;

// 기존 데이터 갱신

existingData["questClearCount"] = saveData.questClearCount;

}

else

{

// 새 데이터 추가

Debug.Log("처음");

saveDatas.Add(JObject.FromObject(saveData));

}

// 현재 퀘스트의 카운트 업데이트

quest.questClearCount = saveData.questClearCount;

}

}

return saveDatas;

}
private JArray LoadExistingSaveData(string key)

{

if (File.Exists(saveFilePath))

{

// 파일에서 JSON 데이터를 읽어옵니다.

string jsonString = File.ReadAllText(saveFilePath);

var root = JObject.Parse(jsonString);

// 저장된 특정 경로 데이터(JArray)를 반환

if (root[key] != null)

{

return (JArray)root[key];

}

}

// 기존 파일이 없거나 해당 키가 없으면 빈 JArray 반환

return new JArray();

}

private int GetQuestClearCount(JArray saveDatas, string codeName)

{

// JArray에서 해당 codeName을 가진 항목 찾기

var questData = saveDatas.FirstOrDefault(item => item["codeName"]?.ToString() == codeName);

// 항목이 존재하고 "questClearCount"가 있을 경우 반환

if (questData != null && questData["questClearCount"] != null)

{

return (int)questData["questClearCount"];

}

// 항목이 없거나 "questClearCount"가 없는 경우 기본값 반환

Debug.LogWarning($"Quest with codeName '{codeName}' not found or questClearCount is missing.");

return 0;

}기존의 세이브파일에서 참조해서 추가하는 방식으로는 다른요소로 저장할때마다도 추가가 됩니다.
계속 어떻게 수정해야할지 고민중이긴한데 어떻게 해야할지 모르겠습니다.
저장할 퀘스트의 id를 퀘스트DB에 있는 id와 비교해서 원본 퀘스트를 찾은 다음 그 퀘스트를 가져와서 원본 퀘스트의 변수를 수정해주는 방식이 좋을까요

unity

답변 1

0

Developer G

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

Quest에 completedCount 변수를 만드시고, 저장 Data를 만드는 ToSaveData 함수에서 QuestSaveData를 만들 때 함께 기록해줍니다.

return new QuestSaveData
{
    codeName = codeName,
    state = State,
    taskGroupIndex = currentTaskGroupIndex,
    taskSuccessCounts = CurrentTaskGroup.Tasks.Select(x => x.CurrentSuccess).ToArray(),
    completedCount = completedCount;
};


저장 Data를 불러오는 LoadFrom 함수에서는 저장했던 completedCount를 가져옵니다.
completedCount = saveData.completedCount;

Quest 완료 시 QuestSystem의 completedQuests 목록에 같은 ID의 Quest가 존재한다면 그 Quest의 completedCount를 1 증가시켜주고, 완료한 Quest는 보관하지 않고 Destroy로 부숩니다.

이러면 QuestSystem이 completedQuests를 저장할 때 Quest들의 completedCount가 같이 저장되고(ToSaveData 함수를 사용해 저장함으로), 불러올 때 completedCount도 같이 불러와집니다.(LoadFrom 함수를 사용해 정보를 불러옴으로)

또한 강의의 QuestSystem은 기본적으로 완료한 Quest는 무조건 completedQuests 목록에 보관하므로 따로 수정하지 않으셨다면 completedQuests에 특정 ID를 가진 Quest가 몇 개 있는지 확인하여 누적 클리어 횟수를 확인할 수 있습니다.

감사합니다.

Task 구현 28:36 Equals 에서 잘 모르는 부분이 있습니다.

0

21

2

Quest System의 확장성에 대한 질문

0

106

1

공부 방향에 대해 궁금한 점이 있습니다.

0

141

2

End()와 Complete() 함수를 따로 구현한 의도

0

165

2

Target의 value에 Object 자료형 관련 질문입니다!

0

149

2

TaskGroupState에 대하여 질문이 있습니다

0

111

2

Elite와 Normal Germ의 IsTarget()질문입니다.

0

99

2

퀘스트 시스템을 확장하면서 생긴 의문점 입니다.

0

166

2

퀘스트 클리어해도 동일 퀘스트가 노출됩니다

1

129

3

프로퍼티 사용 질문입니다.

0

117

1

Task 에서 Object 타입 사용

0

119

2

파일 저장방식, 퀘스트 실패에 관하여 여쭤보고싶습니다.

0

217

1

Destroy() 지연 파괴에 관하여

0

140

1

Action & Delegate

0

178

2

강의에서 리워드 관련 언급은 없으셔서 질문드립니다.

0

276

1

궁금한게있습니다

0

293

1

스크립터블 오브젝트 Instantiate?

0

436

1

원하는 타이밍에 퀘스트를 등록하고 싶다면 어떻게 해야할까요

0

339

1

Quest Cancel() 메소드

0

263

2

Task의 IsEqual

0

227

1

실전예제 UI 자료

0

194

1

스크립터블 오브젝트

1

325

1

Task 예시

1

167

1

퀘스트의 상태인 QuestState를 다른 스크립트에서 받을 수 있나요

1

306

2