퀘스트 누적 클리어 횟수에 대해 여쭤보고싶습니다.
85
작성한 질문수 26
퀘스트 시스템에 같은 코드네임의 퀘스트의 누적 클리어 횟수를 넣어주려고 하는데 어떻게 해야할까요 저장할때 가져오는 퀘스트는 클론이라 퀘스트에 정수 변수를 만든다음 추가하는 방식이 불가능하고
퀘스트가 저장될때마다
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와 비교해서 원본 퀘스트를 찾은 다음 그 퀘스트를 가져와서 원본 퀘스트의 변수를 수정해주는 방식이 좋을까요
답변 1
0
수강해주셔서 감사합니다.
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





