코딩의 신 71

김동관·2026년 1월 15일

오늘 한 일

Quest와 Dialogue간의 연결 구조가 어떻게 되어 있는지 알려드리겠습니다.

QuestID
 ├─ Quest 데이터 (JSON)
 │   ├─ 퀘스트 타입 / 이름 / 설명
 │   ├─ 완료 조건 (조건 타입 + 타겟 ID)
 │   └─ 보상 정보
 │
 ├─ NPCID
 │   └─ 어떤 NPC가 퀘스트를 주거나 완료시키는지
 │
 ├─ DialogueID
 │   └─ 퀘스트 단계별 대화 흐름
 │
 └─ InteractID / TargetID
     └─ 조사 오브젝트, 몬스터, 아이템 등

Quest

QuestID – 퀘스트의 중심축

역할

퀘스트 하나를 식별하는 유일한 키

UI, 진행 상태, 대화, 보상까지 전부 QuestID 기준

{
  "QuestID": 30000,
  "QuestType": "Main",
  "QuestName": "난파된 방랑자",
  "CompleteCondition": "Investigate",
  "TargetID": 6000
}

QuestID로 관리되는 것

현재 진행 상태 (Active / Completed / RewardClaimed)

퀘스트 트래커 표시 여부

퀘스트 상세 UI 내용

완료 처리 및 보상 지급

QuestState

Active        // 진행 중
Completed     // 조건 완료 (보상 미수령)
RewardClaimed // 보상 수령 완료

구조 이유

완료 ≠ 보상 수령

NPC에게 다시 말 걸어야 보상 받는 구조 구현 가능

메인 / 사이드 퀘스트 공통 처리 가능

CompleteCondition & TargetID

조건 타입TargetID 의미
TalkToNPCNPCID
Investigate조사 오브젝트 ID
KillMonster몬스터 ID
CollectItem아이템 ID

퀘스트는 “무엇을 하면 완료되는가” 를 분리해서 관리한다.

Investigate 퀘스트 예시
QuestID = 30010
Condition = Investigate
TargetID = 6000

InvestigateInteractable에서
TargetID == 6000 조사 완료 → QuestManager에 알림 → 퀘스트 완료 처리

NPCID – 퀘스트의 시작점과 종료점

NPC는 퀘스트 로직을 직접 들고 있지 않다.

NPC
 ├─ NPCID
 ├─ 대화 트리거
 └─ QuestManager에게 위임

NPC가 하는 일

현재 플레이어 퀘스트 상태 조회

상태에 맞는 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 대화

조사 오브젝트

몬스터 사망

중복 로직 방지

세이브 / 로드 확장 쉬움

profile
아이디어 뱅크

0개의 댓글