Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

zyeon's 작심삼일 코딩 공부

대화·퀘스트 시스템 - (2) 대화문 저장 본문

unity

대화·퀘스트 시스템 - (2) 대화문 저장

젼뀨 2024. 9. 12. 20:58

출력할 대화문 목록은 미리 스크립트에서 저장해야한다.

 

전부 [DialogueData.cs]에서 작성된 코드들이다.

/* DialogueData.cs */
Dictionary<int, string[]> m_dialogData;

private void Awake()
{
    GenerateData();
}

void GenerateData()
{
    m_dialogData = new Dictionary<int, string[]>();

    //대화 data
    m_dialogData.Add(1000, new string[] { "안녕, 가디언!" });
    m_dialogData.Add(2000, new string[] { "신입, 검술 연습은 잘 하고있어?" });

    //퀘스트 data
    m_dialogData.Add(1000 + 10, new string[] { "...어떻게 하면 좋지..." });
    m_dialogData.Add(1000 + 11, new string[] { "...아! 가디언! 잘지냈어?",
                                               "저기, 있잖아.... 사실 곧 언니의 생일이라 \n반짝반짝 이쁜 별을 주고싶은데...",
                                               });
    /* 이하 생략... */
}

데이터 검색이 빠른 딕셔너리를 사용해 주어 저장해준다.

int 타입 키는 대화문을 식별해주고, string[]은 대화문을 저장해 줄 문자열 배열이다.

 

1000, 2000 과 같은 수는 npc의 id이고, 나중에 id로 구분지어 각 npc에 맞는 대화문을 출력하게 된다.

퀘스트와 관련된 대화문은 (1000 + 10) 과같이 (npc id + quest id) 와 같은 형태로 구분해준다.

 

/* DialogueData.cs */
public string GetDialogue(int id, int dialogIdx)
{
    if (!m_dialogData.ContainsKey(id))
    {
        if (!m_dialogData.ContainsKey(id - id % 10))
            return GetDialogue(id - id % 100, dialogIdx);
        else 
            return GetDialogue(id - id % 10, dialogIdx);
    }

    if (dialogIdx == m_dialogData[id].Length) return null;
    return m_dialogData[id][dialogIdx];
}

id와 대화 인덱스에 따라 내용을 반환해주는 함수이다.

대화 인덱스가 현재 대화 배열의 길이와 같다면 대화가 끝난 것 이므로 null을 반환해준다.

 

id의 존재 여부를 확인한 후 존재하지 않으면 id - id % 100 또는 id - id % 100 으로

id를 줄여가며 상위 id에 해당하는 대화를 탐색해준다. 

이는 퀘스트 진행 시 예외가 발생할 수 있기 때문에 이러한 처리를 해준다.

 

/* DalogueData.cs */
public void ChangeDialogueText(int id, string[] str) 
{
    if (m_dialogData.ContainsKey(id))
        m_dialogData.Remove(id);
    m_dialogData.Add(id, str);
}

특정 상황이나 퀘스트의 상태에 따라 대화 내용이 변경되어야 할 때

특정 id의 대화문을 지우고 다시 생성해주는 함수이다.