오늘 한 일
Quest와 Dialogue간의 연결 구조가 어떻게 되어 있는지 알려드리겠습니다.
QuestID
├─ Quest 데이터 (JSON)
│ ├─ 퀘스트 타입 / 이름 / 설명
│ ├─ 완료 조건 (조건 타입 + 타겟 ID)
│ └─ 보상 정보
│
├─ NPCID
│ └─ 어떤 NPC가 퀘스트를 주거나 완료시키는지
│
├─ DialogueID
│ └─ 퀘스트 단계별 대화 흐름
│
└─ InteractID / TargetID
└─ 조사 오브젝트, 몬스터, 아이템 등
Quest
퀘스트 하나를 식별하는 유일한 키
UI, 진행 상태, 대화, 보상까지 전부 QuestID 기준
{
"QuestID": 30000,
"QuestType": "Main",
"QuestName": "난파된 방랑자",
"CompleteCondition": "Investigate",
"TargetID": 6000
}
현재 진행 상태 (Active / Completed / RewardClaimed)
퀘스트 트래커 표시 여부
퀘스트 상세 UI 내용
완료 처리 및 보상 지급
QuestState
Active // 진행 중
Completed // 조건 완료 (보상 미수령)
RewardClaimed // 보상 수령 완료
완료 ≠ 보상 수령
NPC에게 다시 말 걸어야 보상 받는 구조 구현 가능
메인 / 사이드 퀘스트 공통 처리 가능
CompleteCondition & TargetID
| 조건 타입 | TargetID 의미 |
|---|---|
| TalkToNPC | NPCID |
| Investigate | 조사 오브젝트 ID |
| KillMonster | 몬스터 ID |
| CollectItem | 아이템 ID |
퀘스트는 “무엇을 하면 완료되는가” 를 분리해서 관리한다.
Investigate 퀘스트 예시
QuestID = 30010
Condition = Investigate
TargetID = 6000
InvestigateInteractable에서
TargetID == 6000 조사 완료 → QuestManager에 알림 → 퀘스트 완료 처리
NPCID – 퀘스트의 시작점과 종료점
NPC는 퀘스트 로직을 직접 들고 있지 않다.
NPC
├─ NPCID
├─ 대화 트리거
└─ QuestManager에게 위임
현재 플레이어 퀘스트 상태 조회
상태에 맞는 DialogueID 요청
퀘스트 수락 / 완료 요청 전달
NPC는 “중계자” 역할
DialogueID – 퀘스트 단계별 대화 분기
대화도 QuestID와 분리된 독립 데이터
{
"DialogueID": "DLG_2002",
"SpeakerID": "100000",
"Text": "버섯 3개만 구해줄 수 있겠어?",
"NextID": "DLG_2003"
}
같은 NPC라도 퀘스트 단계별 대사 분기 가능
메인 / 사이드 퀘스트 혼합 가능
퀘스트가 늘어나도 NPC 스크립트 수정
QuestManager – 모든 ID를 연결하는 허브
QuestManager
├─ QuestID 기준 데이터 관리
├─ 상태 변경 처리
├─ UI 갱신 이벤트 호출
└─ Dialogue / NPC / Interact 연결
퀘스트 조건이 여러 시스템에서 발생
NPC 대화
조사 오브젝트
몬스터 사망
중복 로직 방지
세이브 / 로드 확장 쉬움