작성
·
21
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와 비교해서 원본 퀘스트를 찾은 다음 그 퀘스트를 가져와서 원본 퀘스트의 변수를 수정해주는 방식이 좋을까요
답변 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가 몇 개 있는지 확인하여 누적 클리어 횟수를 확인할 수 있습니다.
감사합니다.