오늘 한 일
QuestManager가 퀘스트 데이터를 관리하고 →
UI는 QuestManager를 참조해서 목록을 만들고 →
QuestItem은 클릭 이벤트만 담당한다
스크립트 구조
핵심 스크립트 구조도
GameManager
└── QuestManager
├── QuestData (메인/서브 퀘스트 데이터)
├── CurrentQuest
└── QuestUIController
├── QuestListUI
│ └── QuestItem (프리팹)
└── QuestDetailUI
스크립트별 역할 정리
GameManager
역할
게임 전체에서 공유되는 매니저들의 “최상위 컨트롤러”
QuestManager, Player, UIManager 등 공통 시스템을 보유
중요 포인트
DontDestroyOnLoad
다른 매니저들이 참조하기 전에 가장 먼저 초기화
GameManager.Instance.QuestManager
QuestManager를 직접 생성하지 않고, GameManager를 통해 접근
QuestManager (핵심)
역할
퀘스트의 실제 데이터와 상태를 관리
현재 진행 중인 퀘스트
퀘스트 수락 / 완료 / 갱신 처리
가지고 있는 것
메인 퀘스트 목록
현재 선택된 퀘스트
UI에 전달할 퀘스트 정보
절대 UI를 직접 제어하지 않음
→ 데이터만 제공
QuestUIController
역할
I 키 입력으로 퀘스트 UI 열고 닫기
QuestManager로부터 퀘스트 데이터를 받아 UI에 전달
UI 제어 전담 스크립트
데이터 생성 x
로직 판단 x
“보여주기만 함”
QuestListUI
역할
퀘스트 목록을 동적으로 생성
퀘스트 개수만큼 QuestItem 프리팹 생성
foreach (QuestData quest in questList)
{
Instantiate(questItemPrefab);
}
퀘스트가 늘어나도 코드 수정 없이 자동 대응 가능
QuestItem (프리팹 스크립트)
역할
퀘스트 하나를 표현하는 UI 버튼
클릭 이벤트만 담당
public void OnClick()
{
QuestUIController.ShowQuestDetail(questData);
}
절대 퀘스트 로직을 처리하지 않음
상태 변경 x
완료 처리 x
QuestDetailUI
역할
선택된 퀘스트의 상세 정보 표시
이름
목표
설명
questNameText.text = quest.title;
questDescText.text = quest.description;
단방향 구조
QuestItem → QuestDetailUI
데이터는 QuestManager 기준
퀘스트 생성 & 표시 순서 (중요)
게임 시작 시
GameManager Awake
QuestManager Awake
메인 퀘스트 데이터 로드
UI는 아직 표시 x
I 키 입력 시
QuestUIController → UI 활성화
QuestManager에게 퀘스트 목록 요청
QuestListUI가 QuestItem 프리팹 생성
Main 퀘스트 “방랑자” 표시
퀘스트 클릭 시
QuestItem 클릭
QuestDetailUI 호출
QuestManager의 데이터 기반으로
퀘스트 이름
목표
설명 표시
이 구조의 장점 (벨로그 포인트)
✔ 퀘스트 데이터와 UI 완전 분리
✔ 퀘스트 수 증가해도 구조 변경 없음
✔ 추후 NPC / 트리거 / 조건 시스템 연결 쉬움
✔ 디버깅 시 “문제 위치”가 명확함
다음 확장 시 자연스럽게 붙는 구조
NPCQuestGiver → QuestManager.AddQuest()
QuestConditionChecker
QuestProgressTracker
JSON / ScriptableObject 기반 퀘스트 데이터