인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

고우진님의 프로필 이미지
고우진

작성한 질문수

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

Quest System 구현

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

작성

·

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

Developer G님의 프로필 이미지
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가 몇 개 있는지 확인하여 누적 클리어 횟수를 확인할 수 있습니다.

감사합니다.

고우진님의 프로필 이미지
고우진

작성한 질문수

질문하기