03/13 본캠프 #55

guno park·2024년 3월 13일
0

본캠프

목록 보기
55/77

최종 프로젝트

Dialouge 시스템 구성하기

어제에 이어 어느정도 시스템 구상이 완료되어 각 기능별로 스크립트를 분류하여주었다.

Datas.cs

데이터 저장을 위한 정보들 (json 변환에 필요한 클래스들)을 모아놓는 NameSpace로 사용한다.

DataManager.cs

어느 시점에 동작하는 지는 아직 정하지 않았지만, 세이브 파일의 존재 여부에 따라 새로 세팅하거나 기존의 데이터를 읽어오는 동작을 수행한다.
또한 싱글턴으로 만들어서 데이터는 모두 이곳에 저장되고 읽을 때도 이곳에서 읽는 저장소 역할을 수행할 것이다.

자료구조

주로 사용되는 자료구조는 딕셔너리를 선택했다. List나 Array는 특정 값을 찾기 위해 반복문을 사용해야 하는 경우가 많으나, Dictionary는 Key값을 입력하면 해당 Value를 곧장 찾을 수 있기때문에 사용했다.

그리하여 최초 세팅의 경우 List로 작성된 Json데이터들을 Dictionary로 만들어주는 과정을 거쳐야하며, Save할 때 완성되고 값이 변경된 Dictionary를 그대로 저장, Load할 때도 그대로 Load하여 세팅하는 메모리를 절약할 수 있다.

JsonUtility VS JsonConvert

JsonUtility의 경우 유니티에서 기본 제공하는 패키지로, 유니티에 존재하는 Vector, Position 같은 데이터도 json으로 저장할 수 있게 해준다.
하지만 Dictionary 같은 C#의 기본 인터페이스는 지원하지 않더라.

다른 팀원분이 Utility로 작성을 많이 하셔서 그에 맞추려 했지만, json 사용의 지향하는 방향이 다르므로 JsonConvert를 다시 사용하기로 하였다.

DialogueManager.cs

현재 실험하는 상황에 맞추어서 세팅되어있긴 하지만, 기본적인 흐름은 맞추어놓은 상태이다.

StartDialogue

 contextcount = CheckQuest(targetname);
        if (contextcount == 0)
        {
            Debug.Log("대화가 없습니다.");
        }
        else //대화 가능
        {
            confirmbtn.gameObject.SetActive(true);
            btn3.gameObject.SetActive(false);
            NormalLog();    
        }

시작할 대화의 주소를 받아오고, 대화 시작 시 UI를 관리한다.

CheckQuest

대화 시작 주소를 반환하는 메서드로, 해당 타겟의 퀘스트 정보를 순서대로 탐색하여 선행해야할 퀘스트, 필요한 아이템들을 검사하여 출력 가능한 퀘스트가 있다면 그 퀘스트의 대화 시작 주소를 반환한다.

선행 퀘스트, 아이템이 부족할 시 else로 에러 대화를 출력한다.

ConfirmBtnClick

AddListener로 구독된 메서드로, 확인 버튼 클릭 시 동작한다.
주요 동작으로는 대화 주소가 존재할 시 현재 대화의 type을 분류하여 그에 맞는 동작을 취한다.
대화 주소가 존재하지 않는다면 대화가 종료된 것으로 판단하며 Quest의 상태를 완료 상태로 바꾸며 대화와 관련된 UI를 종료한다.

Log Typer

Koreans Typer 에셋을 사용하기위해 작성된 코루틴이다.

 IEnumerator LogTyper()
    {
        _textMeshProUGUI.text = "";
        btn1.enabled = false;
        btn2.enabled = false;
        confirmbtn.enabled = false;
        Dialogue_Data dialogueData = DataManager.instance.dic.DialogueDic[contextcount];

        int strTypingLength = dialogueData.Log.GetTypingLength();
        for (int i = 0; i <= strTypingLength; i++)
        {
            _textMeshProUGUI.text = dialogueData.Log.Typing(i);
            yield return typerWaitTime;
        }

        bool check = int.TryParse(dialogueData.Next_Log, out contextcount);
       
        btn1.enabled = true;
        btn2.enabled = true;
        confirmbtn.enabled = true;  
    }

코루틴이 동작하는 동안 다른 버튼 기능을 잠궈서 에러가 발생하지 못하도록 예외처리를 해두었다.

엑셀 시트의 데이터를 int로 하여 역직렬화 할 때 비어있으면 역직렬화가 되지않는 에러가 있어서, string으로 작성하고 int.Parse하고 있었는데,

그냥 int로 하고 다음 대화가 없으면 주소를 0으로 해도 되지 않을까? 라는 생각이 갑자기 든다.

공통사항

  • 자료구조가 Dictionary 안에 List가 들어있는 모양이다보니, 똑같은 이름을 계속 사용하게 되어서 캐싱을 잘 열심히 해주어야 한다.

  • 중요한 것부터 생각해야한다. 시스템 구상하고 구성하고 동작하는 일련의 과정이 현재 최우선 사항이므로, 이 구조를 사용하기 위한 어떠한 방향을 구상하는 것은 이 다음의 일이여야 한다.

0개의 댓글