오늘 한 일

UI에서 중요했던 점은 플레이어가 상태 변화가 있을시에 Update()에서 하지않고,
명시적인 매서드를 만들어 필요한 UI만 갱신하는 구조로 하였습니다.
Update()에서 갱신을 처리하면, 매 프레임마다 계속 호출하면서 검사를 하기 때문에
불필요한 연산이 생기고 GC가 발생하여 최적화에 맞게 명시적 매서드를 만들어주었습니다.

Dialogue ( 대화 시스템 )은 데이터 기반으로 구조를 잡았습니다.
DialogueID를 키로 사용하는 DialogueTableLoader를 통해 모든 대화 데이터를 JSON으로 관리하며, 대화 전역을 관리하는 DialogueManager를 만들어서 텍스트와 흐름을 제어했습니다.
그 외 추가로 스크립트를 만들어 Dialogue에 몰입감을 높여주었습니다.

QuestManager를 중심으로 데이터, 이벤트 기반으로 설계를 했습니다.
Questmager가 전역 퀘스트를 관리하며, Quest Data Table은 Json기반으로 데이터를 저장하고, QuestProgress는 진행도를 관리합니다.
NPC, Monster, Object를 ID기반으로 이벤트 보고를 해서 결합도를 낮추며, 나머지 Tracker UI는 퀘스트 UI와 연동해주었습니다.

퀘스트의 세부적인 상태 및 ID 설계 구조입니다.
첫 번째로 진행상태를 분리해 주었는데 이것으로 퀘스트가 진행중인지, 보상 수령이 가능한지, 보상 수령을 완료 했는지로 나누어 주었습니다.
두 번째로 퀘스트 완료 조건을 타입으로 판단을 시켜 새로운 퀘스트 타입이 추가시에도 코드 수정이 최소화 되게 해주었습니다.
세 번째로 ID설계로 Quest ID는 퀘스트 구분 번호, NPC ID는 퀘스트를 주는 개체 식별, Target ID는 몬스터, 오브젝트, 조사 대상의 ID를 판단하며, Reward GroupID는 각각의 보상 ID, 마지막으로 Dialogue ID는 대화 시작시 어떤 대화를 시작할지의 ID입니다.
이로 인해 NPC 1명이 여러 퀘스트를 담당이 가능하며, 같은 몬스터를 여러 퀘스트에서 재사용 가능하게 해두었습니다.
퀘스트 판정 조건은 자신의 Id만 이벤트 발생시 보고하며 퀘스트 판단 여부는 QuestManager.cs에서 관리를 시켰습니다.
최종흐름으로 보면 Player가 NPC에게 Interactable을 하면 NPC ID를 확인하고 Quest 진행상태 확인 후에 어떤 대화를 할지 Dialogue ID를 결정, Quest를 지급해주는 구조 입니다.

컷씬 연출의 구조 방식 입니다.
컷씬 존에 트리거 될 시에 기존 플레이어는 텔레포트 시켜서 입력을 잠그고, 스크립트를 전부 뺀 컷씬 전용 프리팹을 만들어 연출에 사용을 했습니다.
카메라도 컷씬 전용 카메라를 만들어 Late Update()로 연출을 사용하고, 컷씬 종료시에 실제 플레이어를 다시 소환 시키고, 입력을 정상화 시켰습니다.
초기에는 기존 플레이어를 강제 이동시켜서 컷씬에 사용했으나 제어할 기능들이 많아서 컷씬전용 프리팹을 사용해 더 쉽고 맞는 구조로 변경을 했습니다.