[Unity] 퀘스트 매니저 Json 추가

고현규·2024년 1월 17일
0
post-custom-banner

기존에 사용하려던 스크립터블 오브젝트를 제거하고 Json파일을 이용하여 데이터를 저장하는 방법으로 변경했습니다.

[System.Serializable]
public class QuestDataBase
{
    public int QuestIndex;
    public List<QuestData> QuestDB;
}

[System.Serializable]
public class QuestData
{
    public QuestType questType;
    public string questObjective;
    public int objectValue;
    public int currentValue;
    public bool isClear;
}

먼저 퀘스트 데이터를 저장할 QuestData 클래스와, 데이터를 리스트화할 QuestDataBase를 만들었습니다.

SaveData와 LoadData는 Json을 사용하는 방식대로 사용했다.

public class QuestManager
{
    private string QuestjsonPath = Application.dataPath + "/Scripts/Json/QuestDBTest.json";
    private string QuestjsonText;

    private QuestData _cuurntQuest;

    public QuestDataBase questDataBase;  

    public void SaveQuestDataBase()
    {
        string questJson = JsonUtility.ToJson(questDataBase, true);
        File.WriteAllText(QuestjsonPath, questJson);
        Debug.Log("퀘스트 데이터 베이스 저장 완료");
    }

    public void LoadQuestdataBase()
    {
        QuestjsonText = File.ReadAllText(QuestjsonPath);
        questDataBase = JsonUtility.FromJson<QuestDataBase>(QuestjsonText);
        Debug.Log("퀘스트 데이터 베이스 불러오기 완료");

        _cuurntQuest = questDataBase.QuestDB[1];
    }


    // 퀘스트 클리어 여부 확인
    public void CheckQuestCompletion()
    {
        // 임시. 목표 값보다 현재 달성 값이 클 때
        if(questDataBase.QuestDB[questDataBase.QuestIndex].objectValue < 
        	questDataBase.QuestDB[questDataBase.QuestIndex].currentValue)
        {
            questDataBase.QuestDB[questDataBase.QuestIndex].isClear = true;
        }
        else
        {
            questDataBase.QuestDB[questDataBase.QuestIndex].isClear = false;
        }
    }

    // 다음 퀘스트로 넘어가기
    public void NextQuest()
    {
        questDataBase.QuestIndex++;

        if (questDataBase.QuestIndex >= questDataBase.QuestDB.Count)
        {
            questDataBase.QuestIndex = 0;
        }
    }

    // 퀘스트 값 증가 
    public void QuestObjectiveValueUp()
    {
        _cuurntQuest.objectValue++;
    }

}

그 외의 내부 함수들은 일단 임시로 작성을 했다.
내부 index가 퀘스트 리스트를 초과하면 다시 첫번째 퀘스트로 돌아오는 반복 퀘스트이다.

클리어 현황을 업데이트 하는 부분을 구현하는 법이 가장 고민스럽다.
공격력을 올리거나, 체력을 올리거나 등 다양한 부분에서 값을 증가시켜야 한다.
또한, 퀘스트에 맞는 행동을 할 때마다가 아닌 해당 퀘스트를 진행중인지도 확인을 해야한다.
이런 조건들을 이용하는 방법은 아직 잘 떠오르지 않아 더 공부해야 겠다.

profile
게임 개발과 기획
post-custom-banner

0개의 댓글