zyeon's 작심삼일 코딩 공부
대화·퀘스트 시스템 - (2) 대화문 저장 본문
출력할 대화문 목록은 미리 스크립트에서 저장해야한다.
전부 [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의 대화문을 지우고 다시 생성해주는 함수이다.
'unity' 카테고리의 다른 글
대화·퀘스트 시스템 - (4) 퀘스트 (0) | 2024.09.12 |
---|---|
대화·퀘스트 시스템 - (3) 대화문 출력 (0) | 2024.09.12 |
대화·퀘스트 시스템 - (1) NPC 설정, 플레이어 레이캐스트 (4) | 2024.09.12 |
플레이어 상태, 상태 머신 (0) | 2024.09.12 |
2.5D 게임에서 캐릭터 이동 구현 (0) | 2024.08.28 |